ブログ AIと機械学習 GitLab Duo開発の現場から:AIを活用したセキュリティ脆弱性の修正
更新日:January 21, 2025
8分で読めます

GitLab Duo開発の現場から:AIを活用したセキュリティ脆弱性の修正

このチュートリアルでは、GitLab Duoの脆弱性の説明と脆弱性の修正、その他のAI搭載機能が、脆弱性に迅速に対処するのにどのように役立つのかをご説明します。

gitlab duo - new cover

新しい仕事を始めたばかりの初日、大規模な本番環境でのインシデントが発生し、全員での対応が求められる状況に直面したとします。いくつもの重大な脆弱性が新たに発覚し、即時の対応、分析、軽減、そして修正が必要です。こうした場合、どこから調査を始めるべきでしょうか?

この記事では、GitLab Duoの脆弱性の説明や脆弱性の修正、その他のAI機能を活用し、たった数分以内に脆弱性への対応を開始する方法を解説していきます。実践的な例を通じて、AI搭載のアシスト機能を活用して効果的に脆弱性を分析し、説明するアプローチを習得しましょう。追加の修正として、AIが生成したコード修正がMR(マージリクエスト)に示され、脆弱性の修正を迅速化します。

GitLab Duoの無料トライアルを始めて、脆弱性の修正機能を組織に取り入れてみませんか。

はじめ方:分析

最初のステップは、脆弱性の影響と重大度を分析することです。GitLabのUIを開き、セキュリティ > 脆弱性レポート の順に進み、メニューからVulnerability Report(脆弱性レポート)にアクセスします。脆弱性リストを SAST でフィルタリングし、対応を必要とする最も致命的な脆弱性を特定します。

脆弱性レポートの概要

SASTのスキャン結果は詳細ビューで要約され、ソースコードへのリンクが表示されます。また、公開されているセキュリティアドバイザリからの詳細情報も提示されます。攻撃の範囲や技術的な詳細、脆弱な環境を十分に把握していない限り、デベロッパーがセキュリティレポートから分析を始めるのは難しい場合が多いでしょう。

脆弱性の説明に基づく理解と軽減策

脆弱性を理解し、最良かつ最も効率的な修正方法を知ることは不可欠です。また、修正により既存の機能に影響を与えないようにする必要があります。もし影響する場合は、保守担当者(メンテナー)やプロダクトオーナーとの議論が必要となり、その際には全体像を要約し、代替の軽減策を用意しなければなりません。また、離職した社員が作成したコードやテストを実施していないコードの場合、修正計画を立てるのがさらに難しくなることもあります。

AI搭載の脆弱性の説明機能は、攻撃者がどのように脆弱性を悪用(エクスプロイト)できるかについて要約し、その影響や修正方法についての詳細な説明も行います。

以下の例は、OSコマンドインジェクションの脆弱性を示しており、次のコードスニペットを使用しています。

<?php 

// Read variable name from GET request
$name = $_GET['name'];

// Use the variable name to call eval and print its value 
eval('echo $' . $name . ';');

脆弱性レポートには詳細な説明がないため、全体の内容や影響について理解する必要があります。画面右上の Explain Vulnerability(脆弱性の説明)オプションを選択すると、事前に定義されたプロンプトアクションでGitLab Duo Chatが開きます。Chat内に脆弱性の追加の概要が表示され、脆弱性がどのように悪用されるかの説明や、推奨される修正方法が提示されます。

OSコマンドで使用される特殊文字の適切な無害化が行われていない('OSコマンドインジェクション')

脆弱性の説明を文脈に沿った会話にする

脆弱性の説明に関するUXの改善もされています。以前は、脆弱性の説明がオーバーレイとして右側に表示されていましたが、説明内容をGitLab Duo Chatのワークフローに統合しました。脆弱性が複雑である場合は、それに対して複数の軽減ステップに分かれたり、ソースコードの経路が不明瞭になることもあります。

ソースコードツリーを参照しながら、同じChatの文脈でコードの説明、修正、リファクタリング、そしてテストを続けられます。

