■OSコマンド・インジェクション(OS command injection)
CGIのリクエストなどにOSコマンドを混ぜ込むことで、サーバ上でOSコマンドを実行させる攻撃。
CGIで利用されるPerlのopen関数には特別な機能があり、「|」を付けると指定した外部プログラムを起動し、プログラムの標準出力を開くことなどが可能である。この機能は、Perlの仕様であり、sendmailに対してメールの内容を渡す際などによく利用される。
open関数 |
機能 |
open(FILE, "path") |
ファイルを読み込み用でオープン(ファイルが存在しなければエラー) |
open(FILE, "<path") |
ファイルを読み込み用でオープン(ファイルが存在しなければエラー) |
open(FILE, ">path") |
ファイルを上書き用でオープン(ファイルが存在しなければ作成) |
open(FILE, ">>path") |
ファイルを追加用でオープン(ファイルが存在しなければ作成) |
open(FILE, "+<path") |
ファイルを読み書き用でオープン(ファイルが存在しなければエラー) |
open(FILE, "+>path") |
ファイルを読み書き用でオープン(ファイルが存在しなければ作成) |
open(FILE, "+>>path") |
ファイルを読み追加用でオープン(ファイルが存在しなければ作成) |
open(FILE, "program |") |
外部プログラムを起動し、プログラムの標準出力を開く |
open(FILE, "| program") |
外部プログラムを起動し、プログラムへの標準入力を開く |
ただし、このような機能があるため、CGIのリクエスト処理を適切に行わないと、リクエストに埋め込まれたOSコマンドがそのまま実行されてしまう危険性がある。最悪の場合は、システム・ファイルが削除されるなどして、システムが破壊される可能性もある。単にファイルをオープンするだけの場合は、sysopen関数を使うことで、OSコマンド・インジェクションの脆弱性を回避できる。またほかの関数でも同様にOSコマンド・インジェクションを引き起こす可能性を持つものがあるので、入出力部で確実にサニタイジングを行うようにプログラミングする必要がある。
|