Chuyện gì thực sự xảy ra khi mật khẩu của bạn bị lộ

Đăng ngày bởi David Carrero

Khi mật khẩu của ai đó bị lộ, họ thường hình dung đó là một tai nạn đơn lẻ: một dịch vụ gặp ngày xui xẻo, chuyện lên báo, bạn đổi mật khẩu và thế là xong. Chưa xong đâu. Ngày rò rỉ không phải là điểm kết thúc của bất cứ thứ gì: đó là ngày đầu tiên của một dây chuyền lắp ráp sẽ chạy suốt nhiều năm, và trong đó tên bạn chẳng bao giờ xuất hiện. Câu chuyện này đáng được kể trọn vẹn, vì gần như không ai nhìn thấy nó.

Bước một: có người lấy được cơ sở dữ liệu

Khởi đầu chẳng có gì ngoạn mục. Ai đó tìm thấy một lỗ SQL injection, một bản sao lưu để hở, một trang quản trị còn nguyên thông tin đăng nhập mặc định. Và họ bê đi một cái bảng.

Cái bảng đó, nếu may, chứa email của bạn và một chuỗi hash của mật khẩu. Nếu kém may hơn, nó chứa email của bạn và mật khẩu của bạn. Dạng văn bản thuần. Y nguyên như lúc bạn gõ vào.

2009 ba mươi hai triệu mật khẩu ở dạng văn bản thuần

Tháng 12 năm 2009, một công ty làm widget cho mạng xã hội tên là RockYou dính SQL injection. Kẻ tấn công lấy đi khoảng 32 triệu mật khẩu, và chẳng có hash nào để bẻ cả: công ty lưu chúng ở dạng văn bản thuần.

Đó là thảm họa với RockYou và là món quà cho tất cả những người còn lại. Lần đầu tiên tồn tại một kho khổng lồ các mật khẩu thật, do những người không hề biết sẽ có kẻ đọc chúng viết ra. Không phải một nghiên cứu: chính là bản thân sự việc.

Tệp đó trở thành rockyou.txt, đến giờ vẫn là bộ từ điển tham chiếu để thử tấn công. Giá trị của nó không nằm ở chỗ có chứa mật khẩu của bạn: mà ở chỗ nó chứa cách con người ta đặt mật khẩu. Một cái tên với một năm sinh, một từ với 123, dấu ! ở cuối. RockYou không làm lộ 32 triệu bí mật. Nó làm lộ cái khuôn. Mà cái khuôn thì không hết hạn.

Bước hai: bẻ được gì thì bẻ, chẳng vội gì cả

Chỗ này trực giác đánh lừa chúng ta. Khi ai đó thử đoán mật khẩu của bạn ngay trên màn hình đăng nhập của một dịch vụ, dịch vụ sẽ chặn: ba lần thử, một CAPTCHA, một lệnh khóa. Đấu với máy chủ, việc đoán vừa chậm vừa ồn ào.

Đấu với một tệp hash đã nằm sẵn trong ổ cứng thì không có máy chủ nào cả. Không có ai ở đầu bên kia để nói không. Thử ngay tại chỗ, bằng GPU, không giới hạn số lần và có cả thế giới thời gian. Nếu dịch vụ hash ẩu — thuật toán nhanh, không có salt — thì khoảng cách với văn bản thuần chỉ là sự tiện lợi, không phải sự an toàn.

Và họ không thử bừa: trước hết là rockyou.txt, rồi đến các quy tắc suy ra từ nó. Đổi a thành @. Thêm một năm vào cuối. Mọi mẹo mà bạn thấy là thông minh đều đã nằm sẵn trong một tệp cấu hình từ hơn một thập kỷ nay.

Từ đó, một phần của bản dump biến thành mật khẩu đọc được. Phần còn lại — thứ dài, thứ ngẫu nhiên, thứ không có trong bất kỳ từ điển nào — vẫn chỉ là nhiễu. Đó chính là ranh giới mà công cụ kiểm tra vạch ra: nó không mắng bạn, nó cho bạn biết bạn rơi về phía nào.

Bước ba: ghép chéo, và đó là lúc bạn đáng tiền

Một bản dump lẻ chẳng đáng bao nhiêu. Thứ đáng giá là sự tổng hợp: lấy mười vụ rò rỉ từ các trang khác nhau, ghép chéo theo email và giữ lại những cặp email:mật khẩu đã ở dạng rõ. Kết quả gọi là combolist, và nó không còn là cơ sở dữ liệu của ai nữa. Nó là một danh sách con người.

2013 bản kiểm kê lộ diện

Tháng 12 năm 2013, Troy Hunt khởi động Have I Been Pwned: một cơ sở dữ liệu công khai các email từng xuất hiện trong các vụ rò rỉ, để bất kỳ ai cũng có thể hỏi xem mình có nằm trong đó không. Ý tưởng nền tảng vừa đơn giản vừa khó chịu: nếu kẻ tấn công đã có sẵn bản kiểm kê, thì giấu nó với nạn nhân chẳng bảo vệ được ai. Nhiều năm sau xuất hiện Pwned Passwords, làm điều tương tự với mật khẩu và cho phép tra cứu mà không cần gửi chúng đi: bạn gửi một mẩu của chuỗi hash và máy chủ trả về một lô ứng viên, mà không biết cái nào là của bạn.

