CLAUDE LABEN
OPUS5 — Claude Opus 5 の提供が始まりました。コーディングと知識労働に向けた、より速く費用効率の高いモデルで、Max では既定・Pro では最上位の選択肢になりますSUNSET — 6月5日に非推奨化された Claude Opus 4.1 は本日8月5日がリタイア日です。API でバージョンを固定している箇所は確認が必要ですFOCUS — VSCode に Focus view が入りました。ツールの実行ログをターンごとの折りたたみ要約に隠し、Ctrl+Alt+F で会話の筋だけを追えますMASK — Linux と WSL でサンドボックスの資格情報マスキングに対応しました。中ではセンチネル値を読み、送信時にプロキシが実値へ差し替えますLEAK — 長時間セッションのメモリリークが修正されました。MCP stdio の stderr 蓄積と、開きっぱなしの LSP ドキュメントが対象ですMCP — MCP 2026-07-28 仕様でステートレスなコアと OAuth・OIDC 認可が入りました。SDK の月間ダウンロードは4億を超えていますOPUS5 — Claude Opus 5 の提供が始まりました。コーディングと知識労働に向けた、より速く費用効率の高いモデルで、Max では既定・Pro では最上位の選択肢になりますSUNSET — 6月5日に非推奨化された Claude Opus 4.1 は本日8月5日がリタイア日です。API でバージョンを固定している箇所は確認が必要ですFOCUS — VSCode に Focus view が入りました。ツールの実行ログをターンごとの折りたたみ要約に隠し、Ctrl+Alt+F で会話の筋だけを追えますMASK — Linux と WSL でサンドボックスの資格情報マスキングに対応しました。中ではセンチネル値を読み、送信時にプロキシが実値へ差し替えますLEAK — 長時間セッションのメモリリークが修正されました。MCP stdio の stderr 蓄積と、開きっぱなしの LSP ドキュメントが対象ですMCP — MCP 2026-07-28 仕様でステートレスなコアと OAuth・OIDC 認可が入りました。SDK の月間ダウンロードは4億を超えています
記事一覧/Claude Code
Claude Code/2026-08-05上級

秘密を渡さず、リクエストだけ通す — サンドボックス資格情報マスキングの差し替えが効く境界

Claude Code のサンドボックス資格情報マスキングは、センチネル値を読ませて送信時に実値へ差し替える設計です。この差し替えが効く認証方式と効かない方式を、最小プロキシを自作して実測で確かめました。

Claude Code211サンドボックス8セキュリティ17資格情報自動化76

プレミアム記事

以前、sandbox.credentials の denyRead で秘密の読み取り面を絞ったとき、ひとつだけ引っかかりが残りました。

「読ませない」は強い制御です。ただ、外部 API を叩く必要のあるジョブには、結局どこかで本物のトークンを渡すしかない。deny で絞れるのは「そのジョブに不要な秘密」までで、「そのジョブが使う秘密」は守れないままでした。

2026年8月5日の changelog で、Linux と WSL 向けにサンドボックス資格情報の mode: "mask" が入ったのを見て、手が止まりました。説明にはこうあります。サンドボックス内のコマンドはセンチネル値のコピーを読み、実際の値はサンドボックスプロキシが送信時に差し替える。

読ませないのではなく、偽物を読ませる。そして出口で本物にすり替える。

この一文の設計がどこまで守ってくれるのかは、仕様の文面だけでは判断できません。差し替えという中核の仕組みを最小構成で作り直し、境界を自分の手で押して確かめました。

「読ませない」から「偽物を読ませる」へ

deny と mask は、守る対象が違います。

deny は露出面の制御です。~/.aws/credentials や不要な環境変数など、そのジョブに関係のない秘密をサンドボックスから見えなくします。ファイルシステムの分離を書き込み面から絞ったときと同じ発想で、触れる範囲そのものを狭める。

mask が守るのは、その先です。ジョブが正当に使う秘密であっても、サンドボックス内のプロセスには実値を見せない。プロセスが読むのは SBX_SENTINEL_... のような無害な文字列で、外向きの通信がプロキシを通過する瞬間にだけ実値へ差し替わります。

この設計の含意は小さくありません。サンドボックス内でプロンプトインジェクションや不正なコードが動いても、盗めるのはセンチネルだけ。センチネルは外の世界では何の権限も持ちません。

