Công nghệ & cuộc sống sốRSS
thinnguyenBlog
Kỹ thuật··6 phút đọc

Apiiro phát hiện Claude Code làm lộ hơn 1.100 mật khẩu

Nghiên cứu của Apiiro công bố ngày 5/11/2026 cho thấy Claude Code đã làm lộ 2.539 secret thật trong 1.994 repo công khai trên GitHub, trong đó có mật khẩu production và khóa cloud cấp quản trị. Nguyên nhân là tính năng "Don't Ask Again" lưu nguyên văn lệnh chứa mật khẩu vào file settings.local.json.

Apiiro phát hiện Claude Code làm lộ hơn 1.100 mật khẩu

Claude Code là trợ lý lập trình chạy trong terminal của Anthropic, vốn hỏi trước khi chạy lệnh shell. Nghe có vẻ an toàn, cho đến khi một lựa chọn tưởng như vô hại xuất hiện: "Yes, and don't ask again", tức là đừng hỏi lại nữa. Theo nghiên cứu của hãng bảo mật Apiiro công bố ngày 5/11/2026, chính lựa chọn đó đã biến mật khẩu của lập trình viên thành dữ liệu công khai trên GitHub.

Một cú bấm “đừng hỏi lại” lưu mật khẩu ra sao?

Claude Code thường hỏi xác nhận trước khi chạy lệnh shell, chẳng hạn khi cần truy vấn cơ sở dữ liệu hay kết nối tới máy chủ từ xa. Nhưng khi lập trình viên chọn "Yes, and don't ask again", Claude Code lưu toàn bộ lệnh, kể cả mật khẩu hay khóa API trong đó, thành quy tắc cho phép vĩnh viễn trong file .claude/settings.local.json của dự án.

File này theo thiết kế chỉ nên nằm trên máy của lập trình viên, và Claude Code có cơ chế tự thêm file vào danh sách loại trừ toàn cục của git, gọi là global gitignore. Tuy nhiên cơ chế này không chặn được mọi trường hợp: file vẫn có thể lên GitHub nếu nó đã được commit trước đó, nếu repo được dùng chung, hoặc nếu nội dung bị ghi vào file settings.json dùng chung.

Nguy hiểm hơn, mật khẩu thường xuất hiện ngay trong lệnh: một lệnh Postgres có thể chứa PGPASSWORD=..., một lệnh SSH có thể chứa sshpass -p, một lệnh MySQL có thể chứa mật khẩu ngay sau cờ -p. Khi những lệnh này được lưu nguyên văn, file cấu hình trở thành một danh sách mật khẩu gọn gàng, chờ ai đó tìm thấy.

Quy mô rò rỉ trên GitHub lớn đến mức nào?

Để đo quy mô, Apiiro quét GitHub công khai trong ba ngày 1–3/11/2026 bằng GitHub code search. Kết quả: 104.185 bản sao công khai của file .claude/settings.local.json trong 103.617 repo. Trong số đó, 1.122 bản, tương đương 1,1%, chứa ít nhất một secret thật, tổng cộng 1.379 secret khác nhau.

Con số còn lớn hơn khi tính cả lịch sử git, file settings.json dùng chung và log chat đã lưu: tổng cộng 2.539 secret thật trong 1.994 repo công khai. Apiiro ghi nhận 63 tổ chức bị ảnh hưởng, phần lớn là công ty phần mềm, và một công ty đã xác nhận khóa bị lộ của họ vẫn còn hoạt động.

Các ví dụ mà Apiiro nêu ra cho thấy mức độ nghiêm trọng: khóa cloud cấp quản trị của một hãng cung cấp cơ sở dữ liệu, mật khẩu production của Azure Postgres, token production của Square, và mật khẩu owner của một cơ sở dữ liệu hồ sơ y tế. Thành phần các secret bị lộ: 379 mật khẩu cơ sở dữ liệu, 122 Supabase service-role key, 43 thông tin đăng nhập SSH, 42 token GitHub, GitLab và npm, 23 khóa AWS, trong đó có 636 provider key và 743 mật khẩu hoặc token gắn với host công khai.

