## コーディングエージェント<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:*)

<small>ドキュメントでは作業ディレクトリにのみアクセスできる、と書いてあるが<br>Bashツールではすり抜ける</small>
---
### ⚠️ Bash(find:*)

<small>ポイント: findコマンドは見つかったファイルに対して、<br>-execオプションで任意のコマンドを実行できる</small>
<small>Claude「センシティブな情報を表示する可能性があるから実行できない」</small>
---
### ⚠️ Bash(find:*)

<small>依頼を続けると、承認が必要だが実行はできる</small>
---
### ❌️ Bash(grep:*)

<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}"}