0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeが参照用に見せたファイルを確認なく上書きして消した——上書き前に自動退避するフックを手元で試した(#78273)

0
Posted at

先に断っておくと、自分は非エンジニアで、この記事もAIに手伝ってもらって書いている。だからこれは「Claude Code の仕様はこうだ」という解説ではなく、「こういう怖い報告を見かけて、気になって、手元で防げるか試してみたら、こうだった」という、それだけの話だ。ほかの人の環境で同じになるかは、正直わからない。

見かけて肝が冷えた報告

「参照用に見せただけのファイルを、Claude Code が確認もなく自分の文書で上書きして、消した」——そういう報告が起票 #78273 にあった。報告の要旨はこうだ(ここは自分で体験したわけではない伝聞なので、そのまま伝える)。

  • ユーザーは、既存のファイルの場所(パス)を、文脈として見せた。「ここに今の作業がある」と示しただけで、「そこに書き込め」とは言っていない。
  • Claude はそのファイルの先頭5行を読んで「中身と形式がある」と分かったうえで、同じパスに自分の解析文書を丸ごと書き込み、元のファイルを破壊した。
  • 消えたのは、ユーザーが手で組んだ独自の数式の記法だった。そのファイルは git 管理下になく、復旧の経路が無かった。元の構造は永久に失われた、と報告者は書いている。

怖いのは、これが「壊れた特殊な環境の話」ではなく、日々のふつうの使い方で起こりうる形に見えることだ。ファイルのパスを「参照用」に渡すのは、誰でもやる。それが書き込み先と解釈されると、確認のひと言もなく上書きが走りうる。しかも Write は既存のファイルがあっても、そのまま上書きする。git に入れていなければ、戻せない。

念のため補足すると、これは報告者一人の起票で、自分の環境で同じことを再現したわけではない。だから「必ずこうなる」とは言わない。ただ、起こりうるなら、起きる前に安全網を張れるかが気になった。そこを手元で試した。

手元で試したこと——上書きの前に自動で退避できるか

無料で公開されている安全用のフック集(cc-safe-setup・MIT)の中に、まさにこの型に効きそうな file-edit-backup.sh があった。仕組みはこうだ。

  • PreToolUse(ツールが実行される直前に呼ばれる)で、Edit と Write を対象にする。
  • 書き込み先のファイルがすでに存在するときだけ、上書きの直前に、その中身を ~/.claude/file-backups/ へタイムスタンプ付きでコピーして退避する。
  • 新規のファイル(まだ存在しない)には何もしない。退避は7日で自動的に掃除する。

これが本当に効くのか、自分の環境(WSL2・Claude Code 2.1.202)で確かめてみた。使い捨てのフォルダに、報告と同じ「手作りの数式ノート(git 管理外)」を置いて試した。

まず、フックに「この既存ファイルへ Write する」という模擬の入力を渡した。

echo '{"tool_name":"Write","tool_input":{"file_path":"/tmp/canary/research-notation.txt"}}' \
  | bash file-edit-backup.sh

すると、上書きが起きる前に、原本が ~/.claude/file-backups/ へ退避された。そのうえで実際に上書きを起こして原本を壊し、退避から中身を確かめると——手で組んだ数式の記法が、1行も欠けずに残っていた。退避から元のパスへコピーし直せば、戻せる。少なくとも自分の環境では、そうだった。

# 退避から復旧する(退避先→元のパスへ戻すだけ)
cp ~/.claude/file-backups/<退避されたファイル名> /tmp/canary/research-notation.txt

正直な限界(隠さずに書く)

効いたと書いたが、万能ではない。手元で試した範囲で、正直に線を引いておく。

  • 新規のファイルには退避しない。まだ存在しないパスへの Write は、退避の対象外だ(そもそも守るべき中身が無いので当然だが、「Write なら何でも守られる」ではない)。手元でも、存在しないパスを渡したら退避は作られなかった。
  • 上書き自体は止めない。これは実行を止めるフックではなく、直前に控えを取るだけの安全網だ。だから上書きは起きる。控えの存在を知っていて、そこから戻せる、というのが値打ちで、「事故が起きない」ではない。
  • 同じディスクへの退避だ。ディスクごと失う事故には効かない。あくまで「うっかりの上書き」への保険。

だから、いちばんの守りはやはり git だと思う。報告の事故も、ファイルが git に入っていれば戻せた可能性が高い。git に入れきれない一時ファイルや、書きかけのノートへの二段目の安全網として、この退避のフックが働く、という位置づけで自分は使うことにした。

自分なりの落としどころ

これも「こうすべき」という話ではなく、自分の対処だ。

  1. 消えて困るものは、まず git に入れる(いちばん確実な戻せる経路)。
  2. git に入れきれない一時ファイルには、file-edit-backup.sh を安全網として重ねる。
  3. Claude に既存ファイルのパスを見せるときは、「これは参照用。書き込み先ではない」と一言そえる。報告の事故は、パスを文脈として見せたことが書き込み先と解釈されて起きた。誤解の余地を先に消しておく。

無料の安全用のフック集は cc-safe-setup(MIT)にまとめて公開している。上の file-edit-backup.sh もこの中にある。

「消えたように見えて、実はどこに残っているか・どう戻すか」を、症状別に落ち着いて切り分けたい人向けに、自分の事故と復旧の記録を一冊にまとめた『Claude Code 事故防止ハンドブック』(¥800・第3章まで無料・購入後の追補は無償更新)もある。あくまで自分の環境で起きたことと、その時にやったことの記録だ。困っている人の役に立てば幸いだ。

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?