【おーえすこまんどいんじぇくしょん】

OSコマンドインジェクション とは?

最終更新:
💡 入力欄から「サーバーの操縦席」に乗り込む攻撃

外部からの入力がOSコマンドの組み立てに混ざり、意図しないコマンドや処理を実行させられる脆弱性・攻撃。Webアプリに限らず、入力と命令を適切に分離していないソフトウェアで起こりうる。

📌 このページのポイント
入力が命令の意味を変える場合 意図した処理 脆弱な組み立て 外部入力 ファイル名など 外部入力 命令を変える文字列 命令と入力を 適切に分離・検証 入力を混ぜた文字列を シェルが命令として解釈 意図した 結果へ 意図しない 実行・操作 発生条件と被害は、実装・環境・権限による シェルを避ける場合も、引数の検証は必要
シェル経由の脆弱な実装の一例。特定の入力だけで必ず全ファイルが削除されるわけではない。ライブラリの利用や引数の分離・検証、最小権限を組み合わせる。
ひよこ ひよこ
ペンギン先生 ペンギン先生
入力が命令の意味を変えてしまうという点は似ているよ。SQLインジェクションはSQL、OSコマンドインジェクションはOSコマンドの組み立てが対象。どちらが常に深刻という順位ではなく、権限や扱うデータ、構成によって被害が変わるんだ。
ひよこ ひよこ
どういうときに起こるの?
ペンギン先生 ペンギン先生
例えば外部から受け取った名前をそのままコマンド文字列につなぎ、シェルに渡す実装だよ。シェルが特別な文字を命令の区切りとして解釈すると、名前というデータのつもりが別のコマンドになることがあるんだ。
ひよこ ひよこ
入力にセミコロンがあれば、必ず実行される?
ペンギン先生 ペンギン先生
そうではないよ。シェルを使うか、どう引用や分離をするかなどで解釈が変わる。被害も実行プロセスの権限に制限されるので、入力しただけでサーバーの全ファイルが必ず消えるという説明は正しくないんだ。
ひよこ ひよこ
どうやって防ぐの?
ペンギン先生 ペンギン先生
まずOSコマンドを呼ばずに、言語のライブラリなどで処理できないか考えるよ。必要なら、実行する命令と引数を分けられるAPIを使い、許可した命令・値・長さなどを検証する。動くプロセスの権限も必要な範囲に抑えるんだ。
ひよこ ひよこ
シェルを使わなければ、もう安全?
ペンギン先生 ペンギン先生
命令と引数を分けることは大切だけれど、引数の意味の検証も必要だよ。例えば名前のつもりで渡した値が、呼び出すプログラムのオプションとして解釈される場合がある。特別な文字だけを取り除けばよい、という対策では足りないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「OSコマンドインジェクション」って出てきたら「外部入力でOSコマンドの意味を変え、不正な処理を実行させること」と思えばだいたいOK!
📖 おまけ:英語の意味
「OS Command Injection」 = OSコマンドへの注入
💬 入力を通じて、プログラムが作るOSコマンドの意味を変えてしまうこと。Webの画面上の入力欄だけに限定した呼び方ではないよ。

参考資料

← 用語集にもどる