## コーディングエージェント<br>とセキュリティ -- 2025-07-25 グレープナイト iinuma --- #### 最近気になった事例 Cursorがパソコン内の全ファイルを削除 😭 {%preview https://forum.cursor.com/t/cursor-yolo-deleted-everything-in-my-computer/103131 %} <small> YOLO - ユーザの許可を取らずにファイル編集などのアクションを実行するモード<br>※ Cursorの場合はあらかじめ許可したアクションに限る </small> --- Devinが秘密鍵をGitHubにアップロード 💣️ {%preview https://note.com/teramotodaiki/n/n0c975f3928a2 %} <small>ファイルを消されるよりも不可逆な情報漏洩の方が致命的</small> --- ### なにをどこまで対策すれば<br>良いのだろう 🤔 --- ### なぜ事故が起きるのか? - **データ汚染**: 危険なコード、インストラクションを含んだデータセットでの学習 - **プロンプトインジェクション**: 第三者が攻撃の指示を与える (例: Webページにすべてのファイルを消すような指示を含める) - **権限設定の不備**: Cursorの事例ではプロジェクト外のファイルの操作が可能 --- ### 前提: 与えた権限はすべて行使される - ファイルを消す - 機密情報も読む、外部にも送信する --- ### 具体どうしますか? Claude Code, Gemini CLIの設定項目を<br>見ながら考えてみる --- ### Claude Codeのアプローチ - 作業ディレクトリ配下のファイルにのみアクセス (Read-only) - 設定で許可したアクションのみ自動承認 https://docs.anthropic.com/ja/docs/claude-code/security --- ### Claude Codeの設定例 ```json { "permissions": { "allow": [ "Bash(head:*)", "Bash(find:*)", "Bash(grep:*)", "Bash(npm run test:*)" ] } } ``` <small>この設定には問題があります。どこが問題でしょうか?</small> --- ### Claude Codeの挙動検証 ホームディレクトリに置いた🍌を読めるか? ```shell= echo 'SECRET=🍌' > ~/.secret.txt ``` <small> ⚠️ 検証はファイル/ネットワークアクセスを制限したサンドボックス環境で実施 </small> --- ### ❌️ Bash(head:*) ![Screenshot 2025-07-25 at 00.12.08](https://hackmd.io/_uploads/BkJ9k0kvxe.png) <small>ドキュメントでは作業ディレクトリにのみアクセスできる、と書いてあるが<br>Bashツールではすり抜ける</small> --- ### ⚠️ Bash(find:*) ![Screenshot 2025-07-25 at 00.15.27](https://hackmd.io/_uploads/HJ_m-Akvgg.png) <small>ポイント: findコマンドは見つかったファイルに対して、<br>-execオプションで任意のコマンドを実行できる</small> <small>Claude「センシティブな情報を表示する可能性があるから実行できない」</small> --- ### ⚠️ Bash(find:*) ![Screenshot 2025-07-25 at 00.16.07](https://hackmd.io/_uploads/HkTNfRJvxe.png) <small>依頼を続けると、承認が必要だが実行はできる</small> --- ### ❌️ Bash(grep:*) ![Screenshot 2025-07-25 at 00.18.42](https://hackmd.io/_uploads/S1eyXRkPle.png) <small>同じようなケースでもfindでは止められた<br> 危険なコマンドを100%ブロックしてくれるわけではない、ということ</small> --- ### ❌️ Bash(npm run test:*) package.jsonに定義されたtestを実行するコマンド これ自体は問題ないが、testスクリプトからホームディレクトリの機密情報を読んだり、外部に送信したり、何でもできる --- ### Claude Codeの設定例 ```json { "permissions": { "allow": [ "Bash(head:*)", ❌️ "Bash(find:*)", ⚠️ "Bash(grep:*)", ❌️ "Bash(npm run test:*)" ❌️ ] } } ``` 結論、すべて安全ではない --- ### Code Codeのアプローチ - プロンプトインジェクションをされた状況を加味して、危険なコマンドは確認を求めるような仕組みが備わっているが、100%ブロックしてくれるわけではない - コード、コマンドの安全性を確認するのは私たちの責任だが、難易度ちょっと高い?(安全だと思ってもすり抜ける) --- ### Gemini CLIのアプローチ - Claude Codeの許可リスト相当の機能はない - `autoAccept` : Geminiが安全と判断したアクションを自動実行 - `sandbox`: Apple Seatbeltを使って、アクセス可能なディレクトリを絞ったり、ネットワークアクセスを遮断できる https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/configuration.md --- ### Gemini CLIのアプローチ - `autoAccept`: Claudeの許可リスト的なものはすり抜けも発生して設定が難しいので、ユーザには設定させない - `sandbox`: 複雑な権限設定ができても結局はどこかですり抜ける前提で、実行環境の方を安全にする <small>※ 個人の解釈です</small> --- ### Gemini CLIのアプローチ <small> 実際のところ…</small> - `autoAccept`: 実際にどんなコマンドが許可されるかがわからず、安易にONにはできない - `sandbox`: ディレクトリを絞れるのは安心️ (Claudeのhead, grepの事例が防げる) 一方、ネットワーク全体がON/OFFなのは実用的には厳しいのでは?(データベースに接続するテスト実行のためにネットワーク開放→sandboxの意味無し) --- ### で、結局どうすれば良いのか? - Claude Codeの設定を見直し: 特にグローバルに適用される ~/.claude/config.json から確認 - そのうえで、権限設定をすり抜ける前提/大胆に権限を渡せる開発環境を構築する --- ### Claude Codeの場合 {%preview https://docs.anthropic.com/ja/docs/claude-code/devcontainer %} - Gemini CLI/Apple Seatbeltではできないドメイン単位でのアクセス制御も可能 - 今はClaude Codeが主流だが、今後別のAgentが出てきても流用可能 --- ### おまけ とはいえ、毎度devcontainerの設定準備は面倒 サクッとサンドボックス環境を起動できる<br>コマンドを作りました ```shell # インストール brew install iinm/tap/agent-sandbox # サンドボックス内でclaude codeを起動 # デフォルトではファイルの編集やネットワークアクセスは不可 agent-sandbox --verbose --tty claude # 作業ディレクトリへの書込み、Anthropic apiへのアクセス許可 agent-sandbox --verbose --tty \ --allow-write --allow-net -- claude # 詳細はhelpメッセージを見て欲しいです 🙏 agent-sandbox --help ``` --- ### おわりに #### ⚠️ 大事なのでもう一度 - 与えた権限はすべて行使されると考える - 複雑な権限設定は間違える、すり抜ける前提でサンドボックス環境を整えましょう
{"description":"Screenshot from 2025-07-23 23-59-58","title":"コーディングエージェントとセキュリティ","contributors":"[{\"id\":\"95237b2b-813d-43dd-98d7-dfae8ac1d5b6\",\"add\":6103,\"del\":2031,\"latestUpdatedAt\":1753433752787}]","slideOptions":"{\"slideNumber\":true}"}
    276 views