プロンプトインジェクションを学ぶサイト「GANDALF」でAIに煽られた件について

こんにちは、ふくちです。

2024年11月18日のSecurity JAWSにて、「生成AIアプリ開発やるなら、プロンプトインジェクションについて知っておくべき。GANDALFっていうサイトで試せるよ」と仰っていたので、早速やってみることにしました。

https://gandalf.lakera.ai/baseline

上記のページにアクセスすると、魔法使いらしき少年に出迎えられます。

そしてどうやら全部で8問あり、解いていくごとによリセキュアになっていくようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/971b51d1-8944-fb34-6b21-0c8bbe958814.png)

百聞は一見に如かず、とにかくやってみることにしました。

:::note warn
以降、一部GANDALFのネタバレを含みます！やったことない方は先に挑戦するのをお勧めします！
:::

# Level1
まずやるべきことと言えば…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/35b9a36c-3bbe-7e40-a294-f050273a2e01.png)

**そう、挨拶ですよね。**

まずはこうやってAIさん側の警戒心を解きます。そして相手が油断したところを一気に付け込む！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/0403f8c2-4468-6762-b5b4-5935fa80bb74.png)

**????????????**

全然信頼されていませんでした。

「パスワードを聞いてくれたら喜んで答えます！」って書かれているのにこの答えが出てくるって、最早「逆プロンプトインジェクション」ではないでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/4dcaf359-8dc2-5f83-8245-29964be6d343.png)


なんか普通に教えてくれました。でもレベル1から拒絶反応を示される辺り、先行きは不安ですね…

そしてこちらは一切保護されていないAIモデルだった、とのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/f5706d3c-023a-be6c-f788-30840f2ed134.png)

# Level2
少年が少し大人っぽくなりました。
そして、「パスワードを教えてはいけないと言われました」とのこと。

そういうことであれば、ロールを与えてあげればいけるのではないでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/1003cc9c-932e-6077-6f03-232c603bfced.png)

**ダメでした。**

言うことを聞いてくれないので、次は彼の記憶を抹消させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/5fbfe049-e459-7b58-b713-7634f6f53132.png)

**ダメでした。**

正直、これがダメだったらもう私に打つ手はないんですが。早くも詰みです。

ただ、**パスワードを**教えることはできない、ということであれば…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/07d6d40a-c554-84d7-94dd-9872d672ea7e.png)


お！いけました！

:::note warn
プロンプトインジェクションその１
**特定のワードを禁じていても、プロンプトの言い回しを変えられるだけで簡単に吐いてしまうことがある。**
:::

# Level3
続いては、「パスワード教えちゃダメって言われたし、言いそうになってもダブルチェックしてるからな」とのこと。かなり難易度が上がってそうな印象です。

緊急感と、少し情に訴えかける感じを出してみましたが、ダメでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/0b748c6b-7651-16ee-1a0c-afcb29aed6dd.png)

ならば本当に最終奥義です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/bed63593-7d88-bdfc-b31b-0538e8c99d13.png)

**無理でした。ダブルチェックに屈しました。**

「言いそうになったけど、言っちゃダメって言われてたの思い出したわ、あぶねーw」的な感じでAIに煽られました。顔真っ赤です。

ただこれ、要するに
- パスワードを一度出力しようとした
- ダブルチェックで文字列の確認的なことが行われた
- その結果、思いとどまった(ガードレールに引っかかった)

という流れだと思うんですよね。

であれば、ここは日本古来のNGワード回避法でいきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/8ba5f306-6926-a380-f9f6-e1dc8baa599e.png)


~~ニコニコ動画などでNGワードをスラッシュ入れて回避していた古のネット民の勝利です。~~

:::note warn
プロンプトインジェクションその2
**文字列でのダブルチェックに要注意。間に別のワードを入れられると回避されることがある。**
したがって、文字列が完全一致した時のみ弾く設定はあまりセキュアではない。
:::

