OSコマンドインジェクション
Webアプリケーションが、利用者の入力をそのままOSのコマンドの一部として実行してしまう脆弱性を突き、攻撃者が任意のOSのコマンドをサーバ上で実行させる攻撃。
イマシルちゃんの解説
レストランで、注文票に「カレー」って書くと、お店の人がそのとおりに作ってくれるとするね。
もし、いたずらで「カレー。それと、金庫を開けて中身を渡して」って書いたら?
お店の人が、注文票を確かめずにそのまま実行しちゃったら、大変なことになるよね。
Webサイトでも、入力された文字を確かめずにコンピュータへの命令に混ぜちゃうと、同じことが起きるんだ。
より深い解説
定義
OSコマンドインジェクションは、Webアプリケーションが、外部から受け取った値を使ってOSのコマンド(シェル)を呼び出すとき、その値にシェルの特殊な記号やコマンドを混ぜ込まれ、開発者が意図しないコマンドを実行されてしまう攻撃である。
起きる仕組み
例えば、入力されたホスト名に ping を実行する機能で、プログラムが次のようにコマンドを組み立てているとする。
ping -c 1 (入力された値)
入力に「example.com; cat /etc/passwd」と入れられると、シェルは「;」でコマンドを区切り、2つ目のコマンドも実行してしまう。
| よく使われる記号 | 意味 |
|---|---|
| ; | コマンドを続けて実行する |
| | | 前のコマンドの出力を、次のコマンドに渡す |
| && 、|| | 前のコマンドの結果に応じて、次を実行する |
| バッククォートで囲む、$( ) | コマンドの実行結果に置き換える |
PerlのsystemやPHPのexecのように、シェルを起動する関数に入力を渡す部分が危険な箇所になる。
被害
- サーバのファイルの閲覧、改ざん、削除
- マルウェアのダウンロードと実行
- ほかのシステムへの攻撃の踏み台にされる
対策
| 対策 | 内容 |
|---|---|
| シェルを起動しない | OSのコマンドを呼ばずに、言語の機能(ライブラリ)で処理する。これが根本的な対策 |
| 引数を分けて渡す | シェルを介さず、コマンドと引数を別々に渡す関数を使う |
| 入力の検証 | 許可した文字(英数字など)だけを受け付ける |
| 最小権限 | Webアプリケーションを、権限の小さいアカウントで動かす |
インジェクション系の攻撃の比較
| 攻撃 | 混ぜ込む先 |
|---|---|
| OSコマンドインジェクション | OSのコマンド(シェル) |
| SQLインジェクション | データベースへの命令(SQL) |
| HTTPヘッダインジェクション | HTTPの応答ヘッダー(改行を混ぜて、ヘッダーや本文を追加する) |