Công Nghệ AI

Claude Code "Don't Ask Again" Lộ Mật Khẩu: 1.122 Tệp Trên GitHub, Bốn Báo Lỗi Đều Bị Đóng

Ban Biên Tập Locaith ·

Claude Code "Don't Ask Again" Lộ Mật Khẩu: 1.122 Tệp Trên GitHub, Bốn Báo Lỗi Đều Bị Đóng

Bấm "Yes, and don't ask again" khi Claude Code xin chạy một lệnh có mật khẩu, và nguyên lệnh đó, mật khẩu đi kèm, được ghi vào tệp .claude/settings.local.json trong thư mục dự án. Nghiên cứu của công ty bảo mật Apiiro công bố ngày 5/11/2026 đếm được 104.185 bản tệp này công khai trên GitHub, trong đó 1.122 tệp chứa khoá hoặc mật khẩu thật. Locaith đã cộng lại các con số của Apiiro, đối chiếu với tài liệu của Claude Code và mở bốn báo lỗi họ dẫn: cả bốn đều đã đóng, không có câu trả lời nào từ Anthropic, và báo lỗi cuối cùng bị bot tự đóng đúng ngày bài nghiên cứu ra.

Cơ chế: một nút bấm tiện lợi ghi nguyên văn lệnh vào tệp

Tài liệu cài đặt của Claude Code xác nhận phần cơ chế: khi bạn chọn "Yes, and don't ask again" cho một lệnh Bash, Claude Code lưu sự cho phép đó thành một quy tắc allow trong .claude/settings.local.json, ở gốc kho mã. Apiiro chỉ ra chỗ quan trọng: quy tắc chính là chuỗi lệnh. Nếu lệnh là PGPASSWORD=... psql -h máy-chủ-công-khai, hay sshpass -p ... ssh root@..., hay curl kèm tiêu đề Authorization: Bearer, thì bí mật nằm luôn trong quy tắc. Apiiro nói đã tái hiện hành vi này với Opus 5.5 và Fable 5.1, và đây là hành vi của công cụ chứ không phải của mô hình.

Tệp này vốn được thiết kế để ở lại trên máy. Tài liệu viết Claude Code thêm nó vào danh sách bỏ qua toàn cục của git (global git excludes) lần đầu ghi tệp; nếu bạn tự tạo tệp thì phải tự thêm vào .gitignore. Apiiro nêu các trường hợp lọt lưới: thư mục chỉ trở thành kho git sau đó, bản sao trên máy khác, hoặc tệp đã lỡ commit từ trước. Quy tắc bỏ qua không nằm trong .gitignore của chính kho, nên không đi theo dự án.

Ví dụ tệp .claude/settings.local.json minh hoạ: danh sách allow có lệnh npm run build, một lệnh sshpass chứa mật khẩu root và một lệnh curl chứa bearer token; so sánh quy tắc an toàn Bash(npm run:*) với quy tắc lộ bí mật chứa nguyên chuỗi kết nối cơ sở dữ liệu
Tệp minh hoạ do Apiiro dựng theo các tệp thật, giá trị đã che. Quy tắc dạng mẫu (Bash(npm run:*)) không chứa bí mật; quy tắc chép nguyên lệnh thì có. Ảnh: Apiiro.

Các con số, và Locaith cộng lại thế nào

Apiiro thu dữ liệu bằng tìm kiếm mã và commit chỉ đọc trên GitHub từ 1 đến 3/11/2026, chia truy vấn theo kích thước tệp để vượt trần 1.000 kết quả, rồi tải về từng tệp. Bảng dưới là số của Apiiro; cột cuối là phép kiểm của Locaith.