C言語の例で全体的なワークフローに取り組んでみましょう。この例では、セキュリティスキャンによってバッファオーバーフローが検出されています。

  1. セキュリティの脆弱性の詳細ビューを開き、右上にある「Explain Vulnerability」(脆弱性の説明)ボタンを選択します。Chatプロンプトが開き、問題の概要、潜在的な攻撃ベクター、および提案された修正が表示されます。

脆弱性のためのAI - 画像4

  1. 提案された修正を確認し、続けて Can you show an alternative fix using a different function (日本語:別の関数を使った代替修正方法を見せてくれますか?)というプロンプトで、Chatに尋ねます。この目的は、strcpy() に代わるより安全な関数がないか調べることです。

脆弱性のためのAI - 画像3

  1. strlcpy() を使用した代替修正がChat内で提案されます(下図参照)。この関数は、ターゲット文字列に許容される文字数のみをコピーし、常に文字列をnullで終端します。また、ソース文字列の長さを返し、文字列が切り詰められたかどうかを判断します。

脆弱性のためのAI - 画像5

  1. 次に、Location file URLをクリックし、ソースコードビューに移動します。再度Chatを開き、前の脆弱性の説明の文脈が保持されていることを確認します。次のステップでは、修正を続ける前にテストを追加していきます。これにより、機能の破損やリグレッションの発生を防ぐことができます。たとえば、Based on the vulnerability context and opened source code, how would you add tests for it? (日本語:脆弱性のコンテキストと表示されたソースコードに基づいて、テストを追加するにはどうしますか?)などのプロンプトを使用します。

脆弱性のためのAI - 画像7

  1. テストが生成され(仮に追加されたとして)、同じセッションで Can you refactor the source code too? (日本語:ソースコードもリファクタリングできますか?)というプロンプトを使用して、Chatにソースコードのリファクタリングも依頼できます。

脆弱性のためのAI - 画像6

このワークフローでは、脆弱性の分析、理解、軽減、代替アプローチの発見、テストの追加、さらには脆弱性の修正に対するリファクタリングを行う手順が示されています。

Chatを使ってこのプロセスを続けた後、Web IDEに切り替えて、学んだことを基にソースコードを修正できます。さらに、変更をコミットし、CI/CDやセキュリティスキャンをトリガーして、DevSecOpsライフサイクル全体のループを完結させる継続的なワークフローも含まれています。

AIアシストによる脆弱性の修正

セキュリティ脆弱性を理解し、軽減するには、問題の修正を作成し、新しいマージリクエストでパイプラインを実行し、再度セキュリティスキャンを実施するなどのエンジニアリング作業が必要になります。また、修正をステージング(staging)環境にデプロイし、一定期間テストすることも必要な場合があります。

AIを活用し、脆弱性とソースコードに基づいた提案修正を生成することで、脆弱性修正プロセスを迅速化します。

ヒント:これまでの経験の中で最も厄介だった脆弱性を思い出し、そのユースケースを再現してGitLab Duoの導入に活用してみましょう。ちなみに、MITREのCWE Top 25(最も危険なソフトウェアの脆弱性)も、ユースケースとしてはよい例です。

次の例は、CWE-328:弱いハッシュ関数の使用を実装したもので、md5 を使用しています。これはSASTスキャンによって正しく識別されます。

import hashlib

class User:
    def __init__(self, username, password):
        self.username = username
        self.password = password

    def set_password(self, password):
        self.password = hashlib.md5(password.encode()).hexdigest()

脆弱性のためのAI -画像8

右上の Resolve with merge request(マージリクエストで解決)ボタンをクリックすると、AIを活用して修正を提案するMRが開きます。この脆弱性に対する修正として、別のハッシュ関数を使用することが考えられます。

脆弱性のためのAI - 画像9

