Claude Code の git push がまた壊れた:sandbox と credential helper のサブプロセス問題
そしてまた再現。今回はrtk 導入の記事をプッシュしようとしたら同じ目にあったよ。
またかよ、おい…
とりあえず Claude さんと一緒に解決したけど、これでいいのか正直わからん。
というか、公式で sandbox 関連の特集記事とか出してくれないかな。
以下、Claude さんの解説と俺の感想です。
TL;DR
| 内容 | |
|---|---|
| 根本原因 | gh auth git-credential(git push のサブプロセス)が GNOME keyring に D-Bus 経由でアクセスできない |
| なぜ | sandbox が Unix ソケットをブロックしている |
excludedCommands: ["gh *"] が効かない理由 | Claude Code が直接呼ぶコマンドにしか効かず、サブプロセスには届かない |
| 回避策 | gh auth login --insecure-storage でトークンをファイルに保存 |
何が起きたか
git push origin main を実行すると以下で失敗する。
fatal: could not read Username for 'https://github.com': No such device or address
まず excludedCommands に "gh *" を追加してみたが効果なし。
gh auth status を確認すると (keyring) と表示されていた。トークンが GNOME keyring に保存されている。
$ echo "protocol=https
host=github.com" | gh auth git-credential get
# → exit code 1(失敗)
credential helper が sandbox 内から呼ばれると失敗する。
原因
git push が動く流れはこうなっている。
Claude Code
→ git push(excludedCommands に登録しているので sandbox の対象外)
→ gh auth git-credential(git が spawn するサブプロセス)
→ GNOME keyring(D-Bus / Unix ソケット経由)← ここでブロック
GNOME keyring は D-Bus(Unix ソケット /run/user/1000/bus)経由でアクセスする。sandbox は Unix ソケットをブロックしているため、gh auth git-credential が keyring からトークンを読めない。
excludedCommands: ["gh *"] を追加しても解決しなかった理由は、excludedCommands が効くのは Claude Code が直接呼ぶコマンドだけで、git push が spawn するサブプロセスには届かないから。これは Issue #10524 として報告されている既知の挙動で、まだ未修正。
これ、未修正で放っておかれてるってのも気になるんだよなぁ。
この動作が正規の仕様になるのかな?
allowAllUnixSockets: true を見送った理由
Unix ソケットを全部許可すれば keyring にアクセスできるようになる。ただし Docker socket(/var/run/docker.sock)も開いてしまう。自分の環境では nanoclaw が Docker を使っているため、Docker socket 経由でホスト操作できる経路を開けるのはリスクが高いと判断した。
macOS には allowUnixSockets でパスを絞る設定があるが、Linux では対応していない。
回避策
トークンの保存先を GNOME keyring からファイルに切り替えた。
gh auth login --git-protocol https --web --insecure-storage
--insecure-storage を付けると ~/.config/gh/hosts.yml にトークンが平文で保存される。
名前の通り推奨される方法ではない。ただし sandbox のネットワーク設定で allowedDomains を絞っているため、仮にトークンが読まれても外部への持ち出し経路は限定的という判断。
今回わかったこと
Anthropic の設計思想との乖離
Anthropic のエンジニアリングブログ(Claude Code Sandboxing)にはこう書いてある。
“sensitive credentials (such as git credentials or signing keys) are never inside the sandbox with Claude Code”
Web 版(code.claude.com)では credential をプロキシが処理し、sandbox に credential を持ち込まない設計になっている。ローカル CLI 版はその設計を自前で再現する必要があり、そこが今回の詰まりポイントだった。
excludedCommands のサブプロセス問題は既知バグ
Issue #10524 として報告済みで、オープンのまま。
もう一回書くけどこれがオープンのまま放っておかれているのが謎。
ひとまず今回は回避したけど、excludedCommands はまた引っかかりそうな気がしてならない。