[アップデート] Amazon Inspector で AWS Lambda コードスキャンがプレビュー利用出来るようになりました

2023.03.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

先日の Amazon Inspector による Lambda のコードスキャンがプレビュー利用出来るようになったとアナウンスがありました。

ただ AWS re:Invent 2022 で以下が発表されたばかりで、それ最近出来るようにならなかったっけ?と思った方も多いと思います。

次の公式ドキュメントによると re:Invent 2022 で登場したものは「標準スキャン」で今回登場したものは「コードスキャン」と呼ばれており、次のような違いがあります。

Scanning AWS Lambda functions with Amazon Inspector - Amazon Inspector

  • Amazon Inspector Lambda 標準スキャン(デフォルト)
    • コードとレイヤーで脆弱性のあるパッケージが使用されているかスキャン
  • Amazon Inspector Lambda コードスキャン
    • カスタムコードをセキュリティベストプラクティス(CodeGuru Detector)に基づいてスキャン

上記のように、今回の新機能は Amazon CodeGuru の CodeGuru Reviewer と関連があります。
CodeGuru Reviewer はトレーニング済みの機械学習モデルを使い、コードリポジトリに対して静的なコードレビューを行うことが出来る機能です。
この CodeGuru Reviewer がどういったベストプラクティスに従ってレビューしているかについては CodeGuru Reviewer Detector Library というドキュメントにランタイム別に記述がされています。

今回の Inspector による「コードスキャン」では、上記の CodeGuru Reviewer Detector Library を使って CodeGuru Reviewer と似たような形で指摘事項を生成してくれます。

今回は実際にコードスキャン機能を使ってみて、標準スキャンや CodeGuru Reviewer との違いを確認してみましたので紹介します。

本機能は本日時点でプレビューです。

Inspector と Lambda コードスキャンを有効化する

Inspector の有効化

まずは Inspector を有効化しましょう。デフォルトは無効になっています。
また、Inspector はリージョナルサービスなので必要な各リージョンごとに有効化する必要があります。

今回のコードスキャン機能は本日時点では以下のリージョンでのみ利用が可能です。

  • 米国東部 (バージニア北部) : us-east-1
  • 米国東部 (オハイオ) : us-east-2
  • 米国西武 (オレゴン) : us-west-2
  • 欧州 (フランクフルト) : eu-central-1
  • 欧州 (アイルランド) : eu-west-1

ちょうど良いので今回は東京リージョンとバージニア北部で Inspector を有効化し、同じ Lambda コードをアップロードして違いを見てみましょう。

Lambda コードスキャンの有効化

Lambda コードスキャンは有効化せずに標準スキャンのみ利用することも出来ます。
プレビュー期間中はコードスキャンを追加で利用したことによる料金は発生しません。標準スキャンの料金内で利用が可能です。
プレビュー後の料金については、本日時点で公式ドキュメントや Amazon Inspector / Amazon CodeGuru の料金ページ上では情報が確認出来ませんでした。

コードスキャンは Inspector の「設定」 -> 「アカウント管理」から有効化が出来ます。

東京リージョン

東京リージョンではコードスキャンの有効化ボタンがなかったので Lambda 標準スキャンのみです。

バージニア北部

バージニア北部で Inspector を有効化するとデフォルトでコードスキャンも有効化されていました。

検証に使うコードを用意

続いて、東京リージョンとバージニア北部リージョンにアップロードする Lambda 関数を用意したいと思います。
標準スキャンとコードスキャンどちらも動きを見たいので、脆弱性のあるパッケージと脆弱性のあるコードどちらも使いましょう。

脆弱性のあるパッケージは、古いバージョンのパッケージモジュールを使用すれば依存モジュールか多分何かが引っかかります。
今回は Python で試そうと思うので requests の古いバージョン(2.20.0)を指定してみました。

requests == 2.20.0

また、コード上では先程紹介した CodeGuru Reviewer Detector Library から適当なコードスニペットを引っ張ってきました。
Inefficient string concatenation inside loop というやつを狙ってみます。

app.py

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", "")
        }),
    }

アップロード後 Inspector の検出結果にコードスキャン結果も表示される

Lambda 関数を対象リージョンで作成し少し待つと、Inspector 上で検出結果が表示されました。
見てみましょう。

東京リージョン

東京リージョンでは次のようにタイプ「Package Vulnerability」が 2 件表示されました。
urllib3 の古いバージョンを使っているので CVE-2021-33503 と CVE-2020-26137 が検出されていますね。

コードに関しては特に言及なしです。

バージニア北部リージョン

続いてコードスキャンが有効化されているバージニア北部リージョンの結果です。

東京リージョンと同じように urllib3 による「Package Vulnerability」が 2 件表示されていますが、追加でタイプ「Code Vulnerability」も表示されています。
コードの脆弱性を示す CWE-319 が検出されました。良いですね。

検出結果をクリックすると脆弱性の箇所をコードベースで表示までしてくれます。
もちろん推奨事項も表示してくれます。

ただし、今回期待した Inefficient string concatenation inside loop ではなくて、別の Insecure connection using unencrypted protocol が検出されています。

CodeGuru Detector Library の Detector は大きく Security Detectors と Code Quality Detectors の 2 つのカテゴリに分けることが出来ます。
もともと期待していた Inefficient string concatenation inside loop は Code Quality でした。

そして、今回検出された Insecure connection using unencrypted protocol は Security です。

CodeGuru Reviewer の検出結果と比較

CodeGuru Reviewer で先程の Lambda 関数と同じコードをレビューしてみると次のように Code Quality についても検出されました。

この挙動からすると、Amazon Inspector のコードスキャンでは CodeGuru Detector の全てが対象となっているわけではなく、Security だけが対象になっているのかもしれません。(ドキュメント上明記されていないですが)

さいごに

本日は Amazon Inspector で AWS Lambda コードスキャンがプレビュー利用出来るようになったので使ってみました。

CodeGuru Reviewer と Inspector で重複したスキャン結果は出るがカバーしている範囲が違うみたいですね。
CodeGuru だと Code Quality についても検出出来て、Inspector はあくまでも Security に絞ってる印象でした。
ドキュメントに明記されておらず今回の少しのコードからの得た見解なので、もう少し色々な Detector を含むコードパターンで検証したい気もします。試してみてください。

また、今回気がついたのですが Inspector の Lambda スキャンでは Java / Python / Node.js がサポートされていますが CodeGuru Reviewer では Java / Python だけです。
今まで CodeGuru 使いたかったけど Node.js なんだよなーという方もコードスキャンが使えそうですね。これも追加で試してみたい。

そして、CodeGuru Detector Library に JavaScript が追加されているので、近い将来 CodeGuru Reviewer でも Node.js がサポートされるかもしれないなと思いました。

Amazon CodeGuru, Detector Library