Chỉ số (Apiiro công bố) Giá trị Locaith kiểm
Bản .claude/settings.local.json công khai104.185 tệp trong 103.617 khoCộng sáu nhóm kích thước trong biểu đồ của Apiiro ra đúng 104.185
Tệp chứa bí mật thật1.122 (1,1%)1.122 / 104.185 = 1,08%; nhân tỉ lệ từng nhóm kích thước ra khoảng 1.120, khớp
Bí mật khác nhau trong các tệp đó1.379 (636 khoá đúng định dạng nhà cung cấp + 743 mật khẩu/token kèm máy chủ công khai)636 + 743 = 1.379. Nhưng 11 cột trong biểu đồ theo loại cộng ra 1.384, lệch 5; Apiiro không giải thích
Mở thẳng cơ sở dữ liệu379 mật khẩu CSDL + 122 khoá service-role Supabase501 / 1.379 = 36,3%, khớp câu "hơn một phần ba"
Tổng mọi nguồn (thêm lịch sử git, settings.json dùng chung, bản ghi hội thoại…)2.539 bí mật trong 1.994 kho2.539 − 1.379 = 1.160, khớp câu "thêm 1.160"
gitleaks / TruffleHog bắt được564 / 643 trên 1.122 tệp; 215 tệp cả hai đều bỏ sót50,3% / 57,3%; 215 / 1.122 = 19,2%, khớp "một phần năm"
Kho mà commit đồng tác giả Claude đã sửa tệp này539 trên 1.105 kho truy được48,8%
Biểu đồ thanh của Apiiro: 1.379 bí mật thật trong các tệp settings.local.json công khai theo loại, gồm 398 token API dịch vụ, 379 mật khẩu cơ sở dữ liệu, 149 khoá API mô hình AI, 122 khoá service-role Supabase, 110 khoá Google API, 103 token tài khoản Supabase, 43 đăng nhập SSH, 42 token GitHub GitLab npm, 23 khoá AWS, 9 mật khẩu ứng dụng và 6 khoá riêng
Bí mật theo loại, không bí mật nào được thử. Các cột cộng ra 1.384, khác con số 1.379 trên phụ đề (Locaith cộng). Ảnh: Apiiro.
  • Tệp càng to càng dễ lộ: theo biểu đồ của Apiiro, 0,17% tệp dưới 500 byte (55.453 tệp) chứa bí mật, so với 9,9% tệp trên 8 KB (2.755 tệp). Ai bấm "đừng hỏi lại" càng lâu thì danh sách càng dài.
  • Không mới và không tự biến mất: mọi tệp vẫn nằm trên nhánh mặc định ngày 2/11; ở kho trung vị, tệp được commit lần đầu 217 ngày trước đó, 118 kho quá một năm. 211 bản fork của 74 kho mang cùng bí mật. Lịch sử git giữ thêm 734 bí mật trong 509 kho không còn trong bản hiện tại, thường vì tệp đã bị xoá.
  • Không chỉ một tệp: trong 76.011 tệp settings.json dùng chung có 298 tệp chứa bí mật; 120 tệp bản ghi hội thoại tác tử trong 87 kho; 9 kho có tệp trí nhớ (MEMORY.md và tương tự); 33 ghi chú bàn giao; 9 kho có cài đặt tự duyệt của Copilot trong VS Code. Ngoài GitHub: 126 trên 31.053 Hugging Face Spaces có tệp này, 1 có bí mật; 2 trên 69 bản trên GitLab.com.
  • Ai bị ảnh hưởng: 63 tổ chức, phần lớn là công ty phần mềm; trường hợp nặng nhất gồm khoá đám mây quyền quản trị của một hãng cơ sở dữ liệu, mật khẩu Postgres trên Azure đang chạy thật, token Square production, mật khẩu chủ cơ sở dữ liệu của một ứng dụng hồ sơ y tế. Apiiro báo cho từng tổ chức ngày 2 và 3/11; một công ty xác nhận khoá còn hiệu lực.

Bốn báo lỗi, không câu trả lời nào

Apiiro viết rằng người dùng đã báo cơ chế này từ tháng 8/2025, không báo lỗi nào được Anthropic trả lời, và ba cái đã bị đóng tự động. Locaith đọc cả bốn qua API GitHub ngày 08/11/2026; đến lúc đó cả bốn đều đã đóng, và mọi bình luận đều của người dùng hoặc bot.

