1.033 mã khóa bí mật (secret keys) Stripe đang hoạt động đã bị lộ từ 669 nhà cung cấp sau khi các tệp .env và nhật ký gỡ lỗi (debug logs) bị để hở trên internet công cộng. Các mã khóa này cho phép bất kỳ ai cũng có thể tạo các khoản thanh toán, truy xuất hóa đơn và thu thập thông tin chi tiết của khách hàng – một vụ vi phạm có thể làm cạn kiệt ví tiền và hủy hoại danh tiếng chỉ trong vài phút.

Nguyên nhân gây ra vụ rò rỉ

Các nhà phát triển thường xuyên lưu trữ dữ liệu cấu hình – mật khẩu cơ sở dữ liệu, mã thông báo API (API tokens) và mã khóa bí mật Stripe – trong một tệp có tên là .env. Tệp này nằm cùng với mã nguồn và được đọc khi ứng dụng chạy (runtime) để giữ các thông tin bí mật tránh khỏi mã nguồn. Cách làm này chỉ hiệu quả nếu máy chủ không bao giờ phục vụ các tệp bắt đầu bằng dấu chấm. Trong trường hợp này, các máy chủ web bị cấu hình sai (cả Nginx và Apache) đã cho phép các yêu cầu cho “/.env”, “/.env.example”, “/.git/HEAD” và một điểm cuối (endpoint) “/debug” tùy chỉnh trả về tệp thô với trạng thái 200 OK.

Vụ rò rỉ không phải do lỗ hổng trong nền tảng của Stripe, cũng không phải do lỗi trong bất kỳ plugin thương mại điện tử cụ thể nào. Đó thuần túy là sự lộ lọt của các tệp lẽ ra phải được ẩn đi với thế giới bên ngoài.

Tại sao việc lộ thông tin lại quan trọng

Một mã khóa bí mật Stripe về cơ bản là mật khẩu chủ cho hệ thống thanh toán của một người bán. Bất kỳ ai nắm giữ nó đều có thể:

  • Tạo các khoản thanh toán tùy ý trên các thẻ đã lưu
  • Truy xuất hóa đơn và lịch sử thanh toán (payout histories)
  • Lấy dữ liệu cá nhân – tên, email, số điện thoại, địa chỉ nhà, địa chỉ IP
  • Sử dụng các mã khuyến mãi để mua hàng miễn phí hoặc được giảm giá

Tập dữ liệu bị rò rỉ bao gồm tất cả các mục trên, cộng với chi tiết thanh toán tiết lộ số tiền mà mỗi nhà cung cấp đã kiếm được. Đối với một doanh nghiệp, rủi ro tức thì là các giao dịch gian lận gây ra việc hoàn tiền (chargebacks), mất niềm tin của khách hàng và các khoản phạt tiềm ẩn theo PCI-DSS, GDPR hoặc các quy định về quyền riêng tư dữ liệu khác. Chi phí dài hạn có thể cao hơn nhiều: phí pháp lý, chi phí khắc phục và một thương hiệu bị tổn hại có thể không bao giờ phục hồi được.

Kiểm tra nhanh: tệp .env của bạn có đang bị lộ không?

Mở terminal và thay thế yourdomain.com bằng tên miền của chính bạn:

for p in "/.env" "/.env.example" "/.git/HEAD" "/debug"; do
  echo -n "$p -> "
  curl -s -o /dev/null -w "%{http_code}\n" "https://yourdomain.com$p"
done

Mỗi dòng nên trả về 403 (forbidden) hoặc 404 (not found). Phản hồi 200 có nghĩa là tệp có thể được đọc công khai – một sự cố bảo mật nghiêm trọng cần được xử lý ngay lập tức.

Các bước khắc phục ngay lập tức

1. Chặn các tệp dotfiles tại máy chủ web

  • Nginx – thêm một khối location để từ chối bất kỳ yêu cầu nào đối với các tệp bắt đầu bằng dấu chấm.
  • Apache – sử dụng chỉ thị FilesMatch trong .htaccess để trả về lỗi 403 cho các tệp có tiền tố dấu chấm.

2. Thắt chặt quy trình làm việc với Docker của bạn

  • Thêm .env vào .dockerignore để tệp không bao giờ bị sao chép vào image.
  • Tránh sử dụng lệnh COPY cho bất kỳ tệp nào chứa thông tin bí mật.

3. Thay đổi (Rotate) mọi mã khóa bị xâm phạm

  • Đăng nhập vào Stripe Dashboard → Developers → API keys.
  • Tạo một mã khóa bí mật mới và thu hồi (revoke) mã cũ ngay lập tức.

4. Áp dụng các mã khóa với đặc quyền tối thiểu (least-privilege keys)

  • Ngừng sử dụng một mã khóa bí mật duy nhất cho tất cả các hoạt động.
  • Tạo các mã khóa hạn chế (restricted keys) chỉ cho phép các hành động cần thiết – ví dụ: một dịch vụ thanh toán (checkout service) cần quyền tạo payment intents nhưng không cần quyền hoàn tiền hoặc xem lịch sử thanh toán.

5. Xóa sạch mọi bản sao của mã khóa cũ

  • Quét các nhật ký CI/CD, các tệp build (build artifacts) và các bản sao lưu (backup archives).
  • Chạy các công cụ quét bí mật (secret-scanning tools) như Gitleaks hoặc TruffleHog đối với lịch sử Git của bạn.

Một mã khóa bị rò rỉ không biến mất khi bạn xóa tệp khỏi máy chủ; nó tồn tại mãi mãi trong tay bất kỳ ai đã tải nó xuống. Thay đổi mã khóa (Rotation) là cách duy nhất để khiến dữ liệu bị đánh cắp trở nên vô dụng.

Xa hơn việc khắc phục: xây dựng một quy trình (pipeline) an toàn hơn

  • Automated scanning (Quét tự động) – tích hợp việc phát hiện bí mật vào mọi pull request và công việc CI.
  • Configuration management (Quản lý cấu hình) – lưu trữ các bí mật trong một kho lưu trữ chuyên dụng (ví dụ: HashiCorp Vault, AWS Secrets Manager) và đưa chúng vào lúc chạy (runtime) thay vì dựa vào các tệp tĩnh.
  • Access reviews (Xem xét quyền truy cập) – định kỳ kiểm tra xem các mã khóa Stripe nào đang hoạt động và chúng có những quyền hạn gì.

Những thực hành này giúp giảm khả năng một máy chủ bị cấu hình sai có thể làm lộ toàn bộ hạ tầng thanh toán.

Những điều cần theo dõi tiếp theo

Cộng đồng bảo mật hiện đang tìm kiếm thêm các mã khóa bị lộ khác bằng cùng một phương pháp. Dự kiến sẽ có thêm nhiều thông báo khi các trình quét tự động duyệt web để tìm các tệp “/.env” chứa các mã thông báo Stripe. Stripe có thể sẽ đưa ra thêm hướng dẫn về tần suất thay đổi mã khóa và khuyến nghị sử dụng các mã khóa hạn chế cho các hoạt động có rủi ro cao.

Bài học rút ra

Nếu một dotfile có thể truy cập được qua trình duyệt, hệ thống thanh toán của bạn đã bị xâm nhập – hãy chặn tệp đó, thay đổi khóa (rotate key), và thiết kế lại quy trình xử lý thông tin bảo mật trước khi các hành vi gian lận gây thiệt hại cho sổ cái của bạn.