2017 NIST thôi đòi ký tự đặc biệt và bắt đầu đòi danh sách

Khi NIST công bố SP 800-63B, họ vứt bỏ gần như toàn bộ giáo lý chính thống về biểu mẫu đăng ký và thay vào đó là một yêu cầu ít ai ngờ tới: khi đặt mật khẩu, hệ thống phải đối chiếu nó với một danh sách các giá trị đã biết là bị xâm phạm và từ chối nếu nó có mặt trong đó.

Đây là thay đổi về mặt lý thuyết, không phải về tiểu tiết. Câu hỏi không còn là mật khẩu của bạn trông có vẻ mạnh hay không, mà là nó đã bị công bố hay chưa. Vì thế bộ tạo mật khẩu làm điều duy nhất hợp lý: lấy nó ra từ một nơi mà nó chưa từng có mặt.

2019 vụ rò rỉ vốn đã là món xào lại của những vụ khác

Tháng 1 năm 2019, một gói dữ liệu lưu hành và trở nên nổi tiếng với cái tên Collection #1. Hunt phân tích nó và đếm những gì bên trong: khoảng 773 triệu địa chỉ email duy nhất và khoảng 21 triệu mật khẩu duy nhất ở dạng văn bản thuần, tổng hợp từ hàng nghìn nguồn.

Điều quan trọng không phải là kích cỡ. Mà là nó từ đâu ra: phần lớn là món xào lại của những vụ rò rỉ trước đó, đã được bẻ khóa sẵn và đóng gói cho tiện dùng — dù Hunt cũng tìm thấy cả tư liệu mà đến lúc đó ông chưa hề ghi nhận. Sản phẩm ở đây không phải là vụ đột nhập. Mà là bản kiểm kê. Và một bản kiểm kê như thế chỉ có duy nhất một công dụng.

Credential stuffing: chẳng ai tấn công bạn cả

Không có ai tấn công bạn. Đó là phần khó tiêu hóa nhất.

Chẳng ai ngồi xuống mà nghĩ về tài khoản của bạn. Ai đó lấy một combolist hàng trăm triệu dòng, nạp vào một công cụ để thử chúng với biểu mẫu đăng nhập của một ngân hàng hay một hộp thư, rải các lượt thử qua thật nhiều địa chỉ IP để không kích hoạt cơ chế khóa, rồi ngồi đợi. Tuyệt đại đa số sẽ thất bại. Không sao cả: chúng gần như chẳng tốn gì.

Đó là credential stuffing, và nó không phải là đoán. Nó là kiểm chứng. Mật khẩu thì họ đã có rồi; thứ duy nhất họ cần biết là bạn còn đặt nó ở những đâu nữa.

Mật khẩu của bạn ở cái diễn đàn kia không quan trọng. Cái diễn đàn cũng vậy. Điều quan trọng là cùng một chuỗi ký tự ấy mở được hộp thư của bạn, và hộp thư của bạn mở được mọi thứ còn lại qua nút “tôi quên mật khẩu”. Tội tổ tông không phải là nó yếu: mà là nó giống hệt nhau. Một mật khẩu ba mươi ký tự, ngẫu nhiên và hoàn hảo, dùng lại ở hai nơi, chỉ tốt ngang cái nơi tệ hơn trong hai. Và bạn thì không kiểm soát được cái nơi tệ hơn ấy hash kiểu gì.

Rút ra được gì từ tất cả chuyện này

  • Đổi cái mật khẩu bị lộ là chưa đủ nếu bạn đã dùng lại nó. Việc gấp không phải là cái trang đã lên báo. Mà là những trang còn lại.
  • Mỗi trang một mật khẩu, và quên được cũng chẳng sao. Nếu bạn nhớ được hết mật khẩu của mình, thì hoặc bạn có quá ít, hoặc chúng quá tệ.
  • Yếu tố thứ hai bẻ gãy dây chuyền. Credential stuffing thử cặp email:mật khẩu. Nếu chừng đó chưa đủ để vào, bản kiểm kê mất sạch giá trị.

Mật khẩu bị lộ của bạn không nằm trong tay một kẻ thù. Nó nằm ở một dòng trong một tệp, giữa hàng trăm triệu dòng khác, chờ đến lúc có người thấy bõ công đem thử ở thêm một trang nữa. Và thứ duy nhất quyết định chuyện đó có hiệu quả hay không thì chính bạn đã quyết định từ nhiều năm trước, cái lần bạn gõ lại đúng cái từ ấy lần thứ hai.


Nguồn: vụ rò rỉ RockYou (tháng 12 năm 2009) và việc rockyou.txt sau đó được dùng làm từ điển tấn công · Have I Been Pwned và Pwned Passwords, của Troy Hunt · NIST SP 800-63B, về việc đối chiếu mật khẩu với các danh sách giá trị bị xâm phạm · phân tích của Troy Hunt về Collection #1 (tháng 1 năm 2019) và các con số ông công bố · định nghĩa credential stuffing của OWASP.

← Quay lại blog