Chia sẻ đam mê công nghệ
Nổi bật

Claude Code làm lộ hàng nghìn mật khẩu trên GitHub vì một file cấu hình không theo repo

Apiiro tìm thấy 104.185 bản sao file .claude/settings.local.json trên GitHub công khai, trong đó 1.122 file chứa 1.379 bí mật như mật khẩu database, token API và khóa AWS.

Token API và mật khẩu database dẫn đầu trong 1.379 bí mật bị lộ: 398 và 379
Token API và mật khẩu database dẫn đầu trong số 1.379 bí mật Apiiro tìm thấy, đúng nhóm lệnh người ta hay nhờ agent chạy. Số liệu: Ars Technica (Apiiro)

Tóm tắt nhanh

  • Hãng bảo mật Apiiro quét GitHub công khai và thấy 104.185 bản sao file .claude/settings.local.json của Claude Code, nằm trong 103.617 kho lưu trữ.
  • Khoảng 1,1% số file, tức 1.122 file, chứa ít nhất một bí mật; tổng cộng 1.379 bí mật gồm mật khẩu database, token API, đăng nhập SSH và khóa AWS.
  • Gốc lỗi là lựa chọn “Yes, and don’t ask again”: Claude Code lưu nguyên câu lệnh đã duyệt, kể cả mật khẩu gõ trong câu lệnh, vào file cục bộ.
  • Apiiro không thử xem các bí mật còn dùng được hay không, nên 1.379 là số bí mật bị phơi ra, không phải số tài khoản đã bị chiếm.

Hơn 100.000 file cấu hình cục bộ của Claude Code đang nằm công khai trên GitHub, và khoảng 1.100 file trong số đó, thuộc 63 tổ chức, mang theo mật khẩu database, token API hoặc khóa riêng. Phát hiện do các nhà nghiên cứu của Apiiro công bố, rồi được Ars Technica đưa lên hôm 9/11/2026.

Một cú bấm “don’t ask again” ghi nguyên văn mật khẩu xuống đĩa

Claude Code hỏi người dùng trước khi chạy lệnh shell, và trong hộp thoại có lựa chọn “Yes, and don’t ask again”. Tài liệu của Anthropic mô tả rõ hậu quả: sự đồng ý đó được lưu thành một quy tắc allow trong .claude/settings.local.json của dự án. Quy tắc đôi khi được viết dạng mẫu, nhưng chính câu lệnh thì thường bị ghi vào file đúng như đã chạy, kể cả những thứ nhạy cảm gắn trong đó.

Hình dung một lập trình viên nhờ agent kiểm tra database production, agent đề xuất lệnh kết nối có mật khẩu nằm ngay trong chuỗi URL, người dùng ngán phải bấm duyệt liên tục nên chọn “don’t ask again”. Từ lúc đó mật khẩu nằm dạng văn bản thường trong một file JSON ngay trong thư mục dự án. Nếu file ở yên trên máy thì rủi ro không lớn, còn khi cả thư mục bị đẩy lên GitHub thì mật khẩu đi theo.

Apiiro cho biết trong nhiều trường hợp chính Claude Code còn tự commit thay đổi vào file cấu hình mà người dùng không can thiệp. Boris Cherny của nhóm Claude Code thì trả lời trên Hacker News rằng các file này gần như không bao giờ nên được check in, và những vụ như thế dường như chỉ xảy ra khi file được tạo tay rồi commit. Phía Anthropic cho biết đang xem xét cách ngăn chặn.

Quy tắc ignore nằm ở máy một người, nên không đi theo repo

Đây là chỗ thiết kế đáng bàn hơn lỗi người dùng. Theo tài liệu của Anthropic, lần đầu ghi file trong một kho git chưa ignore nó, Claude Code thêm **/.claude/settings.local.json vào file git excludes toàn cục của người dùng, tức core.excludesFile nếu có đặt, còn không thì ~/.config/git/ignore. Trên giấy tờ, file không bao giờ lên remote.

Nhưng một quy tắc toàn cục chỉ tồn tại trong cấu hình của một người, không nằm trong repo. Đồng nghiệp có máy khác, một laptop mới vừa clone về, container CI hay một lần gõ git add . vội đều có thể kéo file vào commit. Thư mục chưa phải repo lúc đầu rồi sau mới git init cũng rơi vào trường hợp này. Khi file đã được commit thì nó thành file được theo dõi, và lúc đó .gitignore không còn tác dụng với nó nữa.

Một bảo vệ phụ thuộc vào việc mọi người đóng góp đều cấu hình đúng mọi máy thì sẽ thủng khi quy mô lên tới hàng trăm nghìn repo. Một dòng ignore ở cấp dự án, commit cùng mã nguồn, ít thủng hơn nhiều, vì nó đi theo repo sang bất kỳ máy nào. Điều đáng lưu ý là vấn đề không mới: một báo cáo lỗi về chuyện này đã xuất hiện từ tháng 8/2025, và các báo cáo tương tự đều bị đóng sau 60 ngày không có hoạt động mà chưa được xử lý.