もうひとつの一般的な脆弱性の例として、関数のエラーコードや潜在的な例外をチェックしないケースがあります。以下のCコードスニペットは、fopen()chmod() の呼び出しに対するCWE-362に関連するファイル操作におけるタイミング攻撃の例を実装しています。

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char **argv) {##$_0A$####$_0A$##    // File operations##$_0A$##    char *fname = "gitlab.keksi";##$_0A$####$_0A$##    FILE *fp;##$_0A$##    fp = fopen(fname, "r");##$_0A$##    fprintf(fp, "Hello from GitLab Duo Vulnerability Resolution Challenge");##$_0A$##    fclose(fp);##$_0A$####$_0A$##    // Potential chmod() timing attacks    ##$_0A$####$_0A$##    // Make the file world readable##$_0A$##    chmod(fname, S_IRWXU|S_IRWXG|S_IRWXO);##$_0A$####$_0A$##    return 0;##$_0A$##}

chmod() に関するSASTレポートは、次のように表示される場合があります。

脆弱性のためのAI - 画像10

提案された chmod() のマージリクエストにはエラーハンドリングが含まれており、ファイルが世界中で書き込み可能になる潜在的な問題も修正されて、権限が 777 から 600 に変更されています。

脆弱性のためのAI - 画像11

次にfopen() 関数の脆弱性も特定し、分析した上で修正してみてください。

GitLab DuoによるさらなるAI支援

セキュリティ問題は、簡単な修正や回避策で解決できることがよくあり、それによって開発チームが長期的な解決策を議論し、計画する時間を確保できます。他のケースでは、問題がより複雑になり、適切な修正が本番環境に反映されるまで、機能APIを無効にしたり、ファイアウォールでの軽減策が必要になることもあります。

GitLab Duoは、こうした問題の解決に役立つAIを活用した追加機能を提供しています。

コードの説明:デベロッパーやセキュリティエンジニアとして、行った変更に自信を持つことが重要です。IDE内でコードの説明機能を使用することで、AIが提案した脆弱性修正をより深く理解できます。この機能により、どのような調整が行われたか、そしてその理由を正確に把握できます。

根本原因分析: 修正によりCI/CDパイプラインがエラーを起こしてしまった場合、根本原因分析機能を利用できます。このツールは、根本的な問題を特定し、説明するのに役立ち、効果的に問題に対処できます。必要な修正を加えた後、テストを再実行して問題が解決したか確認できます。

リファクタリング:脆弱性の修正が済んでも、より安全なコードにできないか検討する価値があります。IDE内でGitLab Duo Chatを開き、リファクタリング機能を使用して、コードをより安全に書くための代替方法を探ることができます。この事前対策的なアプローチにより、堅牢でセキュアなコードベースを維持できます。

これらのGitLab Duoの機能を活用することで、脆弱性に自信を持って対処し、コードのセキュリティと効率を確保できます。

今後の取り組み

脆弱性の説明と修正の機能をMRのプロセスに直接組み込むことで、シフトレフト(より早い段階に移行)させることを計画しています。この統合により、開発サイクルの初期段階で脆弱性に対処し、解決できるようになり、ワークフローが効率化され、シフトレフトによりコードのセキュリティが強化された状態になります。

GitLab Duoを始める

GitLab Ultimateで利用可能な機能を有効化する方法を説明するドキュメントをご参照ください。また、GitLab Duoの脆弱性の説明および脆弱性の修正は、GitLabのSelf-Managed環境やGitLab Dedicatedでも利用可能です。

「GitLab Duo開発の現場から」ブログシリーズをチェックすることで、GitLab Duoの最新情報についてご確認いただけます。

監修:伊藤 俊廷 @toshitakaito
(GitLab合同会社 ソリューションアーキテクト本部 スタッフソリューションアーキテクト)

GitLab Duoの無料トライアルを始めて、脆弱性の修正機能を組織に取り入れてみませんか。

ご意見をお寄せください

このブログ記事を楽しんでいただけましたか?ご質問やフィードバックがあればお知らせください。GitLabコミュニティフォーラムで新しいトピックを作成して、ご意見をお聞かせください。 フィードバックをお寄せください

始めてみましょう

統合されたDevSecOpsプラットフォームによって、チームで何が実現できるかご確認ください。

無料トライアルを開始する

チームに最適なプランを見つけましょう

価格設定を見る

GitLabがチームにもたらすメリットをご覧ください

お問い合わせ