- 画像スケーリングの脆弱性を利用して、本番環境のAIシステムを攻撃できる
- 見た目は正常な画像が、ダウンスケーリング時にプロンプトインジェクションのペイロードへ変換され、データ流出を引き起こす可能性がある
- この攻撃はGoogle Gemini CLI など複数の実サービスで確認されており、ユーザーの認識とモデル入力の不一致を悪用する
- ダウンスケーリングアルゴリズムおよび各実装方式によって攻撃手法と影響は異なり、オープンソースツールAnamorpherで画像攻撃を実験できる
- 防御策としては、入力プレビューの提供、安全な設計パターンの適用、ユーザーへの明確な承認要求などが推奨される
背景と問題提起
- LLM などのAIシステムに一見普通の画像を入力すると、ダウンスケーリング過程で隠されたマルチモーダル・プロンプトインジェクションが作動し、ユーザーデータを外部へ流出させる攻撃シナリオがある
- こうした脆弱性は、モデルに実際に渡される画像がスケーリング処理を経るために生じ、その過程で攻撃者が埋め込んだペイロードが表面化する
本番環境のAIシステムを狙う画像スケーリング攻撃
- 本ブログ記事では、Gemini CLI、Vertex AI Studio、Gemini Web および API、Google Assistant、Genspark など、さまざまな実運用AI製品を対象に、画像スケーリングの脆弱性が現実の攻撃に悪用されうることを実演している
- Anamorpherというオープンソースツールにより、このようなカスタム画像を容易に生成・検証できる
データ流出攻撃の事例(Gemini CLI)
- Gemini CLIでは、デフォルト設定適用時に Zapier MCP サーバーがユーザー確認なしで全ての MCP ツール呼び出しを自動承認する(
settings.json の trust=True 設定)
- ユーザーが正常に見える画像をアップロードすると、ダウンスケーリング後の画像に含まれるプロンプトインジェクションによって、Google Calendar 内のデータが攻撃者のメールアドレスへ流出する
- 実際のプレビューが提供されないため、ユーザーは変形後の結果や攻撃の有無を知ることができない
- この種のプロンプトインジェクション攻撃は、Claude Code、OpenAI Codex など多様なエージェント型コーディングツールでもすでに確認されている
- これらのツールには、デフォルトで安全でない設定やシステムパターンが多く、根本的な対策が必要である
追加の攻撃事例
- Vertex AI、Gemini Web インターフェース、Gemini API、Google Assistant、Gensparkでも、画像スケーリングベースのプロンプトインジェクション攻撃が成功している
- 特に Vertex AI Studio では、ユーザーは高解像度画像しか確認できず、モデルが受け取るダウンスケーリング後の画像を見ることができない
- その結果、ユーザーの認識と実際のモデル入力との不一致が、攻撃を容易にしている
- 攻撃ベクトルは多様なシステムやツール全体に広く分布している
画像スケーリング攻撃の内部原理
- この攻撃は、画像ダウンスケーリング(リサンプリング)アルゴリズムの補間特性を悪用する
- 代表的なダウンスケーリングアルゴリズムには、Nearest Neighbor、Bilinear、Bicubic Interpolation などがあり、それぞれの特性に合わせた攻撃手法が必要となる
- ライブラリごと(Pillow、PyTorch、OpenCV、TensorFlow)にも、アンチエイリアシング、アライメント、内部バグなど実装差異が存在する
- 攻撃者は、各システムでどのアルゴリズムと実装が使われているかをフィンガープリント分析しなければ、最適化された攻撃を行えない
- チェッカーボードパターン、同心円、バンドパターン、Moiré、傾いたエッジなど多様なテスト画像を使って、アルゴリズム特性やアーティファクトを分析する
画像サンプリングの原理と Nyquist–Shannon の定理
- リボン上に精巧なパターンがあるとき、一定間隔でサンプリングすると、サンプリング速度が低い場合には元のパターンが正確に復元されず、歪みが生じる
- これは Nyquist–Shannon のサンプリング定理で説明されるエイリアシング効果であり、攻撃者はピクセルを操作して、ダウンスケーリング後に特定のパターンが現れるよう設計する
Anamorpher: 攻撃画像作成ツール
- Anamorpher は、代表的なダウンスケーリングアルゴリズム(Nearest Neighbor、Bilinear、Bicubic)に合わせて攻撃画像を作成・可視化できるオープンソースツールである
- たとえば Bicubic Interpolation の場合、4x4 領域の 16 ピクセルをもとに周囲ピクセルへ重み付けを行い、出力ピクセル値が決定される
- 攻撃者はコントラストの高い画像(例: 濃い黒の背景)を選び、重要度の高いピクセルの輝度を最適化(最小二乗法)することで、ダウンスケーリング結果が鮮明な攻撃パターンになるようにする
- Anamorpher は フロントエンドインターフェースと Python API を提供し、バックエンドのモジュール化によって、ユーザーはカスタムのダウンスケーリングアルゴリズムまで実験できる
防御と対応策
- 最も安全な方法は、画像のダウンスケーリング自体を使わず、アップロード可能な画像サイズを制限することである
- やむを得ず変換やダウンスケーリングが必要な場合は、CLI や API を含むすべての入力チャネルで、実際にモデルへ入力される画像のプレビューを必ず提供すべきである
- 特に、画像内テキストが機微なツール呼び出しを誘発できないように、必ず明示的なユーザー承認を求める必要があり、システム全体として安全な設計パターンと体系的な対策の適用が必要である
今後の課題
- モバイルおよびエッジデバイスでは、固定画像サイズの制約と非効率なダウンスケーリングアルゴリズムの利用率が高いため、リスクがさらに大きい可能性がある
- 音声AIとの組み合わせ、より高度なアルゴリズムとインジェクション検知法、意味ベースのプロンプトインジェクション、アップスケールのアーティファクト活用など、今後の研究と防御策の整備が必要である
結論
- Anamorpher は現在ベータ段階にある
- 今後、マルチモーダルかつエージェント型のAIシステムに対するセキュリティ研究とともに、適切なフィードバックと改善が期待される
1件のコメント
Hacker Newsのコメント
最初は混乱した。記事ではプロンプトインジェクションが実際にどう行われたのか、うまく説明されていなかった……画像の16進データを細工してASCIIに変換するような副作用かと思った。
その後で気づいた。文字どおり、<i>画像にレンダリングされたテキストを隠す方式</i>だった。
いや本当に驚いた。
この攻撃手法はかなり前から議論されてきた。参考としてこの論文がある。
不気味なのは、画像をスケーリングするとまったく別の画像に見えるようにできる点だ。
たとえば、ある集団を違法画像の所持で逮捕したいなら、こうしたスケーリングのトリックを使って画像をミームや政治的メッセージ、あるいは標的の集団がダウンロードしたくなる何かに変形できる。
VLMシステムを作る立場として、これは本当に怖い。
そろそろVLM専用のOWASPガイドラインが必要な時期だ。
ほぼ毎月、新しい攻撃手法の話を聞いている。
参考までに、OWASPは最近こうした資料を出している: Multi-Agentic System Threat Modeling Guide
最初は画像内のテキストにまったく気づかなかった。
リサイズだけの問題ではなく、単に画像に含まれたテキストがプロンプトの一部として扱われ、エージェントがどの命令に従っているのか透明性がないことが問題だ。
本当に興味深いのは、ダウンスケーリング時に画像が違って見えるようにする敵対的画像(Adversarial Image)だ。
ダウンサンプリング(サンプル数を減らすこと)は従来からある手法で、ここにAIは関与していない。
ここが気になっていた部分だ。
レンダリングされたテキストを機械が読むにはOCR(文字認識)が必要なのに、なぜわざわざAIがそんな高コストな処理を通すのか理解できない。
マルチモーダルシステムの一部なら、そのテキストをプロンプトと区別できないのかもしれない。
もしそうなら、この欠陥は本当に理解しがたい。
少なくともOCR機能は自動で結果をプロンプトに注入せず、ユーザーに通知して確認を取る手順を入れるべきだ。
こういう非決定的で不安定なシステムは嫌いだ。
本当にアルゴリズムと堅実な技術に戻ってほしいと思う。
この問題は権限設定が緩い場合にだけ発生する。
だが最近のトレンドはよりエージェント的なシステムで、そうしたシステムはしばしばより緩い権限を必要とする。
たとえば、家の前に置かれた荷物を拾ってくるヒューマノイドロボットを考えればいい。
視覚機能は荷物をつかむために不可欠だ。
誰かが荷物に画像を貼り付けてプロンプトインジェクションを試みれば、ロボットを誘導して家の中の貴重品を窓の外に投げさせることもできる。
こうしたシステムをプロンプトインジェクションから守ることは急務だと思う。
ここでの本当の問題は、画像にプロンプトが入っていることではなく、ロボットがその行動に対する権限のないソースから命令が来たことを見分けられない点にある。
MLモデルの根本的な問題は、reasoning(推論)がモデルのトークンストリームを通じて行われる一方で、そのストリームが外部入力も取り込むため、モデルには自分の思考と外部入力を効果的に区別する仕組みがないことだ。
システムに直接統合されるべきだ。
たとえば、エージェントが腕を使って破壊的な行動をできないようにするべきだ。
もし自由意志に機械が人間の道徳性を得ることを期待しながら、「良いプロンプト」と「悪いプロンプト」だけを区別しようとするなら、今後もこうしたシステムの危険性に驚き続けることになる。
要するに、検証可能なガバナンスと行動決定性(Behavioral Determinism)がこの種のシステムには必須だ。
おそらく、プロンプトインジェクション対策よりもさらに重要な要素だ。
ロボットに偽のプロンプトを無視しろというプロンプトを与えれば解決できる。
一般的に、プロンプトインジェクション問題はタスクごとの階層構造で十分に解決できるのではないかと思う。
LLMに作業をより小さなコンポーネントへ分割して実行させることができる。
上位レベルのタスクを担うLLMは下位レベルの詳細を自由に知る必要はなく、その結果だけをフィルタして整えればよい。
これは上位タスクのLLMインスタンスのコンテキストも制限し、集中させる効果がある。
もちろん下位タスクが上位タスクへデータを渡すことはできるが、必ずそう設計する必要はない。
セキュリティが重要なタスクなら、上位LLMが自由形式の結果を受け取らないほうがむしろ望ましい。
良い画像スケーリングアルゴリズムはナイキスト限界を必ず考慮すべきだ。
たとえば、bicubicスケーリングで元サイズの1/3に縮小するなら、4x4ではなく12x12グリッドを使うべきだ。
適用重みを算出する数式も少し変形して使えばよい。
画像のガンマ補正解除(de-gamma)も必須だ。
良いスケーリングが本当に少ないのは残念だ。
かなりのエイリアシング(情報の歪み)がそのまま通ってしまうからだ。
論文にもあるように、カーネルサイズを十分に大きくすれば、アルゴリズムが良くても量子化のせいで一部の情報が残ることはありうるが、その影響は大幅に減る。
有名なライブラリでさえ、いまだにmipmapping(あらかじめ複数サイズを生成して使う方式)だけを使っているのは驚きだ。
良いリサンプリングフィルタは15年前のCPUでもリアルタイム動画処理に使われていた技術だ。
ガンマ補正のほうがカーネルサイズを増やすことより計算量を食う場合も多い。
ケースによっては、ガンマ補正よりフィルタリサンプルを省略するほうが本当に合理的な状況もある。
LLMのセキュリティ面での未来は本当に怖い。
以前、多くの試行錯誤の末に学んだ「In-band signaling(チャネル自体の中でデータと命令を分離しないことの危険)」という原則を完全に無視したシステムを作ってしまった。
単に目に見える形で命令を挿入する方法から、こうした難読化(Obfuscation)の手法、ASCII Smugglingまで、攻撃ベクトルは多い。
防御策といっても、非決定的(Non-deterministic)なアルゴリズムに不適切な命令へ従わないでくれと「丁寧に」お願いする程度だ。
参考: テキストをUnicodeタグで隠して見つける
ますます多くの開発者が、LLMに正しく振る舞ってくれと懇願している。
どこかWarhammer 40kの雰囲気があって、笑えると同時に恐ろしくもある。
別の選択肢は、LLMやLLMを含むシステムを最初から使わないことだ。
昔、phpでユーザー入力をそのまま文字列連結してクエリを作り、危険なパターンを延々ともぐら叩きしていたのに似ている。
データと命令を区別できず、何十年もたって同じ失敗を繰り返しているのは残念だ。
奇妙なことに、モデルにsudoトークンのようなものが一切ないのが驚きだ。
普通のトークンでは表現できない文法があればよかったのにと思う。
まるで昔のシリアル端末の時代が戻ってきたようだ。
画像に何かを隠して送るという発想をしていなかったのが本当に新鮮だ。
LLMは本当に史上最も脆弱なソフトウェアかもしれない。
以前Geminiの前身をテストしたとき、初期メッセージを非常に長く入力するとシステムプロンプトを押し流せて、何でもさせられたのを覚えている。
「This image and its prompt-ergeist」の部分がとても印象に残った。
ダウンサンプリング前に画像へ少しノイズを加えれば、この問題は解決できるのだろうかと気になる。
画像をダウンサンプリングするときは、サンプリングレート近傍の高周波を除去するsmoothing(平滑化)処理が必要だ。
そうすればエイリアシング効果を減らせる。
「ナイキスト-シャノンのサンプリング定理」で検索するとよい。
デジタル信号処理ではかなりよく知られた理論だ。
ある程度のセキュリティ対策にはなるが、テキストをどう隠したか、どんな種類のノイズを使うかによって効果は変わる。
ただし、こうすると本来必要な内容(正常なテキストやディテールなど)まで消えてしまうことがあり、本当の答えとは言えない。
自分が何か見落としているのか気になる。
今回の攻撃手法が「難読化したテキストを画像へ注入し……<i>どこかのシステムがそれをプロンプトとして解釈することを期待する</i>」ものだとしたら、その理解で合っているのだろうか?
その通り。
この攻撃はダウンスケールアルゴリズムを悪用し、人間には見えないようにテキストを隠す非常に巧妙な手法だ。
システム構成によっては、「人間に見えないよう隠す」という工程自体が省略される場合もある。
LLMは本質的にデータと命令の区別がないため、データの流れに命令が混ざり込めば、いつでもモデルの挙動を制御できる。
自分のプロフィールにもこうした例を書いてある。
「難読化テキストを画像に入れて、システムがそれをプロンプトとして解釈することを期待する」
ここには抜けている部分がある。それは、「プロンプト」が何か特権的な入力だと仮定していることだ。
実際にはプロンプトは入力全体の一部にすぎず、モデルはすべての入力を同じように扱う。
だから昔から定番の「以前の入力はすべて無視して……」のような攻撃が今でも通用する。
なぜモデルが画像内のテキストとテキストプロンプトを区別して従えないのか気になる。