【レポート】生成AIとAWSツールによる自動脆弱性パッチ適用 #AWSreInvent #SMB310

【レポート】生成AIとAWSツールによる自動脆弱性パッチ適用 #AWSreInvent #SMB310

生成AIを使用した自動脆弱性修復パイプラインのワークショップに参加しました
Clock Icon2024.12.03

お疲れさまです。とーちです。re:Invent2024に参加してます。
この記事では「SMB310 | Automated vulnerability patching with generative AI and AWS tools」のセッションレポートをお届けします。

セッションの概要

タイトル

Automated vulnerability patching with generative AI and AWS tools

概要

Discover how to enhance your application's security with an automated vulnerability remediation pipeline using generative AI. This session covers integrating Amazon Bedrock and Amazon Inspector to automatically detect and patch vulnerabilities in code. Learn to streamline the CI/CD process, improve security posture, and minimize manual intervention in vulnerability management. Join this session for a hands-on exploration of leveraging AI to maintain secure and robust applications. You must bring your laptop to participate.

※日本語訳
生成AIを使用した自動脆弱性修復パイプラインでアプリケーションのセキュリティを強化する方法をご紹介します。このセッションでは、Amazon BedrockとAmazon Inspectorを統合してコード内の脆弱性を自動的に検出および修復する方法を説明します。CI/CDプロセスの合理化、セキュリティ対策の改善、脆弱性管理における手動介入の最小化について学びます。AIを活用して安全で堅牢なアプリケーションを維持する方法を実際に体験できるセッションです。参加するには、ノートパソコンをご持参ください。

スピーカー

Patrick Duffy, Sr. Solutions Architect, Amazon Web Services

Nadim Mansour, Solutions Architect, Amazon Web Services

Manish Dhawaria, Principal Solutions Architect, AWS

Mitesh Patel, Principal Solutions Architect, AWS

Ioannis Moustakis, Solutions Architect, AWS

セッションタイプ

Builders' session

概要

Generative AI と AWS サービスを活用して、脆弱性の修復をするためのプルリクエストを自動的に出すといった内容のセッションでした。

アーキテクチャ図としては以下のようになります。セッション内ではワークショップ形式で以下のアーキテクチャ図のシステムを実際に作り、動作確認するところまで実施しました。

image.png

アーキテクチャの処理の流れ

処理の流れとしては以下のような形です。

  1. まず、アプリケーションのリポジトリをクローンし、コンテナイメージを構築してAmazon ECRにプッシュします。
  2. Amazon ECRは、コンテナイメージ内のOSやプログラミング言語パッケージの脆弱性を自動的にスキャンします。
  3. Amazon Inspector(以下Inspector)の拡張スキャンでECRに保存されているイメージをスキャンし、発見された脆弱性を重要度別(Critical、High、Mediumなど)に分類します。
  4. スキャン結果から検出された問題は、InspectorによってAmazon EventBridgeにイベントとして発行されます。
  5. Inspectorは、重大(Critical)および高(High)レベルの脆弱性を検出すると、新しい検出イベントルールを自動的にトリガーします。
  6. 検出されたセキュリティの問題は、Lambda関数によってAmazon DynamoDBに保存され、履歴として管理されます。
  7. スキャンが完了すると、ECSでホストされているGenerative AIサービスが起動します
  8. ECSとFargateを使用して作成されたアプリケーションが、Amazon Bedrockとやり取りし、脆弱性修正のプルリクエストを自動生成します。
  9. 生成AIによって作成されたコードは、脆弱性のあるパッケージを更新するための具体的な修正案を含むプルリクエストが自動的に出されます。

実際のワークショップで体験したこと

実際のワークショップで行ったことを印象深かったポイントを中心にお届けします。

ワークショップの準備

日本でもよくAWSが主催するハンズオンで使われている仕組みを使って、ワークショップ環境が提供されました。
このあたりはre:Inventでも同じなんだな〜と思ったりしました。
コンソールにログインしたあと、WebIDEの環境に入るのですが、ここではCloud9のサービス終了を受けてか、Visual Studio Code Serverを使っていました。

