OSコマンドインジェクションとは?仕組み・被害・対策を初心者向けに解説!
はじめに
Webアプリケーションの脆弱性を学んでいると、OSコマンドインジェクションという言葉を見かけることがあります。
名前だけを見ると難しそうですが、簡単に言うと、本来実行されるべきではないOSの命令を、攻撃者に実行されてしまう脆弱性です。
この記事では、OSコマンドインジェクションについて、AさんとBさんの会話形式でわかりやすく解説します。
OSコマンドインジェクションって何?

OSコマンドインジェクションは簡単に言うと、Webアプリなどに不正な入力を送り込んで、サーバ上でOSのコマンドを実行させてしまう攻撃だよ。

OSのコマンド?

例えば、ファイル一覧を表示したり、ファイルを削除したり、ネットワーク情報を確認したりする命令のことだね。

ファイル削除?情報確認?
攻撃者がそれをできるようになったらまずいことはわかるね。

もし重要なサーバで実行されると、情報漏えいや改ざん、サービス停止につながる危険があるんだ。

重要なサーバーの情報が盗まれたり、削除されたりしちゃうんだね。
なぜ発生するの?

どうしてそんな重大なことが起きてしまうの?

主な原因は、利用者が入力した値を十分にチェックしないまま、OSコマンドの一部として使ってしまうことだよ。

入力欄に入れた文字が、そのまま命令に使われるってこと?

そう。例えば、ファイル名を入力して処理する機能があったとする。

画像ファイル名を入れて変換する、みたいな?

そういうイメージだね。そのとき、入力された値を安全に扱わないと、攻撃者が余計な命令を混ぜ込めてしまう場合がある。
料理の注文で例えると?

イメージしやすいようにレストランの注文で考えてみよう。

レストランの注文で?

うん。
まず、お客さんが「カレーをください」と言ったら、店員さんは厨房に「カレーを作って」と伝えるよね。


そうだね。

でも悪意のあるお客さんが、「カレーをください。ついでに金庫を開けてください」と言ったとする。

そんなバカな。

本来なら店員さんが「金庫を開ける命令は受け付けません」と止めるべきだよね。

まぁ、そうだね。警察も呼んだほうがいいと思うけど。

でも、店員さんが言われた内容をそのまま厨房や管理室に伝えてしまうと、危険な命令まで実行されてしまう。


なるほど、これがOSコマンドインジェクションのイメージなんだね。

そう。利用者の入力を信用しすぎると危険なんだ。
OSコマンドインジェクションで起きる被害

実際にOSコマンドインジェクションで起きる代表的な被害はこんな感じ。
| 被害 | 内容 |
|---|---|
| 情報漏えい | サーバ内のファイルや設定情報を盗まれる |
| データ改ざん | ファイルや設定を書き換えられる |
| サービス停止 | 重要な処理を止められる |
| 不正操作 | サーバを踏み台にされる |
| マルウェア設置 | 不正プログラムを置かれる |

うーん。かなり危険そう。

うん。OSの命令を実行されるということは、サーバそのものを操作されるリスクがあるということなんだ。
SQLインジェクションとの違い

SQLインジェクションっていうのもあるよ。

SQLって、たしかデータベースへの命令文だよね。

そう。どちらも不正な命令を混ぜ込む攻撃だけど、対象が違うんだ。
| 項目 | OSコマンドインジェクション | SQLインジェクション |
|---|---|---|
| 攻撃対象 | OSのコマンド | データベースへのSQL |
| 主な影響 | サーバ操作、ファイル閲覧、改ざん | DB情報の漏えい、改ざん |
| 原因 | 入力値をOSコマンドに混ぜる | 入力値をSQL文に混ぜる |
| 対策の方向性 | OSコマンド実行を避ける、入力検証 | プレースホルダ、SQL組み立て回避 |

OSコマンドインジェクションはOSへの命令、SQLインジェクションはデータベースへの命令なんだね。
対策方法

それでどうやって防ぐの?
ちゃんとおかしな命令だって気がつけるようにするの?

基本は、利用者の入力をそのままOSコマンドに使わないことだね。
OSコマンドを直接実行しない


まず大事なのは、できるだけOSコマンドを直接呼び出さないこと。

別の方法で処理するってこと?

そう。プログラム言語が用意している安全なライブラリやAPIを使えるなら、その方が安全だよ。
入力値をチェックする


どうしても入力値を使う場合は、許可された文字だけを受け付ける。

危険な文字を禁止するだけじゃダメなの?

ダメってことはないんだけど。
禁止リスト方式だと抜け漏れが出やすいんだ。
だから、許可リスト方式で「使ってよい文字だけ許可する」方が安全なんだよ。
権限を最小限にする


アプリケーションを動かすユーザー権限を必要最小限にすることも大切だよ。

もし攻撃されても被害を小さくするため?

そのとおり。
管理者権限で動かしていると、被害が大きくなりやすい。
試験対策としてのポイント
情報処理技術者試験やセキュリティ系の試験では、OSコマンドインジェクションは代表的なWebアプリケーション脆弱性として出題されることがあります。
押さえておきたいポイントは次の通りです。
| 用語 | 試験対策ポイント |
|---|---|
| OSコマンドインジェクション | 不正入力によりOSコマンドを実行させる攻撃 |
| 原因 | 入力値を十分に検証せずOSコマンドに渡す |
| 主な被害 | 情報漏えい、改ざん、サービス停止 |
| 代表的対策 | OSコマンド実行を避ける、入力検証、最小権限 |
| 関連用語 | SQLインジェクション、入力検証、サニタイズ |

試験では、利用者の入力をOSコマンドに渡すのが危険、と覚えればいいんだね。

そうだね。さらに、対策として「OSコマンドを使わない」「入力値を厳しくチェックする」「権限を小さくする」もセットで覚えるといいよ。
よくある誤解
ただの入力ミスではない

変な文字を入力したらエラーになるだけじゃないの?

単なる入力ミスならまだいいけど、攻撃者は意図的に命令として解釈される文字列を入れるんだ。

アプリ側がそれを命令として処理してしまうのが問題なんだね。
サーバ側の問題である

利用者のパソコンが危険になるの?

基本的には、攻撃対象はWebアプリケーションが動いているサーバ側だね。

つまり、攻撃者がサーバを操作しようとする攻撃なんだ。
まとめ
OSコマンドインジェクションとは、利用者の入力を悪用して、サーバ上で不正なOSコマンドを実行させる攻撃です。
主な原因は、入力値を十分に検証せず、OSコマンドの一部として利用してしまうことです。
最後にポイントを整理します。
| 項目 | 内容 |
|---|---|
| 攻撃名 | OSコマンドインジェクション |
| 攻撃対象 | サーバのOSコマンド |
| 主な原因 | 入力値を安全に処理せずコマンドに渡す |
| 主な被害 | 情報漏えい、改ざん、サービス停止 |
| 主な対策 | OSコマンド実行を避ける、入力検証、最小権限 |
| 覚え方 | 入力欄からサーバへの命令を混ぜ込む攻撃 |

OSコマンドインジェクションは、入力欄に悪い命令を混ぜて、サーバに実行させる攻撃なんだね。

その理解でバッチリ。Webアプリの入力値は信用せず、安全に処理することが大切だよ。