Báo lỗi Mở Đóng Cách đóng
#554411/8/20253/1/2026Bot đóng vì 60 ngày không hoạt động ("not planned"); tiêu đề nói đúng cơ chế: lệnh đã duyệt chứa thông tin đăng nhập được lưu nguyên văn
#1198219/11/20255/3/2026Bot đóng vì không hoạt động, dù ba bình luận (12/2025 đến 2/2026) nói lỗi vẫn còn; nội dung: Claude Code không còn thêm tệp vào .gitignore khi tạo
#131064/12/20258/12/2025Bot đóng như bản trùng của #11982
#912701/9/20265/11/2026, 10:14 UTCBot đóng vì không hoạt động, đúng ngày Apiiro đăng bài; nội dung: tiện ích VS Code ghi quyền "always allow" vào settings.json được commit thay vì tệp local

Nhật ký thay đổi của Claude Code đến bản 2.1.319 (commit ngày 6/11/2026) có một dòng sửa việc runner tự lưu trữ commit nhầm .claude/settings.local.json do phiên trước để lại, nhưng không có dòng nào đổi cách "don't ask again" ghi lệnh. Locaith không thấy bài đăng hay phản hồi chính thức nào của Anthropic về nghiên cứu này tính đến ngày 08/11/2026.

Nhận xét của Locaith: việc nên làm ngay nếu đội bạn dùng Claude Code

Đây là ý kiến của Ban Biên Tập, dựa trên khuyến nghị của Apiiro và tài liệu Claude Code; Locaith chưa thử nghiệm. (1) Tìm trong mọi kho của tổ chức, kể cả kho riêng, tệp .claude/settings.local.json và .claude/settings.json; kho riêng hôm nay có thể thành công khai ngày mai. (2) Nếu tệp từng được commit, gỡ theo dõi bằng git rm --cached rồi thêm vào .gitignore của chính kho, và đổi mọi mật khẩu, khoá mà tệp từng chứa: xoá tệp không xoá lịch sử, bản fork hay bản sao. (3) Mở tệp trên máy từng lập trình viên và xoá quy tắc nào có bí mật, kể cả khi chưa bao giờ commit, vì mã độc đánh cắp thông tin đăng nhập quét đúng loại tệp này. (4) Đừng gõ bí mật vào lệnh; dùng biến môi trường như $DB_URL để quy tắc chỉ ghi tên biến. (5) Duyệt theo mẫu, ví dụ Bash(npm run:*), thay vì duyệt nguyên một lệnh. (6) Bổ sung thư mục .claude/, .cursor/, .gemini/ vào quét bí mật trước commit và trong CI, và chọn công cụ quét bắt được mật khẩu đứng sau PGPASSWORD=, sshpass -p, mysql -p, vì đó chính là chỗ gitleaks và TruffleHog bỏ sót.

Giới hạn và điều chưa kiểm chứng

Mọi con số về tệp, bí mật và tổ chức là của Apiiro, một công ty bán giải pháp bảo mật cho phát triển phần mềm, nên có lợi ích thương mại trong chủ đề này. Locaith không lặp lại tìm kiếm trên GitHub (API tìm kiếm mã cần đăng nhập), không xem bất kỳ tệp bị lộ nào và không thử khoá nào. Theo phương pháp của chính Apiiro, "bí mật thật" nghĩa là khớp định dạng nhà cung cấp hoặc trỏ tới máy chủ công khai, không phải đã xác nhận còn dùng được; bước rà soát cuối do một mô hình ngôn ngữ làm theo tiêu chí viết sẵn. Câu "Claude Code là công cụ duy nhất trong 16 tác tử ghi nguyên lệnh vào tệp dự án theo mặc định" là so sánh dựa trên tài liệu của Apiiro, Locaith chưa kiểm. Locaith đã kiểm: phép cộng các con số công bố, mô tả cơ chế trong tài liệu Claude Code, trạng thái và bình luận của bốn báo lỗi, và nhật ký thay đổi đến bản 2.1.319.

Nguồn:

Locaith đã đọc trực tiếp các trang trên ngày 08/11/2026. Ảnh bìa là phần minh hoạ cắt từ ảnh bìa bài nghiên cứu của Apiiro; Locaith cắt bỏ dòng tiêu đề và tên tác giả, giữ nhãn nhỏ thuộc hình vẽ. Hai ảnh trong bài là hình của Apiiro. Các phép cộng, tỉ lệ và bảng báo lỗi là của Locaith. Bài do Ban Biên Tập Locaith viết và phân tích ngày 08/11/2026.

Messenger