Hơn 100.000 file, nhưng chỉ khoảng 1% chứa bí mật

Con số lớn dễ bị đọc sai theo cả hai hướng. Không phải file nào cũng có mật khẩu: phần lớn chỉ chứa quy tắc cho những lệnh vô hại như chạy test hay build. Ngược lại, 1,1% của một tập hợp hơn 100.000 file vẫn là hơn một nghìn file, mỗi file trung bình giữ khoảng 1,2 bí mật.

Loại bí mậtSố lượngCửa mà nó mở ra
Token API dịch vụ398Dịch vụ bên thứ ba, thanh toán, dữ liệu
Mật khẩu database379Dữ liệu khách hàng và ứng dụng
Khóa API mô hình AI149Dịch vụ AI tính phí theo chủ tài khoản
Đăng nhập SSH43Máy chủ và hệ thống nội bộ
Token GitHub, GitLab, npm42Mã nguồn, quyền xuất bản gói
Khóa AWS23Tài khoản và kho lưu trữ đám mây

Số liệu: Apiiro, theo Ars Technica và Shattered; chỉ liệt kê một số nhóm lớn nhất trong biểu đồ gốc. Tổng 1.379 bí mật còn gồm các nhóm khác như khóa Supabase và khóa Google API.

Token API và mật khẩu database chiếm áp đảo, đúng với cơ chế ở trên: việc người ta nhờ agent làm nhiều nhất là gọi API bằng curl hoặc mở một database client, và cả hai kiểu lệnh đều hay mang thông tin đăng nhập ngay trong tham số. Theo biểu đồ của Apiiro, 501 bí mật trong số này mở thẳng được vào một database. Token GitHub, GitLab hay npm cũng đáng sợ không kém con số 23 khóa AWS, vì một token xuất bản npm có thể cho người lạ đẩy mã độc dưới tên một gói quen thuộc.

Lộ ra chưa có nghĩa là đã bị chiếm, nhưng dọn file không đủ

Apiiro không kiểm tra xem các bí mật còn hiệu lực hay không. Nhiều khóa có thể đã được đổi hoặc chỉ gắn với hệ thống thử nghiệm, một phần khác có thể vẫn sống. Vì thế 1.379 đo mức phơi bày, không đo số vụ xâm nhập, và đọc nó như danh sách tài khoản bị hack là sai.

Cái khó là việc xóa file khỏi repo không xóa được bí mật. Bản cũ vẫn nằm trong lịch sử commit, và nếu dự án đã bị fork thì bản fork vẫn giữ nguyên. Thứ tự hợp lý là đổi khóa trước, dọn repo sau: coi mọi mật khẩu từng xuất hiện trong lệnh được duyệt “don’t ask again” là đã lộ, thu hồi hoặc tạo lại, rồi mới xóa file và thêm .claude/settings.local.json vào .gitignore của chính repo.

Về thói quen, cách chắc nhất là đừng bao giờ gõ mật khẩu thẳng vào dòng lệnh để agent chạy. Truyền qua biến môi trường hoặc công cụ quản lý bí mật, thì thứ được lưu vào file cấu hình chỉ là tên biến, không phải giá trị. Cherny gợi ý dùng auto mode của Claude Code, chế độ dùng bộ phân loại để tự xử lý các yêu cầu cấp quyền thông thường, nhưng khi có người chỉ ra lệnh nhạy cảm vẫn có thể bị lưu trong auto mode, ông thừa nhận đó là một góc cần cải thiện.

Công cụ quét bí mật cũng chưa phải lưới an toàn đầy đủ. Apiiro thấy 215 trong khoảng 1.100 bí mật công khai không bị hai công cụ phổ biến là gitleaks và TruffleHog gắn cờ, tức gần một phần năm lọt lưới. Nhóm Claude Code cho biết đang cân nhắc tích hợp sẵn tính năng quét bí mật vào chính Claude Code, nhưng chưa có mốc nào được công bố. Với người đang dùng Claude Code hằng ngày ở Việt Nam, việc cần làm tuần này đơn giản hơn bất kỳ bản vá nào sắp tới: mở thư mục dự án, tìm file .claude/settings.local.json, đọc các dòng allow, và đổi mọi khóa đang nằm trong đó.

Nguồn tham khảo: Ars Technica, Shattered.io, Tài liệu Claude Code (Anthropic)

Bài này thế nào?

Hoá đơn của bài này

Tek viết bài này bằng cà phê. Mời Tek một ly nha?

Theo dõi TekCafe: Facebook · YouTube

Bài viết mới nhất