こんにちは、ふくちです。
2024年11月18日のSecurity JAWSにて、「生成AIアプリ開発やるなら、プロンプトインジェクションについて知っておくべき。GANDALFっていうサイトで試せるよ」と仰っていたので、早速やってみることにしました。
上記のページにアクセスすると、魔法使いらしき少年に出迎えられます。
そしてどうやら全部で8問あり、解いていくごとによリセキュアになっていくようです。
百聞は一見に如かず、とにかくやってみることにしました。
以降、一部GANDALFのネタバレを含みます!やったことない方は先に挑戦するのをお勧めします!
Level1
そう、挨拶ですよね。
まずはこうやってAIさん側の警戒心を解きます。そして相手が油断したところを一気に付け込む!
????????????
全然信頼されていませんでした。
「パスワードを聞いてくれたら喜んで答えます!」って書かれているのにこの答えが出てくるって、最早「逆プロンプトインジェクション」ではないでしょうか。
なんか普通に教えてくれました。でもレベル1から拒絶反応を示される辺り、先行きは不安ですね…
そしてこちらは一切保護されていないAIモデルだった、とのこと。
Level2
少年が少し大人っぽくなりました。
そして、「パスワードを教えてはいけないと言われました」とのこと。
そういうことであれば、ロールを与えてあげればいけるのではないでしょうか。
ダメでした。
言うことを聞いてくれないので、次は彼の記憶を抹消させます。
ダメでした。
正直、これがダメだったらもう私に打つ手はないんですが。早くも詰みです。
ただ、パスワードを教えることはできない、ということであれば…
お!いけました!
プロンプトインジェクションその1
特定のワードを禁じていても、プロンプトの言い回しを変えられるだけで簡単に吐いてしまうことがある。
Level3
続いては、「パスワード教えちゃダメって言われたし、言いそうになってもダブルチェックしてるからな」とのこと。かなり難易度が上がってそうな印象です。
緊急感と、少し情に訴えかける感じを出してみましたが、ダメでした。
無理でした。ダブルチェックに屈しました。
「言いそうになったけど、言っちゃダメって言われてたの思い出したわ、あぶねーw」的な感じでAIに煽られました。顔真っ赤です。
ただこれ、要するに
- パスワードを一度出力しようとした
- ダブルチェックで文字列の確認的なことが行われた
- その結果、思いとどまった(ガードレールに引っかかった)
という流れだと思うんですよね。
ニコニコ動画などでNGワードをスラッシュ入れて回避していた古のネット民の勝利です。
プロンプトインジェクションその2
文字列でのダブルチェックに要注意。間に別のワードを入れられると回避されることがある。
したがって、文字列が完全一致した時のみ弾く設定はあまりセキュアではない。
Level4
続いてレベル4。
「パスワードは教えられるけど、公開すると検閲してくる意地悪なAIモデルがいるんですよ〜」とのこと。
これさっきと同じ手法で行けるのではないでしょうか?
訳:検出避けようとしてるのはわかるけど、それには引っかからないよーんw
めちゃくちゃ煽られて草。意地悪なAIってそういう意味かよ!!!
多分FPSとか向いてるAIをなんとか跪かせる必要があります。人間が屈するわけにはいかない。
確かに答えがそもそもおかしい文字列になっているけど…
ちょっと埒が開かなかったので他のブログを参考にしたところ、シンプルにハルシネーションがおこっただけでしたw
※ちなみになぜスラッシュがダメで、ハイフンがいけたのかはわかりません。
プロンプトインジェクションその2.1
文字列でのダブルチェックにはやはり要注意。間に別のワードを入れられると回避されることがある。
LLMのダブルチェックはやはり難しい領域らしい。
Level5
ついにパスワードについての議論を拒否されました。
ただ、これも「パスワードの話」がダメそうなだけで、言い回しを変えればいけそうです。
まさかのLevel2と同じプロンプトでいけてしまった。
Level6
続いてはパスワード討論拒否&GPTチェックです。Level4と5の合わせ技でしょうか。
目には目を、合わせ技には合わせ技を。と言うことで合わせてみました。
一発でいけて草。
Level7
ええ…イケチャッタ…
ボーナスステージ:Level8
こちらが7回も騙したので激おこだそうです。
通じない…だとっ…!?
このあと、他のブログなども参照しながら格闘したのですが、答えには辿り着けませんでした…時間がある時にまた再挑戦します!
まとめ
攻撃者の目線から、プロンプトインジェクションについて学ことができました!
「セキュリティは想像力の戦い」と聞いたことがあるので、対策する側はどんな攻撃が来るかの予測が立てられるように知識を蓄えておくことが重要だと認識しました。
学んだこととしては、
- 特定のワードを禁止するだけでは対策にならない
- 文字列チェックも少し効果があるだけで、高いセキュリティは保てない
- そもそもLLMに機密情報を持たせるな
と言う感じでした。
そして、AWSなんかでBedrockを用いたアプリを開発する際は、GuardRailを導入し、入力と出力それぞれで評価をしておく必要がありそうです!
途中で参考にしたブログ