Secure Steady
不正な OS コマンド実行 - コマンドインジェクション の使い方・オプション・サンプル

不正な OS コマンド実行 - コマンドインジェクション

ユーザー入力を通じてサーバー上で不正な OS コマンドを実行させる攻撃。サーバーの完全な制御を奪われる可能性がある。

概念図

コマンドインジェクション diagram

攻撃シナリオ

os.system を使った脆弱なコード

bash
# 脆弱なコード例(Python)
import os
os.system("ping " + user_input)
# user_input = "8.8.8.8; cat /etc/passwd"

subprocess.run のリスト形式で安全に実行

bash
# 安全なコード例(Python)
import subprocess
subprocess.run(["ping", "-c", "4", user_input], check=True)

コマンドインジェクションの仕組み

アプリケーションがユーザー入力をシェルコマンドの一部として組み立てる場合、攻撃者はメタ文字(;, |, &&, ` 等)を含む入力で追加のコマンドを実行できます。

  • 直接インジェクション: os.system(), exec(), shell_exec() 等の関数に直接入力値を渡す
  • 間接インジェクション: 設定ファイルや環境変数を経由してコマンドが構築される

SQL インジェクションと同様に、入力値の不適切な処理が原因です。

影響範囲はより深刻で、サーバー上で任意のコマンドを実行できるため、データの窃取だけでなくシステム全体の制御が奪われる可能性があります。

対策

  • シェルコマンドを使わない: 可能な限り言語のネイティブライブラリや API を使用する(例: ファイル操作に os.system("rm ...") ではなく os.remove() を使う)
  • 引数のリスト形式: シェルを介さずコマンドを実行する(Python の subprocess.run(["cmd", "arg"]) など)
  • 入力値のバリデーション: ホワイトリスト方式で許可する文字を制限する
  • サンドボックス実行: コンテナや chroot 環境でコマンドを実行し、影響範囲を制限する
  • 最小権限の原則: アプリケーションの実行ユーザーの権限を最小限にする

関連トピック