ただし、です。「送信時にバイト列を差し替える」という仕組みには、原理的に守れないケースがあるはずです。それを確かめるために、最小のプロキシを書きました。

仕組みを最小構成で作り直す

検証環境は Linux サンドボックス上の Python 3.10.12 です。実際の実装には TLS の扱いなど複雑な層が絡みますが、ここでは「ワイヤ上のセンチネルを実値に置き換える」という中核だけを切り出し、平文経路で再現します。

まず、素朴に書くとこうなります。受け取ったチャンクごとに置換して転送する形です。

# naive 版: recv したチャンク単位でセンチネルを置換する
def handle(client_sock):
    up = socket.create_connection((UPSTREAM_HOST, UPSTREAM_PORT))
    client_sock.settimeout(0.5)
    try:
        while True:
            chunk = client_sock.recv(8192)
            if not chunk:
                break
            # チャンク内に閉じたセンチネルしか置換できない点に注意
            up.sendall(chunk.replace(SENTINEL, REAL_VALUE))
    except socket.timeout:
        pass

一見動きます。ところがこの書き方には、ストリーム処理の古典的な穴があります。センチネルが 2 つの recv チャンクにまたがった瞬間、どちらのチャンクにも完全なセンチネルが存在しないため、置換がすり抜けるのです。

対策は、センチネル長 - 1 バイトのテールを常に手元に残す rolling buffer です。

# rolling buffer 版: センチネルがチャンク境界で割れても取りこぼさない
S = SENTINEL          # bytes
keep = len(S) - 1     # 境界をまたぐ可能性がある最大長
 
def handle(client_sock):
    up = socket.create_connection((UPSTREAM_HOST, UPSTREAM_PORT))
    client_sock.settimeout(0.5)
    buf = b""
    try:
        while True:
            chunk = client_sock.recv(8192)
            if not chunk:
                break
            buf += chunk
            buf = buf.replace(S, REAL_VALUE)
            if len(buf) > keep:
                # テール keep バイトは次のチャンクと結合してから判定する
                up.sendall(buf[:-keep])
                buf = buf[-keep:]
    except socket.timeout:
        pass
    if buf:
        # 接続終了時に残ったテールを最終置換して送り切る
        up.sendall(buf.replace(S, REAL_VALUE))

エラー処理を省いた骨格ですが、keep の持ち越しと終了時のフラッシュが要点です。ここを落とすと、末尾にセンチネルが来たリクエストだけ差し替わらない、という再現しづらい不具合になります。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
センチネル差し替え型マスキングが守れる認証方式と守れない方式を、base64・HMAC の実測結果つきで判別できるようになる
チャンク境界でセンチネルが割れると素朴な置換は取りこぼす — naive 版と rolling buffer 版の比較コードをそのまま流用できる
差し替えプロキシのオーバーヘッド実測(中央値 +0.665ms)と、導入前に自分のジョブを分類する4段階のチェックリストを持ち帰れる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Claude Code2026-08-04
ファイルシステムの分離をネットワークと別に締める — 触ったパスを採り、書き込み面から絞る
Claude Code v2.1.216 でファイルシステムの分離をネットワークと切り離して指定できるようになりました。締める前にジョブが触ったパスを strace で採取し、読み取り面と書き込み面を分けて測った実務メモ。同じジョブを3回走らせたときのパス集合の安定率と、接頭辞に畳んだときの安定率の差まで実測しています。
Claude Code2026-07-25
strictAllowlist で Claude Code サンドボックスの外向き通信を締める
Claude Code v2.1.219 の sandbox.network.strictAllowlist で自動化の外向き通信を締めた実践メモ。接続先を洗い出すスクリプト、失敗までの時間で拒否とDNSと回線を切り分ける実測、許可リストをホスト名で書くべき理由まで。
Claude Code2026-07-19
コミット済みのシンボリックリンクが worktree の外を指す — AI に並列作業を預ける前のリポジトリ点検
Claude Code 2.1.212 で、コミット済みのシンボリックリンクを worktree 作成時に辿ってリポジトリ外へ書きうる不具合が修正されました。パッチが塞いだのは辿りの側です。危険なリンクがコミットされている側を点検する監査スクリプトと、隔離の手順をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →