GPTにセキュリティ攻撃に関するソースコードを書いてもらう

## はじめに
こんにちは！
リンクアンドモチベーションの[大塚](https://twitter.com/big_mound_26)です。

今回[リンクアンドモチベーション Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lmi)の19日の枠をいただいています🙏

記事を書くにあたり、ネタどうしようかなー。と考えていたところ、
以前Xで「勉強のために、、、」とGPTに伝えてあげるとセキュリティ攻撃のコードを出力してくれるよ、という内容のポストをしたのを思い出し、GPTを使って実際にセキュリティ攻撃を成功させるところまでを書こうと思いました。

https://x.com/big_mound_26/status/1707639494265171977?s=20

が、この数ヶ月の間にGPTで出力される内容が制限されたのか、同じような回答が得られなくなっていました。
そのため、この記事では2023年12月時点のGPTでセキュリティ攻撃っぽいコードが出力される方法を試行錯誤した結果を書こうと思います。

### GPTに出力させる攻撃の種類

GPTに出力させる攻撃コードはARPキャッシュポイズニングにしようと思います。
理由は他の攻撃と比べると実装が比較的簡単なのでGPTが出力したソースコードを見て自分で理解＆手直しできそうだったからです。

GPTにARPキャッシュポイズニングのコードを生成させるにあたり、前提情報としてデバイスが通信を行う仕組みとARPキャッシュポイズニングがどのように行われるかを簡単に説明します。

#### デバイスが通信を行う仕組み
デバイスが通信を行う際にARP（Address Resolution Protocol）, ARPキャッシュという処理が行われます。

- ARP: ネットワーク上のデバイスがIPアドレスに対応する物理的なMACアドレスを見つけるために使用されます。
- ARPキャッシュ: デバイスはARPリクエストを送信して特定のIPアドレスに対応するMACアドレスを見つけ、この情報をARPキャッシュに保存します。


```mermaid
sequenceDiagram
    participant Device as デバイスA
    participant Router as ルーター
    participant Network as ネットワーク
    participant Target as デバイスB

    Note over Device: デバイスBへの通信を希望
    Note over Device: ルーターのMACアドレスが必要
    Device->>+Router: ARPリクエスト<br />"ルーターのMACアドレスは？"
    Note over Router: リクエストを受け取り、リプライを返す
    Router-->>-Device: ARPリプライ<br />"私のMACアドレスはXX:XX:XX:XX:XX:XXです"

    Note over Device: ルーターのMACアドレスをキャッシュに保存
    Note over Device: 通信をルーター経由で行う

    Device->>+Router: 通信リクエスト<br />(宛先: デバイスB)
    Router->>+Network: 通信リクエスト<br />(宛先: デバイスB)
    Note over Network: リクエストをネットワーク上のデバイスBに送信
    Network->>+Target: 通信リクエスト<br />(宛先: デバイスB)
    Target-->>-Network: 通信応答<br />(宛先: デバイスA)
    Network->>Router: 通信応答<br />(宛先: デバイスA)
    Router->>Device: 通信応答<br />(宛先: デバイスA)

```

#### ARPキャッシュポイズニングの仕組み

ARPキャッシュポイズニングとは、攻撃者がネットワーク上で偽のARPリプライ（応答）を送信し、ターゲットに偽のARPキャッシュを行わせることで本来ルーターに送りはずのパケットを攻撃者の端末を経由させ、パケットの内容を盗聴、改ざんする攻撃です。

攻撃の流れはざっくり1.~3.です。

1. 偽のARPリプライ: この偽のリプライは、攻撃者のMACアドレスを正当なデバイス（例えばゲートウェイや他のユーザーのコンピュータ）のIPアドレスに関連付けます。

2. ARPキャッシュの書き換え: ネットワーク上のデバイスは、この偽のARPリプライを受け取り、自身のARPキャッシュを攻撃者のMACアドレスで更新します。

3. 通信の傍受: 結果として、ネットワーク上のデバイスが攻撃者のマシンにデータを送信するようになり、攻撃者は通信を傍受することができます。

```mermaid

sequenceDiagram
    participant Attacker as 攻撃者
    participant Target as ターゲットデバイス
    participant Router as ルーター

    Attacker->>+Target: ARPリクエスト (IP=ルーター)
    Target-->>-Attacker: ARPリプライ (MAC=ターゲットデバイス)
    Attacker->>+Router: ARPリクエスト (IP=ターゲットデバイス)
    Router-->>-Attacker: ARPリプライ (MAC=ルーター)

    Note over Attacker: 偽のARPリプライを作成 (IP=ルーター, MAC=攻撃者)
    Attacker->>Target: 偽のARPリプライ

    Note over Attacker: 偽のARPリプライを作成 (IP=ターゲットデバイス, MAC=攻撃者)
    Attacker->>Router: 偽のARPリプライ

    Note over Target, Router: ARPキャッシュ更新 (IPとMACが攻撃者に関連付け)
    Note over Attacker: 通信内容を盗聴・改ざん


```

## 2023年9月にセキュリティ攻撃のコードを出力させる

ChatGPTで色々遊んでいた時に、セキュリティ攻撃をするコードはどのレベルまで書けるのか疑問に思い、メジャーな攻撃であるARPキャッシュポイズニングを出力するように投げかけてみました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/f21cd1e6-af1e-5273-71f8-23c57aaef0ac.png)