またリポジトリとしてはCodeCommitを使っていました。こちらもサービス終了が発表されているので、ハンズオンの作成にはAWS社員の方も苦労してそうだなと勝手ながらに思ってしまいました。後継サービスが出るといいのですが。。

EventBridgeに登録するルール

EventBridgeでは2つのイベントをトリガーに処理を起動します。

  • ecr-finding-rule:ECR pushによりInspectorでコンテナイメージの脆弱性スキャンをした際に、重大度が HIGH、CRITICAL、または MEDIUM の新しい Inspector 検出結果が検出されるたびLambda 関数を実行
  • inspector-findings-complete:Inspector スキャンが完了し、結果が利用可能になったときに起動する

ecr-finding-ruleを契機とした処理により発見された脆弱性情報がDynamoDBに保存されます。この情報は後にECSがプルリクエストを作成するための情報源として使用されます。
またinspector-findings-completeはInspectorスキャン自体の完了をトリガーとして、ECSを最終的に起動する形です。

ECS Fargateで行われる処理

ECS上ではプルリクエスト作成のための処理が行われます。
ECSにてBedrockを呼び出します。Bedrockを呼び出す際のプロンプトを生成するコードの一部が紹介されていました。
引数として、DynamoDBテーブルの情報やrequirements.txtの内容を指定することで、それらの情報をつかってプロンプトを組み立てているのがわかります。
※コメントは自分が追記したもの

def build_model_prompt(vulnerabilities_item, requirements, app_name):
    """
    AIモデルへ送信するプロンプトを生成する関数

    Args:
        vulnerabilities_item (dict): DynamoDBから取得した脆弱性情報
        requirements (str): requirements.txtの内容
        app_name (str): 対象アプリケーション名

    Returns:
        str: 生成されたプロンプト
    """
    # プロンプトの初期部分を作成(アプリケーション名と脆弱性セクション)
    prompt = f"Application:{app_name}\nVulnerabilities:\n"

    # 脆弱性情報をDynamoDBから一つずつ取得し処理
    for vulnerability in vulnerabilities_item.get('vulnerabilities', []):
        if vulnerability.get('library_name') not in prompt:
            # 脆弱性情報を定型フォーマットで追加
            prompt += f"- {vulnerability['library_name']} {vulnerability['current_version']} (fixed in {vulnerability['fixed_in_version']}): CVE {vulnerability['cve_id']}\n"

    # requirements.txtの内容とAIモデルへの指示を追加
    # 指示内容: 現在のrequirementsにある全ライブラリを含め、重要な脆弱性のみ修正するよう指示
    prompt += f"\nCurrent `requirements.txt`:\n```\n{requirements}\n```\nSuggestions for improvement (Include all the libraries that are on the current requirements, don't matter if they have CVEs like medium ones, but bump only based on the Vulnerabilities fixed):"
    return prompt

# ローカルディレクトリからrequirements.txtを読み込み
requirements_file = read_requirements_as_text(f"{local_dir}/requirements.txt")

# 関数を呼び出してプロンプトを生成
model_prompt = build_model_prompt(vulnerabilities_item, requirements_file, ecr_repo_name)

final_model_prompt = python_incontext_learning + model_prompt

実行結果

実行した結果、以下のように見事に脆弱性情報の修正プルリクエストが出されていました

  • 検出されていた脆弱性
    • image.png
  • プルリクエスト文章
    • image.png
  • 修正内容(ここも生成AIにより自動で修正後のファイルが作成されています)
    • image.png

## まとめ

GitHubだとDependabotでパッケージの脆弱性チェックや修正リクエストまで出してくれますが、同じようなことがハンズオンの1時間の中で作成できて驚きでした。
また、あまり生成AIのことはキャッチアップできてなかったのでプロンプト生成の方法など参考になりました。

以上、とーちでした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.