[アップデート]Amazon InspectorのLambdaコードスキャンが生成AIを活用して修復コードを提示してくれるようになりました #AWSreInvent

Amazon InspectorのLambdaコードスキャンが、生成AIを利用して脆弱性を修復したコードを提示してくれるようになりました。
2023.11.27

こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。

遂にAWS re:Invent 2023が始まりましたね。それに合わせてたくさんのアップデートが出てきました。

本記事ではそのうちの一つ、「生成AIを利用した、Amazon InspectorによるAWS Lambdaコードスキャン結果への修正アドバイス」についてご紹介します。

最初にまとめ

  • InspectorでLambdaコードスキャンをした結果の「推奨される修復」にコードの修正方針、もしくは修正方針を盛り込んだ新たなコードが表示されるようになりました。
  • すべてのコード修復に対応しているわけではなさそう。
  • 修正後コードが表示される場合、「推奨される修復」の項目名が「Suggested remediation: Showing x/x fixes」のようになる。

何が嬉しいのか?

皆さんはInspectorでLambdaのコードスキャンを行ったことはありますか?Lambda関数のデプロイ時や脆弱性ライブラリ更新時などにコードのスキャンを行ってくれる素晴らしいサービスです。

このLambdaのコードスキャン、今まではコードに含まれる脆弱性を検知しても脆弱性の修正方針としてはあくまでも参考情報を提供する程度の内容に留まっていました。

詳しくは下記記事をご参照下さい。

そんなコードスキャンの結果として、生成AIを利用した修正後のコード提示もしくは具体的な修正アドバイスが行われるようになった、というのが今回のアップデートです。

せっかく脆弱性が見つかったのに修正対応に時間がかかり過ぎていた、などといった問題を解決してくれるのではないでしょうか。

やってみた

それでは早速確認してみます。

具体的にどのような情報が提示されるのか確認したいため、まずは上記で紹介した記事のコードをそのままスキャンしてみます。

コードの脆弱性としては、Insecure connection using unencrypted protocol が出るはずです。

import json
import requests

def lambda_handler(event, context):

    try:
        ip = requests.get("http://checkip.amazonaws.com/")
    except requests.RequestException as e:
        print(e)

        raise e

    samplelist = ['sampleString1', 'sampleString2', 'sampleString3']
    concatenatedstring = ''
    for item in samplelist:
        # Noncompliant: inefficient string concatenation inside a loop is used.
        concatenatedstring += item + "\n"

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": samplelist,
            "location": ip.text.replace("\n", "")
        }),
    }

上記コードのスキャン結果が下図です。

Why are we recommending the following fix?
We detected a URL in your code that uses an unencrypted HTTP protocol connection. This might expose sensitive data to third parties. To prevent this, we recommend that you construct all URLs using the secure HTTPS protocol.

Learn more We recommend the following changes to mitigate the issue

 try:
     ip = requests.get("http://checkip.amazonaws.com/")
     ip = requests.get("https://checkip.amazonaws.com/")
 except requests.RequestException as e:
     print(e)

比較用として、下図が上記記事から引用した「推奨される修復」です。

確かに前者には修正方針を盛り込んだコードが提示されていますね。

また、Downloadボタンからは下図のようなpatchファイルを取得出来ます。

これで脆弱性のあるコードを爆速で修正出来ます。最高ですね!

具体的な修正コードが提示されないパターンもある

ただし、私が試したコードの中には具体的な修正コードが提示されないパターンもありました。

それが下記コードです。

import subprocess

def lambda_handler(event, context):
    # イベントデータからコマンドを取得
    command = event.get('command')

    # コマンドを実行
    res = subprocess.run(command, capture_output=True)
    return {
        'statusCode': 200,
        'body': {
            'stdout': res.stdout,
            'stderr': res.stderr
        }
    }

物凄く雑ですが、受け取ったOSコマンドをそのまま実行しちゃう関数です。何のバリデーションも入れていないので勿論OSコマンドインジェクションがあります。

上記コードのスキャン結果が下図です。

Why are we recommending the following fix?
Passing user-provided input to Python subprocess, OS, and command functions without validation or sanitization makes your code vulnerable to running arbitrary OS commands. To prevent this, implement input validation and use secure functions. For more information, see CWE-77, CWE-78 and CWE-88

このように、 Why are we recommending the following fix? の後に具体的な修復方針が記されているものの、具体的なコードの提示は行われていないケースもあるようです。

しかし、ここまで情報が出ているだけでも修正対応の速度は上がるのでありがたいですね。

最後に

このアップデートをきっかけにLambdaのコードスキャンを使いたくなる人もいるんじゃないでしょうか。

今年のre:Inventでは生成AIを活用したアップデートがたくさん出てきています。多くの機能で「まだ完全じゃないな」と自分は思ってしまうんですが、本機能も含め、これから後ろで動いているLLMがより賢くなることでより柔軟に結果を生成してくれることを願いたいですね。

本記事がどなたかのお役に立てれば幸いです。

以上、べこみんでした。