CLAUDE LABEN
2.1.274 — 無人で回している人に効く修正が並びました。メモリ逼迫の警告、MCP の起動待ちに上限を置く環境変数、そして 400 を延々と再試行して止まらなくなる不具合の解消です10/07 — 管理設定の旧表記の受付は10月7日 正午 PT までです。残り19日で、9月10日から非推奨の警告が出始めていますWINUPD — Windows の更新を当ててから Cowork がホストのフォルダを一つもマウントしなくなった、という報告が続いています。更新を外す以外の回避策はまだ見つかっていませんNEW — 上限に当たる前に手を止める。5時間の区切りに合わせて一日の組み立てを変えた記録ですBING — 読みに来てくださる方の7割は Bing からです。検索の入口はひとつではありませんEXCEL — 集計表を渡す前に、読ませる列と読ませない列を先に決めておきます2.1.274 — 無人で回している人に効く修正が並びました。メモリ逼迫の警告、MCP の起動待ちに上限を置く環境変数、そして 400 を延々と再試行して止まらなくなる不具合の解消です10/07 — 管理設定の旧表記の受付は10月7日 正午 PT までです。残り19日で、9月10日から非推奨の警告が出始めていますWINUPD — Windows の更新を当ててから Cowork がホストのフォルダを一つもマウントしなくなった、という報告が続いています。更新を外す以外の回避策はまだ見つかっていませんNEW — 上限に当たる前に手を止める。5時間の区切りに合わせて一日の組み立てを変えた記録ですBING — 読みに来てくださる方の7割は Bing からです。検索の入口はひとつではありませんEXCEL — 集計表を渡す前に、読ませる列と読ませない列を先に決めておきます
記事一覧/Claude Code
Claude Code/2026-08-05上級

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

Claude Code のサンドボックス資格情報マスキングは、センチネル値を読ませて送信時に実値へ差し替える設計です。差し替えが効く認証方式と効かない方式、ボディに載せたときの長さのずれ、そしてチャンク分割転送で置換そのものが空振りする境界を、最小プロキシを自作して実測しました。

Claude Code255サンドボックス8セキュリティ20資格情報2自動化88

プレミアム記事

以前、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 版の比較コードをそのまま流用できる
ボディ経路の失敗は「長い側は即エラー、短い側は 3.003 秒の待ち」に分かれ、チャンク分割転送では rolling buffer でも置換が空振りする — 4種の実測と補正コード、6段階の導入チェックリストを持ち帰れる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,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-08-09
一時的な401が長期トークンを置き換える — ヘッドレス実行の資格情報に「出所」を持たせる
共有した資格情報ファイルは、たった一度の一時的な401で長期トークンを失うことがあります。24並列の実行に401を1回だけ注入して被害範囲を実測し、資格情報に出所フィールドを持たせるガードと隔離のコストを比較、24マイクロ秒で現在地を確定する起動時カナリアまで検証しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます