Security Blog

Trợ lý lập trình AI vừa đọc ví của bạn

#152

October 2, 2026 · By Marketing team

← All posts

Công cụ lập trình AI đọc các file .env trước khi bạn gõ bất cứ thứ gì. Các API key của bạn — mỗi cái là một thẻ tín dụng không hạn mức — đã nằm trong context window của người khác trước khi bạn viết prompt đầu tiên. Vấn đề không nằm ở AI. Vấn đề là bí mật được lưu dưới dạng file.

Mở trợ lý lập trình AI của bạn lên. Trước khi bạn gõ một ký tự nào, nó đã đọc thư mục dự án của bạn rồi. File .env của bạn. Các API key của bạn. Mật khẩu cơ sở dữ liệu. Stripe secret key của bạn.

Bạn không hề yêu cầu điều đó. Bạn không hề phê duyệt. Đó là một tính năng, không phải lỗi — công cụ cần ngữ cảnh dự án thì mới hữu ích. Nên nó đọc mọi thứ mà một lập trình viên có thể đọc.

Và một lập trình viên thì có thể đọc mọi thứ.

Phiên bản greentext

Một bài viết lan truyền trong tuần này, viết dưới dạng độc thoại nội tâm của một lập trình viên:

> Mở Claude Code. File .env của bạn bị đọc trước khi bạn gõ bất cứ thứ gì. Các API key của bạn giờ nằm trong chat. Bạn thêm "đừng đọc .env" vào CLAUDE.md. Không có tác dụng.

380.000 người đã xem bài viết đó. 2.700 người đã lưu lại. Không phải vì đó là tin mới — mà vì đó là một tấm gương.

Mỗi lập trình viên đọc nó đều có cùng một suy nghĩ: cái này là setup của mình.

Hướng dẫn không có tác dụng

Điều đầu tiên mọi người thử là viết quy tắc. "Không được đọc các file .env." Trong CLAUDE.md, trong AGENTS.md, trong system prompt. Những lệnh cấm trực tiếp, tường minh.

Công cụ vẫn đọc các file đó.

Điều này hợp lý khi bạn nghĩ kỹ. File được đọc như một phần của việc xây dựng ngữ cảnh dự án — trước cả khi các hướng dẫn được xử lý. Nói với mô hình đừng đọc một file mà nó đã đọc rồi cũng giống như bảo ai đó quên đi điều họ vừa thấy. Thông tin đã nằm trong context window. Nó đã được truyền đi. Lệnh cấm đến sau khi thiệt hại đã xảy ra.

Một nhà nghiên cứu phát hiện rằng ngay cả các deny rule ở cấp file cũng có thể bị lách qua script tùy chỉnh hoặc chuỗi pipe. Một người khác phát hiện hóa đơn proxy tăng vọt vì thông tin xác thực HTTP_PROXY của họ đang bị tự động nạp và sử dụng.

Tiền trong file .env của bạn

Mọi người xem đây là vấn đề quyền riêng tư. Thực ra đây là vấn đề tài chính.

Mở một file .env điển hình trong dự án production:

OPENAI_API_KEY=sk-...
STRIPE_SECRET_KEY=sk_live_...
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
DATABASE_URL=postgresql://user:pass@...

API key OpenAI đó là một thẻ tín dụng không có hạn mức chi tiêu và không có PIN. Ai đó có chuỗi ký tự đó có thể gọi API trị giá 40.000 USD chỉ sau một đêm. Stripe key có thể hoàn tiền, tạo khoản thanh toán, truy cập dữ liệu thanh toán của khách hàng. Thông tin xác thực AWS — tùy thuộc vào IAM policy, mà gần như chắc chắn là quá rộng — có thể khởi tạo GPU instance, truy cập S3 bucket, hoặc xóa hạ tầng.

Đây không phải danh sách mật khẩu. Đây là danh sách những chiếc ví, mỗi chiếc một số dư khác nhau và không có khóa.

29 triệu chiếc ví trên vỉa hè

Báo cáo mới nhất của GitGuardian thống kê 28,6 triệu bí mật bị lộ trong các commit GitHub công khai năm 2025. Tăng 34% so với năm trước, và là mức tăng theo năm lớn nhất mà họ từng đo được.

Các con số riêng về AI còn tệ hơn. 1,2 triệu bí mật thuộc dịch vụ AI bị lộ — mức tăng 81% so với cùng kỳ năm trước. Các commit có sự đồng tác giả của công cụ lập trình AI làm rò rỉ bí mật với tỷ lệ khoảng gấp đôi mức nền. Và 24.000 bí mật khác nhau được tìm thấy trong các file cấu hình MCP — lớp hạ tầng kết nối AI agent với các dịch vụ bên ngoài.

