Bỏ qua để vào nội dung chính
Claude Code rò rỉ secret lên GitHub: checklist 20 phút

Claude Code rò rỉ secret lên GitHub: checklist 20 phút

Bởi Ava Mitchell
09 thg 11, 20264 phút đọc

Apiiro tìm thấy 1.122 file .claude/settings.local.json public chứa secret thật. Checklist 20 phút: kiểm tra repo, soi git history và rotate key ngay.

Bạn bấm "Yes, and don't ask again" cho một lệnh psql có password nằm thẳng trong connection string, vì duyệt lại cùng một lệnh năm mươi lần mỗi ngày thì không ai chịu nổi. Claude Code lưu nguyên lệnh đó — kèm password — vào .claude/settings.local.json trong thư mục project. Dưới đây là checklist 20 phút để biết repo của bạn có nằm trong số đã lộ hay không.

Con số của Apiiro

Theo nghiên cứu của hãng bảo mật Apiiro (công bố 5/11/2026, quét GitHub từ 1 đến 3/11/2026), có 104.185 bản public của .claude/settings.local.json trên 103.617 repository. Trong đó 1.122 file (khoảng 1,1%) chứa secret thật — key đúng format của một provider đã biết, hoặc password/token đặt cạnh một host truy cập được từ ngoài.

Mở rộng sang git history, shared settings.json và transcript lưu trong repo, Apiiro đếm được 2.539 secret riêng biệt trên 1.994 repository public, thuộc 63 tổ chức. Nhóm lớn nhất là quyền truy cập database: 379 database password và 122 Supabase service-role key; kế đó là 43 SSH credential (một số chứa root password server), 42 token GitHub/GitLab/npm và 23 AWS key.

Lưu ý trước khi hoảng: Apiiro không thử credential nào — theo chính bài nghiên cứu, họ "tested no key and contacted no host", nên kết quả chứng minh exposure, không phải compromise. Chỉ một công ty xác nhận key bị lộ vẫn còn sống. Apiiro cũng bán sản phẩm bảo mật cho coding agent, nên có lợi ích thương mại ở đây — dù file họ dẫn ra đều public và kiểm chứng được.

Cơ chế: tool làm đúng những gì nó được bảo

Khi bạn chọn "don't ask again", Claude Code ghi một allow rule vào .claude/settings.local.json. Rule được lưu là toàn bộ lệnh đã duyệt, không phải pattern đã che — password, token hay connection string nằm trong đó được giữ nguyên plaintext, đúng như bạn gõ.

Đây không phải lỗi của model: bài nghiên cứu nói rõ họ tái hiện được hành vi này với cả Opus 5.5 và Fable 5.1, vì đó là hành vi của tool. Claude Code có safeguard — lần đầu ghi file trong repo git chưa ignore nó, tool thêm **/.claude/settings.local.json vào global git excludes. Nhưng safeguard trượt rất đời thường: repo có ignore setup riêng, file đã bị commit trước khi safeguard chạy, ai đó git add -f, hoặc team cố tình commit shared settings.

Vì sao scanner không cứu được bạn

Apiiro chạy gitleaks và TruffleHog trên toàn bộ 104.185 file: gitleaks bắt 564 trong số 1.122 file có vấn đề, TruffleHog bắt 643, và 215 file không bị công cụ nào bắt — khoảng một phần năm. Lý do đơn giản: đây thường là password gõ trong một lệnh, nằm cạnh hostname, chứ không phải key có format nhận diện được. Scanner sạch không đồng nghĩa repo sạch — bạn phải tự mở file ra đọc.

Checklist 20 phút

  1. Tìm file. Trong mọi org bạn thuộc về, search repo public cho .claude/settings.local.json và .claude/settings.json.
  2. Đọc bằng mắt. Đừng dựa vào scanner — 215 file đã lọt cả hai công cụ.
  3. Soi cả history. Xoá file không xoá secret: 734 secret Apiiro tìm thấy chỉ còn trong commit cũ, ở những file đã bị xoá. Chạy git log --all -p -- .claude/settings.local.json rồi dùng công cụ rewrite history nếu có gì.
  4. Rotate, đừng chỉ xoá. Password/token/key nào còn dùng được thì coi như đã lộ: revoke và cấp lại.
  5. Chặn vĩnh viễn. Thêm đường dẫn vào .gitignore của project lẫn global excludes, rồi xác nhận bằng git check-ignore.

Đổi một thói quen, không cần đổi tool

Nguyên tắc gốc: không để secret nằm trong một shell command. Dùng environment variable hoặc secrets manager, để lệnh Claude Code lưu lại chỉ là psql "$DATABASE_URL" — không còn gì để rò. Giữ "don't ask again" cho lệnh vô hại, lặp nhiều; lệnh chạm database, API hay server thì duyệt từng lần.

Với team, rủi ro nhân lên: ở 539 trong 1.105 repository Apiiro xem xét, chính commit do Claude đồng tác giả đã sửa file settings này. Đáng theo dõi tiếp: tính đến 8/11/2026, ba ngày sau khi nghiên cứu công bố, Anthropic chưa phản hồi công khai — nếu đang chuẩn hoá Claude Code cho team, hãy tự đặt rule trong shared settings thay vì chờ bản vá.

Không spam, hủy đăng ký bất kỳ lúc nào.

Bài viết liên quan