見えるセキュリティ
OSコマンドインジェクション
OS COMMAND INJECTION
この概念とは?
OSコマンドインジェクションは、外部からの入力によって、サーバーで意図しないOSコマンドを実行させられる問題です。たとえば、ファイル名をシェルの命令文へそのままつなぐと、入力中の記号が命令の区切りとして働く場合があります。必要な処理を言語やライブラリの機能で行い、OSコマンドの呼び出し自体を避ける方法を優先します。[T01〜T03]
ファイル名として送った文字が、なぜサーバーの別の命令として動いてしまうのか?
- THEME
- web-vuln
- KIND
- attack
- REVIEW
- self-reviewed ·
本来は、report.txtのサイズ128バイトを調べる機能です。同じ入力を、シェルへ渡す場合と、ファイル情報取得の機能で扱う場合を比較します。
図を見る前に:OSコマンド・シェル・ライブラリAPI
- OSコマンド
- ファイル操作等を行うための命令。この図ではファイルのバイト数を調べるwc -cを使います。
- シェル
- コマンド文字列を解釈して実行するプログラム。この例はLinux上のBashを想定します。
- ライブラリAPI
- プログラムから直接使える機能。ここでは言語のファイル情報取得機能を指し、外部のWeb APIへの通信ではありません。
Linux上のBashとGNU wcを使う例です。全OS共通の構文ではありません。APIは言語内の機能で、外部Web APIへの通信ではありません。
固定データによる図解です。実際のコマンド実行・ファイル参照は行いません。
利用者側から送った入力(全STEPで同じ)
report.txt; printf INJECTEDWebアプリ
受信済み
サーバー側のWebアプリ
受け取ったのは、ファイル名として送られた文字列
まだサイズ取得や追加の処理は実行していません。次に、この入力をどう処理へ渡すかを見ます。
受信済み・まだ処理前
違いは、入力を命令の文法で解釈する場所へ渡すか、ファイル名というデータとして扱うかです。シェルを使わない側では、入力中のprintfは追加の命令になりません。ただし、ファイルへのアクセス権や対象範囲の確認は別途必要です。[T01〜T03]
STEP 01 / 5
同じ入力を受け取る
STEP 1 / 5: 同じ入力を受け取る
ファイル名として送られた入力を、Webアプリが受信しました。まだ処理は実行していません。
技術的な詳細を見る
128バイトは固定設定です。report.txt; printf INJECTEDという全名のファイルは、この教材用領域にはありません。入力を変えず、同じファイル情報・アプリの実行権限で比較します。
この概念の要点
要点
入力を命令の文法として解釈させない
この例は未引用の入力をコマンド文字列へ連結し、シェルに渡したため、;で追加の命令が生じる。[T02〜T04]
要点
OSコマンドを呼ばない方法を優先する
必要な処理を言語・ライブラリのAPIで行う。外部プログラムが不可欠なら、シェルなしの呼び出しとコマンド・引数の分離、入力やオプションの制御等を検討する。[T01・T02]
要点
権限と処理対象も制限する
アプリを最小権限で動かす。APIを使う場合も、対象ファイルやアクセス権等の確認は必要。[T01〜T03]
理解確認
理解確認
理解確認
OSコマンドインジェクションの補足
シェルを使わない呼び出しとの違い
主図の対策はOSコマンド自体を使わない方式です。外部プログラムが必要な場合は、実行するプログラムをアプリが固定し、シェルを経由しないAPIで引数を別々に渡す方法を選べる場合があります。入力全体をシェルに解析させる呼び出しとは異なります。ただし、呼び出しAPI名だけで判断せず、その言語・OSでシェルが起動するか、引数がどう渡るかを公式仕様で確認します。全言語のexecという名前の関数が同じ動作をするわけではありません。[T02・T03]
引数の分離だけで十分?
引数を分けても、呼び先が先頭の-等をオプションとして解釈する場合があります。許可するプログラム・値の形式・長さ・個数、オプション、対象範囲を確認します。対応するプログラムでは、--でオプション解析を終える方法もありますが、対象や用途を検証する代わりにはなりません。主例の対策側は、シェルなしでwcを起動する模型ではありません。[T02]
記号の削除や引用だけで防げる?
;だけの削除や、危険そうな文字の拒否リストは、別の構文や経路を取りこぼすおそれがあります。許可する入力の条件を決めてサーバー側で確認し、許可しないものを処理へ渡さない方針を考えます。エスケープはOS・シェルに依存し、入力を引用符で囲むだけであらゆる値に対応するとは限りません。主図はエスケープの操作教材へ広げず、呼び出し回避を優先します。[T01・T02]
ファイルAPIならすべて安全?
この例で防ぐのは、入力をシェルの追加命令として実行する経路です。ファイルAPIの利用だけで、ディレクトリトラバーサルや認可の不備まで解決するわけではありません。実アプリでは、選択IDからサーバー側の対象へ対応付ける等の設計、許可範囲、権限、リンク等を考慮したファイル管理が別途必要です。主図はこれらの追加対策を実施済みとしていません。[T01〜T03]
関連:ディレクトリトラバーサル(パストラバーサル)参考資料
- IPAIPA — 安全なウェブサイトの作り方 1.2 OSコマンド・インジェクション
T01更新日明示なし|概要・脅威、2-(i)、2-(ii)|シェル呼出し回避と許可条件|確認:2026-11-03
- OWASPOWASP — OS Command Injection Defense Cheat Sheet
T02更新日明示なし|Introduction、Argument Injection、Primary / Additional Defenses|呼出し回避・引数分離・入力制御・最小権限|確認:2026-11-03
- CWEMITRE — CWE-78
T03CWE 5.0|Description、Technical Nuance、Potential Mitigations|入力混入とプログラム選択の区別|確認:2026-11-03
- 参考資料GNU — Bash Reference Manual
T04§3.2.4 Lists of Commands、§4.2 printf|;による順次実行と文字出力。公式検索本文の範囲で確認、直接取得はタイムアウト|確認:2026-11-03
- 参考資料GNU Coreutils — wc invocation
T05公式検索表示9.11・§6.1 -c / --bytes|バイト数表示。直接取得はタイムアウト、出力の空白幅等は模型の保証外|確認:2026-11-03
- IPAIPA — 情報処理安全確保支援士試験 シラバス追補版(科目A-2)
T06Ver.4.0|中分類11→1→(7)攻撃手法・印刷p.3/PDF6枚目|用語対応|確認:2026-11-03