SC Workbook
科目 A-2 · セキュリティ

引数インジェクション

Web アプリケーションが,利用者が指定したファイル名を引数として ls -l コマンドを起動している。OS コマンドインジェクション対策として,シェルを介さない API でコマンド名と引数を別々に渡し,入力値が英数字とハイフンだけから成ることを検証している。ところが,ファイル名として「-aR」を指定すると,ディレクトリ全体を再帰的に一覧表示できてしまった。この問題への対策として,最も適切なものはどれか。

  1. アシェルを介した起動に戻し,入力値全体を引用符で囲んで一つの引数としてコマンドに渡す。
  2. イコマンドを,環境変数 PATH に依存しないフルパスで指定して起動する。
  3. ウ入力値の検証を,「;」「|」「&」などシェルのメタ文字を含む値を拒否する方式に変更する。
  4. エコマンドの引数の前に「--」を置いてオプションの解釈を終了させるか,入力値の先頭が英数字であることを検証する。
正解と解説を見る

正解 エ

この問題の基礎知識

  • OS コマンドインジェクションは,入力値に含まれるシェルのメタ文字が解釈され,意図しないコマンドを実行される脆弱性であり,シェルを介さずにコマンド名と引数を分けて渡すことで防げる。
  • 引数インジェクション(CWE-88)は,引数として渡した値の先頭の「-」がコマンド自身にオプションとして解釈される問題であり,シェルを介さなくても起こる。
  • 多くのコマンドでは,引数「--」がオプションの終わりを示し,それ以降の引数はオプションではなくファイル名などとして扱われる。
  • 入力値の検証は,許可する文字や値を列挙する方式(許可リスト)の方が,危険な文字を列挙する方式(拒否リスト)よりも漏れが生じにくい。
アシェルを介した起動に戻し,入力値全体を引用符で囲んで一つの引数としてコマンドに渡す。

引用符は,シェルが値を一つの引数として扱うようにするだけで,シェルが引用符を除いた後の値は「-aR」のままである。OWASP も,引数のエスケープで OS コマンドインジェクションは防げても,攻撃者は一つの引数を渡せると指摘しており,オプションとしての解釈は防げない。

イコマンドを,環境変数 PATH に依存しないフルパスで指定して起動する。

フルパスでの指定は,PATH の操作によって意図しない同名のプログラムが起動されることを防ぐ対策である。正規の ls が起動されても,「-」で始まる引数はオプションとして解釈されるので,この問題は解消しない。

ウ入力値の検証を,「;」「|」「&」などシェルのメタ文字を含む値を拒否する方式に変更する。

問題の原因はシェルのメタ文字ではなく,値の先頭の「-」がコマンドのオプションとして解釈されることである。メタ文字を拒否しても「-aR」は通過し,許可する文字を列挙する現在の検証方式よりも弱くなる。

エコマンドの引数の前に「--」を置いてオプションの解釈を終了させるか,入力値の先頭が英数字であることを検証する。正解

引数を分けて渡しても,「-」で始まる値はコマンド自身がオプションとして解釈する(CWE-88)。「ls -l --」のように「--」でオプションの終わりを示すか,先頭の文字を英数字に限定すれば,値はファイル名として扱われる。

検証用の出典出典照合済み
CWE-88 Improper Neutralization of Argument Delimiters in a Command (Argument Injection) / OWASP OS Command Injection Defense Cheat Sheet
照合の根拠(5 件)

問題文の状況は CWE-88 の Example 1(validate_name が「-」始まりを許し「ls -l -aR」で再帰一覧が得られる)と同じで,原因は先頭の「-」がオプションと解釈されることなので,オプション解釈の終了か先頭文字の制限が対策になる。

問題 ID A2-SEC-0510 · AI 作成のオリジナル問題 · 正解と各選択肢の根拠を出典の原文で確認しています。 照合日 2026-11-08

非公式の学習用アプリです(IPA とは関係ありません)。問題はすべて AI が作成したオリジナルで、誤りを含む場合があります。