Mười hai trong số mười lăm loại bí mật bị lộ có tốc độ tăng nhanh nhất là dịch vụ AI. Không phải cơ sở dữ liệu. Không phải nhà cung cấp cloud. Mà là dịch vụ AI.

Những công cụ chúng ta dùng để viết code nhanh hơn đang làm rò rỉ các khóa của hệ thống mà đoạn code đó kết nối tới.

Vấn đề thật

Lập trình viên đăng chuỗi greentext đó kết thúc bằng một cách khắc phục thực tế — một cấu hình settings.json chặn việc đọc file. Cách đó hiệu quả. Tạm thời, với công cụ đó.

Nhưng vấn đề thật không phải là Claude Code hay Cursor hay Copilot. Vấn đề thật là bí mật được lưu dưới dạng file.

Một file .env là văn bản thuần nằm trên đĩa, bất kỳ tiến trình nào chạy dưới quyền user của bạn đều đọc được. Trước thời công cụ lập trình AI, các tiến trình đọc dự án của bạn là git, npm, node, trình soạn thảo của bạn. Bạn tin tưởng chúng ngầm. Bạn không nghĩ tới việc bí mật của bạn chỉ cách phơi lộ đúng một lệnh cat.

Công cụ lập trình AI chỉ biến điều ngầm thành điều tường minh. Chúng đọc dự án của bạn theo cách mọi công cụ khác vẫn làm — chỉ là chúng gửi ngữ cảnh tới một nơi mà bạn có thể nhìn thấy.

CI pipeline của bạn cũng đọc các file .env. Trình chạy test của bạn cũng vậy. Linter của bạn cũng vậy. Bản build Docker của bạn cũng vậy. Không cái nào xin phép cả. Bạn chỉ không để ý vì chúng không hiển thị cho bạn bản ghi chat về những gì chúng tìm thấy.

Mẫu hình ẩn phía sau

70% số bí mật bị lộ năm 2022 vẫn còn hiệu lực hôm nay. Không được xoay vòng. Không bị thu hồi. Vẫn hoạt động, vẫn cấp quyền truy cập, sau ba năm.

Đây mới là con số thật. Không phải 29 triệu vụ lộ — mà là 70% không bao giờ được khắc phục. Bởi xoay vòng một khóa đồng nghĩa với việc tìm ra mọi hệ thống đang dùng nó, cập nhật mọi bản deploy, kiểm thử mọi tích hợp. Khóa được tạo một lần, dán vào file .env, rồi không ai nghĩ tới nữa. Chi phí để lộ nó là tức thời. Chi phí để khắc phục vụ lộ là không giới hạn.

Nên phần lớn tổ chức không khắc phục. Họ không thể. Họ không biết khóa nào nằm ở đâu, khóa nào còn hiệu lực, khóa nào đã bị sao chép vào các file .env khác trên các máy khác bởi những lập trình viên khác — những người cần làm cho một tính năng chạy được vào chiều thứ Sáu.

Điều này thực sự có nghĩa gì

Mỗi file .env là một canh bạc. Canh bạc rằng sẽ không có tiến trình nào đọc nó khi không nên. Canh bạc rằng sẽ không có công cụ nào gửi nó tới một nơi bất ngờ. Canh bạc rằng sẽ không có lập trình viên nào commit nó một cách vô tình.

29 triệu lần trong năm ngoái, ai đó đã thua canh bạc đó. Chỉ tính riêng trên GitHub công khai. Các repo private — nơi GitGuardian tìm thấy bí mật trong 35% số repository — còn chưa được tính vào.

Cách khắc phục không phải là một quy tắc settings.json. Không phải là một dòng trong .gitignore. Không phải viết "KHÔNG ĐỌC FILE .ENV" bằng chữ in hoa trong file hướng dẫn của bạn.

Cách khắc phục là bí mật không nên ở đó ngay từ đầu. Không nằm trong file. Không nằm trong biến môi trường được nạp từ file. Không ở bất kỳ dạng nào mà một tiến trình có quyền của bạn có thể đọc được chỉ bằng cách làm điều mà tiến trình vẫn làm: đọc các file trong thư mục dự án của bạn.

Nếu bí mật nằm trên đĩa, nó sẽ bị đọc. Câu hỏi duy nhất là khi nào, và bởi cái gì.

---

Nguồn tham khảo