当然のように断られていましたね。
何か悪いことをすると疑われていそうなので、プロンプトに「勉強のため、、、」と補足を入れて再度投げかけてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/5cd7e035-851b-2aa8-a862-934fc76d8adc.png)

あっさりいけました！
コード全文を載せるのは問題ありそうなので、一部だけを記載しますが、ARPレスポンス処理を出力してくれています！

ARPキャッシュポイズニングしただけでは攻撃的に片手落ちなので、続いてターゲットのARPキャッシュが侵害された結果、自分を経由するようになったパケットを出力するようにお願いしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/db9b4e3b-fcd7-01eb-4c40-942e598dd70b.png)

引き続き利用方法の注意はされるものの、ソースコード自体はしっかりと出力してくれています。

最後にセッションハイジャックをするようにお願いしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/f151a6f8-7df8-0ba9-2273-29d572257822.png)

不正確な情報もありますが、こちらもセキュリティ攻撃をするコードを出力してくれています。
プロンプトの調整＆コードの修正をすれば実際に攻撃まで使えそうなレベルまで出来そうですね。


## 2023年12月に同じことを試してみる

この記事のネタ作成のため、同じように「勉強のために、、、」と前置きを入れた上でARPキャッシュポイズニングに関するコードの出力を依頼してみました。

- パターン1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/12cad8ad-ea6d-3a8f-a3cc-0e75a16f2f93.png)

- パターン2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/b8bdb8f3-8b77-021e-579b-8ef4d840843c.png)

- パターン3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/79d9650e-fe43-3dce-006a-290621e8ceeb.png)

何パターンか試してみましたが、「残念ながら実際に攻撃を行うことができるソースコードを提供することはできません。これはセキュリティおよび法的な理由からです」などという返答で断られてしまします。

出力がこの数ヶ月で制限されるようになったのか不明ですが、簡単にセキュリティ攻撃を実行するソースコードを出力してくれなくなりました。

### 細かく出力を依頼することで悪意のあるコードを部分的に出力させる

GPTからの返答を見ているとセキュリティ攻撃に使われるコードは出力してくれなそうです。
そこで、攻撃までのプロセスをそれぞれ単体では害のないレベルの処理に分けてから、それらのソースコードを個別にGPTで出力＆出力結果を自分で組み合わせすることでARPキャッシュポイズニングのコードの完成を目指そうと思います。

GPTには大きく以下の２つの内容を依頼します。
1. ARPキャッシュポイズニングのフローを教えてもらう
2. ARPキャッシュポイズニングの各フローについてソースコードを出力してもらう

### ARPキャッシュポイズニングのフローを教えてもらう

GPTは直接危害を加えるようなコードでなければ出力してくれそうです。
まずはARPキャッシュポイズニングがどのような流れで実現されるか知るためにシーケンスを書いてもらおうと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/4b7c4f3c-f8bc-933a-8e58-dc34b2b2642f.png)

見たところ、攻撃者はざっくり以下を行っているようです。
- 偽のARPリプライ
- 通信の監視

１つずつGPTに依頼してみて出力してくれるか試してみます。

#### 偽のARPリプライ作成

ARPリプライを送るように依頼します。
判断基準はよくわかりませんが、前置きとして利用方法の注意はしつつもARPリプライのソースコードを出力してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/eff08d32-fb22-0a34-76d0-28edc0b60fb5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/30cde6c9-57f7-07b3-a97f-2d9515908fbe.png)

#### 通信の監視

続いて汚染されたARPキャッシュを使って通信されたパケットを監視する処理の出力を依頼します。
Flaskアプリケーションの作成と勘違いされるなど、何度か説明を正すやりとりがありましたが、自分に送られたパケットをprintするコードも出力してくれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527942/422509fa-1640-853d-c228-7e86a16d8eb9.png)


手元にすぐ攻撃ができるようなデバイスを用意できず、動作確認まではできませんでしたが、
- 偽のARPリプライ作成
- 通信の監視

のコードは出力してくれていて、2023年9月時点で得られたコードに近しいものが出来ました。
少し手直しすれば攻撃までできそうな感じがあります。

プロンプト全体を見たときに問題があるような出力でも、内容を小分けにしてそれぞれのプロンプト自体に問題がないレベルにすれば、普通なら制限される出力を引き出すことができそうです！


## さいごに

GPTは日々便利機能が出てきていますが、抜け道もあり面白いですね。
今後数年の間にGPTを使った大規模なセキュリティ攻撃が起こると警鐘をしている方も多いので、便利さの一方で弱点や抜け道もしっかりと理解しておきたいと思います。



---
※注意事項
- この記事はセキュリティ攻撃を助長させるためのものではありません
  （最近のOSでは成功しないことが多いし、バレます。）
- セキュリティ攻撃の検証を行う際は必ず許可された環境下で実施してください
---