見えるセキュリティ

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 INJECTED

Webアプリ
受信済み

サーバー側のWebアプリ

受け取ったのは、ファイル名として送られた文字列

まだサイズ取得や追加の処理は実行していません。次に、この入力をどう処理へ渡すかを見ます。

受信済み・まだ処理前

違いは、入力を命令の文法で解釈する場所へ渡すか、ファイル名というデータとして扱うかです。シェルを使わない側では、入力中のprintfは追加の命令になりません。ただし、ファイルへのアクセス権や対象範囲の確認は別途必要です。[T01〜T03]

STEP 01 / 5

同じ入力を受け取る

STEP 1 / 5: 同じ入力を受け取る

現在のSTEP 1STEP 2STEP 3STEP 4STEP 5

ファイル名として送られた入力を、Webアプリが受信しました。まだ処理は実行していません。

技術的な詳細を見る

128バイトは固定設定です。report.txt; printf INJECTEDという全名のファイルは、この教材用領域にはありません。入力を変えず、同じファイル情報・アプリの実行権限で比較します。

パネルの開閉ではSTEPは変わりません。

この概念の要点

  • 要点

    入力を命令の文法として解釈させない

    この例は未引用の入力をコマンド文字列へ連結し、シェルに渡したため、;で追加の命令が生じる。[T02〜T04]

  • 要点

    OSコマンドを呼ばない方法を優先する

    必要な処理を言語・ライブラリのAPIで行う。外部プログラムが不可欠なら、シェルなしの呼び出しとコマンド・引数の分離、入力やオプションの制御等を検討する。[T01・T02]

  • 要点

    権限と処理対象も制限する

    アプリを最小権限で動かす。APIを使う場合も、対象ファイルやアクセス権等の確認は必要。[T01〜T03]

理解確認

この例で、サイズ取得に加えてprintfも動く理由は?

理解確認

OSコマンドを使わない側でprintfが実行されない理由は?

理解確認

外部プログラムの呼び出しが不可欠な場合、適切な考え方は?

OSコマンドインジェクションの補足

シェルを使わない呼び出しとの違い

主図の対策はOSコマンド自体を使わない方式です。外部プログラムが必要な場合は、実行するプログラムをアプリが固定し、シェルを経由しないAPIで引数を別々に渡す方法を選べる場合があります。入力全体をシェルに解析させる呼び出しとは異なります。ただし、呼び出しAPI名だけで判断せず、その言語・OSでシェルが起動するか、引数がどう渡るかを公式仕様で確認します。全言語のexecという名前の関数が同じ動作をするわけではありません。[T02・T03]

引数の分離だけで十分?

引数を分けても、呼び先が先頭の-等をオプションとして解釈する場合があります。許可するプログラム・値の形式・長さ・個数、オプション、対象範囲を確認します。対応するプログラムでは、--でオプション解析を終える方法もありますが、対象や用途を検証する代わりにはなりません。主例の対策側は、シェルなしでwcを起動する模型ではありません。[T02]

記号の削除や引用だけで防げる?

;だけの削除や、危険そうな文字の拒否リストは、別の構文や経路を取りこぼすおそれがあります。許可する入力の条件を決めてサーバー側で確認し、許可しないものを処理へ渡さない方針を考えます。エスケープはOS・シェルに依存し、入力を引用符で囲むだけであらゆる値に対応するとは限りません。主図はエスケープの操作教材へ広げず、呼び出し回避を優先します。[T01・T02]

ファイルAPIならすべて安全?

この例で防ぐのは、入力をシェルの追加命令として実行する経路です。ファイルAPIの利用だけで、ディレクトリトラバーサルや認可の不備まで解決するわけではありません。実アプリでは、選択IDからサーバー側の対象へ対応付ける等の設計、許可範囲、権限、リンク等を考慮したファイル管理が別途必要です。主図はこれらの追加対策を実施済みとしていません。[T01〜T03]

関連:ディレクトリトラバーサル(パストラバーサル)

参考資料

RELATED CONCEPTS