ちょっと話題の記事

AWS LambdaでOSコマンドインジェクションを作り込んでAmazon Inspectorのコードスキャンで検知させてみた

Amazon InspectorのコードスキャンでLambdaのOSコマンドインジェクションを検出させてみます。
2023.07.27

こんにちは、臼田です。

みなさん、LambdaLambdaしてますか?(挨拶

先日サポートされたAWS Lambdaの脆弱性のあるコードを検知できるAmazon InspectorのLambdaコードスキャン機能を使って、Lambda PythonのOSコマンドインジェクションを検知させてみました。

概要

先日のre:Inforce 2023にてAmazon InspectorがLambdaのコードスキャンができるようになりました。詳細は以下をご確認ください。

以前からコードに含まれるパッケージの脆弱性は検出できていましたが、このアップデートによりコードで作り込んだ脆弱性、例えばSQLインジェクションとかXSSとかも検出できるようになりました。

というわけで、これを試すためにPythonでOSコマンドインジェクションをやってみよう、と思いついて試しました。

実装

まずはAmazon Inspectorでコードスキャンを有効化します。「アカウント管理」から有効化しておきましょう。

Lambdaで対象の関数を作成します。コードスキャンの対象の関数ランタイムはこちらのユーザーガイドにあります。ちなみに対応してないランタイムを使うとこんな感じにInspectorで表示されます。(1敗)

というわけで今回はPython3.9で関数を作成します。コードは以下のような感じで、とりあえずご都合主義のsubprocess利用のコードです。

import subprocess

def lambda_handler(event, context):
    with open('/tmp/test', 'w') as f:
        f.write('this is test file.')
    filename = event.get("filename")
    cmd = "cat /tmp/%s" % filename
    res = subprocess.run(cmd, shell=True, capture_output=True)
    return {
        'statusCode': 200,
        'body': {
            'stdout': res.stdout,
            'stderr': res.stderr
        }
    }

やっちゃだめ感ハンパないですね。

テストのイベントはこんな感じ。

{
    "filename": "test;id"
}

実行するとこんな感じです。idの出力結果が確認できますね。

Inspectorで脆弱性を確認する

というわけでこれをInspectorで確認していきましょう。作成して動作確認して見に行ったらすでに検知されていました。「検出結果 -> Lambda関数別」で検出しているものを確認できます。

関数名を押すと詳細画面に入れます。3つの検出がありましたが、「CWE-77,78,88 - OS command injection」の検出が2つあります。

検出したタイトルをクリックすると右カラムで詳細が表示されます。脆弱性の概要やその場所、実際のコードの中身の指定もあります。いいですね。

コードの指定はこんな感じです。対象行が示されます。その下には詳細な内容が出てきます。こちらはbanditのガイドにリンクされていました。

こちらの方はshell=Trueが検知のトリガーのようです。加えて扱う文字列によって検出の重要度が変わるようです。

もう一個下の「CWE-77,78,88 - OS command injection」は以下の通りです。

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-77CWE-78 and CWE-88

ユーザー入力のサニタイズができてない入力が実行されていることの検出ですね。

3つ目の「CWE-94,95,96 - Unsanitized input is run as code」も本質的にはそういうものです。

Passing user-provided input to eval and exec functions without sanitization makes your code vulnerable to code injection. Make sure you implement input validation or use secure functions.

というわけで、想定通りの結果となりました。いい感じですね。

まとめ

Amazon InspectorのコードスキャンでLambdaのOSコマンドインジェクションを検出しました。

Inspectorを有効化しておくだけでいい感じに使えますので、是非活用していきましょう。