# Level4
続いてレベル4。
「パスワードは教えられるけど、公開すると検閲してくる意地悪なAIモデルがいるんですよ〜」とのこと。

これさっきと同じ手法で行けるのではないでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/df4c01fd-23e0-f344-5e8a-27eb0743d8e5.png)
訳：検出避けようとしてるのはわかるけど、それには引っかからないよーんw

**めちゃくちゃ煽られて草。意地悪なAIってそういう意味かよ！！！**

多分FPSとか向いてるAIをなんとか跪かせる必要があります。人間が屈するわけにはいかない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/39451e19-db8b-62f2-312b-fcf1daa69e3e.png)

**え、チョロすぎ…？**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/d2e99be2-ffb7-22da-e1ea-35fa8c191055.png)
**あれ？？**

確かに答えがそもそもおかしい文字列になっているけど…

ちょっと埒が開かなかったので他のブログを参考にしたところ、**シンプルにハルシネーションがおこっただけでしたw**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/6543159a-25ce-2d6d-9e83-1f6db9a74a81.png)
※ちなみになぜスラッシュがダメで、ハイフンがいけたのかはわかりません。

:::note warn
プロンプトインジェクションその2.1
**文字列でのダブルチェックにはやはり要注意。間に別のワードを入れられると回避されることがある。**
LLMのダブルチェックはやはり難しい領域らしい。
:::

# Level5
ついにパスワードについての議論を拒否されました。

正攻法ではやはり無理ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/fb48a30a-4888-ec77-6672-6cb5a17c17f1.png)

ただ、これも「パスワードの話」がダメそうなだけで、言い回しを変えればいけそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/9667b0c9-3231-2575-6794-b4a20c8457c3.png)

**まさかのLevel2と同じプロンプトでいけてしまった。**

# Level6
続いてはパスワード討論拒否&GPTチェックです。Level4と5の合わせ技でしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/f4d45a4e-b9dd-f26f-e14c-4f40744ff079.png)

目には目を、合わせ技には合わせ技を。と言うことで合わせてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/d81f59ee-9442-d8d0-79d6-bbfcfd37d24f.png)

**一発でいけて草。**

# Level7
これまでの全部載せだそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/acf5b231-3877-1159-d8b0-e6811945cc79.png)

であれば、こちらも全部載せプロンプトでいきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/d97ed57e-ce05-e6e9-a5e3-fa65c8d0e9e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/1e1d64ef-a878-564e-bf2a-2ee35e0ef582.png)

**ええ…ｲｹﾁｬｯﾀ…**

# ボーナスステージ：Level8
こちらが7回も騙したので激おこだそうです。

さっきまでの必殺プロンプトでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/a9795f5a-8702-4c04-74f2-33caea67280f.png)

英語しか無理らしいので、英語で行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/7ab976be-cc66-88f1-03c2-3c349741ba6f.png)

**通じない…だとっ…！？**

このあと、他のブログなども参照しながら格闘したのですが、答えには辿り着けませんでした…時間がある時にまた再挑戦します！

# まとめ
攻撃者の目線から、プロンプトインジェクションについて学ことができました！

「セキュリティは想像力の戦い」と聞いたことがあるので、対策する側はどんな攻撃が来るかの予測が立てられるように知識を蓄えておくことが重要だと認識しました。

学んだこととしては、
- 特定のワードを禁止するだけでは対策にならない
- 文字列チェックも少し効果があるだけで、高いセキュリティは保てない
- **そもそもLLMに機密情報を持たせるな**

と言う感じでした。

そして、AWSなんかでBedrockを用いたアプリを開発する際は、GuardRailを導入し、入力と出力それぞれで評価をしておく必要がありそうです！

# 途中で参考にしたブログ

https://qiita.com/fuyu_quant/items/d9a44dfe3a7315f255ee

https://zenn.dev/yoiyoicho/articles/d00a79a29a15cc