AWS SAM CLIのTerraformフックに任意コマンド実行の脆弱性(CVE-2026-115414)
目次
TL;DR
対象脆弱性 AWS SAM CLIのOSコマンドインジェクション(CVE-2026-115414、AWSセキュリティ情報 2026-145-AWS)
対象バージョン 1.63.0〜1.166.1で sam build --hook-name terraform を使用している環境
影響 細工されたTerraform設定やplanファイルをビルドした際、ビルド実行ユーザーの権限で任意のコマンドが実行される
深刻度 CVSS 3.1: 7.8 / CVSS 4.0: 8.4(いずれもHigh)
対応 1.166.2以降へ更新。修正版は2026年9月11日に先行公開済み(2026年10月26日現在の最新は1.170.0)
AWSが2026年10月22日(米国太平洋時間)に公表したCVE-2026-115414は、AWS SAM CLIのTerraform連携機能(Terraformフック)におけるOSコマンドインジェクションの脆弱性だ(GitHubのアドバイザリ GHSA-44mq-wjrh-vpj6)。
AWS SAM CLIはLambdaなどのサーバーレスアプリケーションをビルド・デプロイするためのツールで、通常はCloudFormationベースのSAMテンプレートを読み込むが、--hook-name terraform を指定するとTerraformプロジェクトも扱える。
今回の脆弱性は、このTerraformフックがMakefileを生成する処理で、Terraform側のリソースアドレスをシェルのコマンドラインへほぼそのまま埋め込んでいたことに起因する。
修正版となる1.166.2は2026年9月11日に先行して公開されており、それから約6週間遅れてCVE番号とアドバイザリが公表された。
影響を受けるバージョンと条件
| 項目 | 内容 |
|---|---|
| 製品 | AWS SAM CLI(PyPIパッケージ名: aws-sam-cli) |
| 影響を受けるバージョン | 1.63.0以上、1.166.2未満(1.63.0〜1.166.1) |
| 修正版 | 1.166.2 |
| 対象の使い方 | sam build --hook-name terraform |
| CVSS 3.1 | 7.8(AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H) |
| CVSS 4.0 | 8.4(AV:L/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N) |
| CWE | CWE-78(OSコマンドインジェクション) |
| 報告者 | Cipher by Causal SecurityのShubham Raj氏 |
CVSS 4.0のスコアとCWEは、AWSがCNA(CVE番号を割り当てる機関)として登録したCVEレコードに記載されている。
影響範囲の下限となる1.63.0は、SAM CLIにTerraform対応が追加されたバージョンだ。
1.63.0のリリースノートの先頭項目に「feat: Terraform support」があり、2022年11月に公開されている。
Terraformフックが導入されてから1.166.1までの全バージョンが該当する。
アドバイザリが原因として挙げているのはTerraformフックの処理のみで、SAMテンプレート単体を使うビルドには言及していない。
--hook-name terraform を使っていないプロジェクトであれば、この脆弱性の影響は受けない。
CVSSの評価では、攻撃元区分がローカル(AV:L)、利用者の操作が必要(UI:R / UI:A)とされている。
攻撃者が細工したTerraform設定やplanファイルを用意し、それを開発者やCI環境がビルドする構図を想定している。
米国のCISA(サイバーセキュリティ・インフラストラクチャ安全保障庁)が公開した評価では、2026年10月23日時点で悪用の報告はなく(Exploitation: none)、自動化して広く攻撃できる種類でもない(Automatable: no)と判定されている。
コマンドインジェクションの仕組み
Terraformフックを指定して sam build を実行すると、SAM CLIはまず terraform init と terraform plan を実行し、planの結果をJSON形式で取得する。
その上で、プロジェクト内にあるSAMメタデータリソース(null_resource.sam_metadata_*)を検索する。
SAMメタデータリソースは、どのLambda関数をどのソースからビルドし、成果物をどこに配置するかをSAM CLIへ伝えるためのリソースだ(AWS公式ドキュメント)。
SAM CLIは、検出したSAMメタデータリソースごとにMakefileのルールを生成し、そのMakefileを用いてビルドを進める。
ルールの内容は、成果物をコピーするPythonスクリプトを呼び出す1行のコマンドだ。
1.166.1までのコード(samcli/hook_packages/terraform/hooks/prepare/makefile_generator.py)では、そのコマンドを次の雛形から組み立てていた。
show_command_template = (
'{python_command_name} "{terraform_built_artifacts_script_path}" '
'--expression "{jpath_string}" --directory "$(ARTIFACTS_DIR)" --target "{resource_address}"'
)
{resource_address} には、SAMメタデータリソースのTerraformアドレス(null_resource.sam_metadata_fn など)が入る。
この値をダブルクォートで囲んで埋め込んでいたが、事前のエスケープ処理は文字列中のダブルクォートを \" に置き換えることだけに限られていた。
ダブルクォートの内側であっても、シェルはバッククォートや $(...) をコマンド置換として解釈して実行する。
例えばアドレスの中に $(whoami) やバッククォートが含まれていると、シェルがそれを文字列ではなく別のコマンドとして実行してしまう。
Terraformでは、for_each を使ってリソースを複数定義すると、アドレスの末尾にキーが付与される(null_resource.sam_metadata_fn["キー"] の形式)。
修正コミットのメッセージでは、攻撃者がアドレスを操作する経路として、細工した for_each のキーと、改ざんされたplanファイルの2つを挙げている(修正コミット 5b20d0e)。
キーにコマンド置換を含めておくと、それがMakefileのルールにそのまま展開され、ビルド実行時にシェルへ引き渡されて実行される。
graph TD
A["Terraform設定やplanファイル<br/>(for_eachのキーなどを細工)"] --> B["sam build --hook-name terraform"]
B --> C["terraform planの結果から<br/>SAMメタデータリソースを抽出"]
C --> D["リソースのアドレスを<br/>Makefileのコマンドへ埋め込む"]
D --> E["makeがシェルでコマンドを実行"]
E --> F["ビルド実行ユーザーの権限で<br/>任意のコマンドが動作"]
当初のshlex.quote修正がWindowsで壊れた理由
修正コミット 5b20d0eのメッセージによると、開発陣は最初、Python標準の shlex.quote() を使って文字列をクォートする方法で修正しようとしていた。
ところがTerraformフックはWindows環境でも動作し、GNU makeが sh.exe を検出できない場合は cmd.exe を用いてコマンドを実行する。
cmd.exe はシングルクォートを引用符として認識しないため、shlex.quote() でエスケープした文字列を渡すとWindows上のビルドがすべてエラーで落ちることが分かった。
POSIXシェル向けのエスケープ関数ではマルチプラットフォームに対応できないため、最終的な修正ではアプローチそのものが変更された。
アドレスなどの引数を独立した小さなJSONファイル(.args.json)へ書き出し、Makefileのコマンドにはそのファイルパスのみを渡す方式に改められている。
外部入力値がシェルやmakeのコマンドラインを直接通過しなくなったため、特殊記号のエスケープ処理そのものを不要にして解決している。
ビルド環境での実害とCIのシークレット漏洩
アドバイザリでは、実行されるコマンドの特徴として次の4点を挙げている。
| 特徴 | 具体的な内容 |
|---|---|
| ビルド処理中に動作 | デプロイを待たず、sam build を実行した時点で動作する |
| AWS認証情報が不要 | 攻撃者がAWSアカウントの権限を持っていなくても成立する |
| ビルド失敗時も動作 | ビルドが途中でエラー終了しても、コマンドは先行して実行される |
| 実行ユーザー権限で動作 | 開発端末なら開発者本人、CIならジョブ実行ユーザーの権限になる |
実地で影響が出やすいのは、サードパーティが作成したTerraformコードをCIでビルドしている環境だ。
外部からのプルリクエストに対してCIで自動テストやビルドを回しているリポジトリでは、CI環境に設定された環境変数(デプロイ用のAWS認証情報やGitHubトークンなど)が外部へ送信される構図になる。
またビルド成果物が書き換えられた場合、後続の sam deploy によって改ざん後のコードがそのままLambda関数へデプロイされる。
自分のPCで自分が書いたTerraformコードのみをビルドしている範囲では外部入力が入り込まないため、直ちに問題が出るわけではない。
アドバイザリの回避策でも、サードパーティ製Terraformモジュールや、外部から入力を受け取る共有リポジトリの点検を挙げている。
タイムラインと確認・更新手順
| 日付(米国時間) | 出来事 |
|---|---|
| 2022年11月 | 1.63.0でTerraform対応が追加 |
| 2026年9月11日 | 修正版1.166.2が先行リリース(Makefile生成の改善) |
| 2026年10月22日 | CVE-2026-115414、GHSA-44mq-wjrh-vpj6、AWSセキュリティ情報 2026-145-AWSが公開 |
| 2026年10月22日 | 1.170.0がリリース(10月26日現在の最新版) |
9月11日以降にSAM CLIを更新していれば、すでに修正版が適用されている。
インストールされているバージョンは次のコマンドで確認できる。
sam --version
出力が SAM CLI, version 1.166.2 以上であれば対策済みとなる。
それより古い場合は、導入方法に応じたコマンドで更新する。
| 導入方法 | 更新コマンド |
|---|---|
| pip | pip install --upgrade aws-sam-cli |
| Homebrew | brew upgrade aws-sam-cli |
| 公式インストーラー(macOSのpkg、WindowsのMSI、Linuxのzip) | GitHubのリリースから最新版を再インストール |
CIのワークフローやDockerfileでバージョンを aws-sam-cli==1.166.1 などに固定している場合は、指定のバージョン番号を書き換えて更新する。
ちなみに先行公開された1.166.2のリリースノートにはセキュリティ修正である旨は書かれておらず、単に「fix(terraform-hook): improve Makefile generation (#9271)」とだけ記載されていた。