Trong 1.105 repo bị rò rỉ được truy vết, 539 repo có commit do Claude đồng tác giả đã thay đổi file này. File rò rỉ trung vị đã tồn tại 217 ngày trước thời điểm Apiiro chụp dữ liệu ngày 2/11, nghĩa là nhiều secret đã nằm công khai suốt nhiều tháng trước khi có ai đo đếm.

Vì sao máy quét secret quen thuộc bỏ sót nhiều file?

Các công cụ quét secret quen thuộc không phát hiện được toàn bộ số file rò rỉ. Gitleaks phát hiện 564 trong số 1.122 file, TruffleHog phát hiện 643 file, và 215 file không bị phát hiện bởi cả hai công cụ, tương đương khoảng một phần năm tổng số.

Nguyên nhân nằm ở hình thức của mật khẩu. Các máy quét thường tìm khóa theo định dạng nhận diện được. Nhưng mật khẩu ở đây nằm trong lệnh shell, dưới dạng PGPASSWORD=..., sshpass -p hay mysql -p, nên không khớp với mẫu mà máy quét chờ đợi.

Việc xóa file khỏi repo cũng không xóa được vết lộ, vì lịch sử git vẫn lưu các phiên bản cũ và các bản fork vẫn giữ nguyên nội dung đã bị lộ. Một khi secret đã xuất hiện công khai, cách xử lý an toàn duy nhất là coi như nó đã bị lộ và xoay credential.

Đây có phải lỗi của mô hình AI hay của chính Claude Code?

Apiiro khẳng định đây là hành vi của bản thân Claude Code, không phải của mô hình ngôn ngữ bên dưới. Hãng đã tái hiện được hành vi này với Opus 5.5 và Fable 5.1, hai mô hình mới nhất của Anthropic. Trong 16 coding agent được so sánh, Claude Code là agent duy nhất được xác nhận ghi toàn bộ lệnh đã phê duyệt vào file của dự án theo mặc định.

Người dùng đã báo cáo hành vi này trên GitHub của Claude Code từ tháng 8/2025, với 4 báo cáo được Apiiro trích dẫn, nhưng không nhận được phản hồi từ Anthropic. Tính đến ngày 8/11/2026, vẫn chưa có phản hồi công khai nào từ Anthropic.

Cần đọc các con số trên với sự thận trọng cần thiết. Apiiro không thử bất kỳ credential nào, nên "secret thật" ở đây nghĩa là secret khớp định dạng khóa hoặc gắn với host công khai, chứ không phải đã xác nhận còn hoạt động. Apiiro bán sản phẩm bảo mật cho coding agent nên có lợi ích trong chủ đề này, và số liệu chưa có bên thứ ba kiểm chứng độc lập.

Lập trình viên cần làm gì ngay hôm nay?

Bước đầu tiên là tìm các file .claude/settings.local.json và .claude/settings.json trong tổ chức GitHub của mình. Nếu file đã bị theo dõi bởi git, hãy chạy lệnh git rm --cached .claude/settings.local.json để gỡ file khỏi git mà vẫn giữ file trên máy, rồi thêm file vào .gitignore của repo.

Bước tiếp theo, và cũng là bước quan trọng nhất, là xoay mọi credential từng xuất hiện trong lệnh đã phê duyệt. Việc xóa file không làm credential cũ trở nên an toàn, vì lịch sử git và các bản fork vẫn còn. Sau đó thu hồi và cấp mới toàn bộ.

Về lâu dài, đừng bao giờ gõ mật khẩu trực tiếp vào lệnh. Hãy dùng biến môi trường hoặc file cấu hình nằm ngoài repo để truyền credential.

Checklist hành động cho lập trình viên

  • Tìm .claude/settings.local.json và .claude/settings.json trong mọi repo của bạn.

  • Nếu file đã bị theo dõi, chạy git rm --cached .claude/settings.local.json và thêm file vào .gitignore của repo.

  • Kiểm tra lịch sử git và các bản fork để biết credential nào từng bị lộ.

  • Xoay ngay mọi credential từng xuất hiện trong lệnh đã phê duyệt.

  • Không gõ mật khẩu trực tiếp vào lệnh, dùng biến môi trường hoặc file cấu hình ngoài repo; rà soát các quy tắc đã phê duyệt trước mỗi lần commit và bật cảnh báo quét secret.

Nguồn tham khảo: Apiiro

Bài liên quan