【いんじぇくしょん】

インジェクション(攻撃) とは?

最終更新:
💡 入力データを命令に紛れ込ませ、処理を変える攻撃

外部からの入力を、単なるデータではなく命令やコードの一部として処理させ、意図しない動作を起こす攻撃の総称。SQLやOSコマンドなど、入力を渡す先に応じて仕組みと対策が異なる。

📌 このページのポイント
入力と命令の境界 同じ入力でも、渡し方で処理が変わる 入力データ 命令と混ぜる 意図しない処理 入力データ 命令と値を 分けて渡す 値として処理 SQLの例:パラメータ化クエリを使う
上は入力が命令へ混ざる経路、下は命令と値を分けるSQL対策の概念。他の種類の対策は渡す先に応じて選ぶ。
ひよこ ひよこ
変な文字を入力するだけで攻撃になるの?
ペンギン先生 ペンギン先生
入力を受け取る処理に問題があり、データとして扱うはずの内容を命令として解釈すると、攻撃につながるよ。入力に記号があること自体が問題なのではなく、受け取ったデータと実行する命令を混ぜてしまうことが問題なんだ。
ひよこ ひよこ
SQLインジェクションは何を変えるの?
ペンギン先生 ペンギン先生
例えば、検索条件の値をSQLの文字列へ直接つなぐと、その値がSQLの構造を変えてしまう場合があるよ。攻撃が成功すると、権限や処理によってはデータの漏えいや書き換えが起きる。フォームに送れば必ず成功するわけではないんだ。
ひよこ ひよこ
SQLではどう防ぐの?
ペンギン先生 ペンギン先生
命令のひな形と入力値を分けるパラメータ化クエリを使うよ。値は命令の一部にせず、値として渡す。テーブル名など値のパラメータにできない部分は、許可した候補から選ぶ設計にする。記号を全部禁止するだけの対策には頼らないでね。
ひよこ ひよこ
OSコマンドも同じ方法でいい?
ペンギン先生 ペンギン先生
できるなら外部コマンドの呼び出しを避け、目的に合うAPIを使うよ。呼ぶ必要があるなら、実行するプログラムを信頼できるものに固定し、命令と引数を分け、引数の値も検証する。SQL向けのエスケープをそのまま使うような共通の万能対策はないんだ。
ひよこ ひよこ
AIへの指示にもインジェクションがある?
ペンギン先生 ペンギン先生
プロンプトインジェクションでは、入力や外部の文書に紛れた指示が、AIの本来の処理を変えようとするよ。SQLの構文を変える攻撃とは仕組みが違う。指示と資料を分ける工夫だけで安全を保証せず、AIにつないだツールの権限も制限する必要があるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「インジェクション(攻撃)」って出てきたら「入力データを命令に紛れ込ませ、処理を変える攻撃」と思えばだいたいOK!
📖 おまけ:英語の意味
「Injection」 = 注入
💬 英語で注入という意味。入力を通じて命令を処理へ紛れ込ませる攻撃を表す言葉だよ。

参考資料

← 用語集にもどる