Cách đây vài hôm, giang hồ rộ lên vụ Facebook lưu trữ mật khẩu người dùng dưới dạng plain text, nhân viên cũng có thể đọc được.
- The Verge: theverge.com/2019/3/21/18275837/facebook-plain-text-password-storage-hundreds-millions-users
- Wired: wired.com/story/facebook-passwords-plaintext-change-yours
- Bản Tiếng Việt: Facebook lộ mật khẩu
Vốn tò mò, mình tự hỏi: Tại sao một công ty lớn như Facebook lại có thể phạm phải một lỗi sơ đẳng như vậy được? Tìm hiểu sâu hơn, mình lại tìm hiểu thêm được 2 điều khá hay:
- Cách Facebook bảo vệ mật khẩu của người dùng
- Một lỗi bảo mật nghiêm trọng về mật khẩu, mà cả Facebook lẫn Twitter từng mắc phải
Tò mò chưa nào, các bạn đọc bài viết sẽ biết nhé!
Mật khẩu nên được lưu như thế nào?
Để mình giải thích ngắn gọn lý do chúng ta không nên lưu mật khẩu dưới dạng plain text cho các bạn không quá rành về bảo mật:
- Lưu dưới dạng plain text thì database admin hoặc developer có thể thấy mật khẩu người dùng.
- Database là nơi chứa nhiều dữ liệu, hay bị tấn công nhất. Khi database bị tấn công, hàng triệu người dùng sẽ lộ mật khẩu
- Người dùng thường tái sử dụng 1 mật khẩu ở nhiều dịch vụ, lộ 1 phát sẽ lộ hết các dịch vụ còn lại
Do vậy, mật khẩu phải được hash và salt trước khi lưu trữ vào database. Nếu muốn tìm hiểu rõ hơn các bạn xem clip dưới nhé!
Đấy, đến một thằng gà không chuyên bảo mật như mình còn biết cái này, lẽ nào Facebook lại không biết!
Do vậy, mình lên đọc thông báo chính thức của Facebook về vụ này. Sau khi đọc xong cái này và bài bên The Verge, mình rút ra được 2 điều:
- Facebook có quan tâm đến bảo mật của người dùng hay không
- Thật ra cái gì đã bị lộ? Tại sao nó lộ?
Facebook có quan tâm đến bảo mật của người dùng hay không?
Câu trả lời là CÓ, họ quan tâm rất kĩ là đằng khác.
In line with security best practices, Facebook masks people’s passwords when they create an account so that no one at the company can see them. In security terms, we “hash” and “salt” the passwords, including using a function called “scrypt” as well as a cryptographic key.
Không chỉ vậy, họ còn có một hệ thống để thu thập mật khẩu bị lộ từ các tổ chức khác, đối chiếu với mật khẩu trong Facebook và cảnh báo người dùng. Hệ thống này hoạt động như sau:
- Khi các trang khác (twitter, thegioididong, v…v) bị hack, hacker thường đăng mật khẩu lên mấy forum hoặc paste site
- Facebook sẽ scan các site này, lấy username và mật khẩu, hash rồi so sánh với mật khẩu trong Facebook
- Nếu thấy những mật khẩu này login được, Facebook sẽ báo cho người dùng rằng họ đã bị lộ mật khẩu

Đấy, nếu họ đã làm kĩ đến vậy, tại sao vẫn có chuyện mật khẩu plain text bị lộ ở đây? Lẽ nào các bạn “lều báo” vu oan cho Facebook?
Vậy thật ra cái gì bị lộ? Tại sao lộ?
Chuyện mật khẩu được lưu dưới dạng plain text là có thật, được chính Facebook thừa nhận. Tuy vậy, họ lại không nhắc gì tới nguyên nhân … tại sao nó lộ.
As part of a routine security review in January, we found that some user passwords were being stored in a readable format within our internal data storage systems. This caught our attention because our login systems are designed to mask passwords using techniques that make them unreadable.
Vốn tò mò, mình đi qua Wired tìm hiểu thì thấy một đoạn thế này
Facebook told WIRED that the exposed passwords weren’t all stored in one place, and that the issue didn’t result from a single bug in the platform’s password management system. Instead, the company had unintentionally and incidentally captured plaintext passwords across a variety of internal mechanisms and storage systems, like crash logs.
Đọc xong, phỏng đoán của mình là: Facebook đã hash mật khẩu khi lưu xuống database, tuy nhiên trong network log, crash log v…v lại chứa mật khẩu chưa được mã hóa.
Điều này là hoàn toàn dễ hiểu, khi đăng nhập, người dùng phải gửi mật khẩu chưa mã hóa lên server Facebook, thì server mới hash và so với mật khẩu trong database được.
Nói túm lại: Mật khẩu của bạn đang được lưu dưới dạng plain text trong mấy log file hoặc log database của Facebook, còn nó có đi kèm username/email ko thì mình không rõ.

Tạm kết
Tóm tắt lại, vụ Facebook có lưu mật khẩu dưới dạng text là có thật, còn mật khẩu của bạn có bị lộ hay không thì cũng khá là khó nói. Những file log này thường không được bảo mật kĩ như database, nên developer cũng có thể mò thấy được.
Bài học rút ra ở đây là gì:
- Đừng vội tin lều báo hay giang hồ đồn, mà hãy chịu khó kiểm chứng trước. Nghe lời lều báo tới lúc đi làm lại lưu mật khẩu dạng plain text thì … vỡ mồm
- Đến công ty lớn như Facebook cũng có lúc bị lỗi bảo mật (cách đây không lâu là vụ access_token), lâu lâu bạn có bị lỗi cũng đừng buồn. Nói đâu xa, Twitter cũng từng bị lỗi tương tự mà!
- Nên cẩn thận khi sử dụng logging. Logging là một công cụ rất mạnh, giúp bạn theo dõi hệ thống, sửa lỗi, nhưng log nhầm thông tin nhạy cảm thì … hậu quả khá là bự đấy.
Cám ơn a đã cũng cấp thông tin bài viết khá hay, lúc đầu e cũng nghĩ như a, nhưng e ko nghĩ là nó lại pass qua file log chứ e nghĩ chắc vào đb kiểu gì cũng bị hash chứ ko thể để hớ hênh thế đc 😀
LikeLike
Cám ơn anh Code Dạo đã chia sẻ, em có một thắc mắc mong mọi người giải đáp đó là nếu mật khẩu đã được HASH và SALT trước khi lưu vào database thì tại sao khi mình đổi mật khẩu nếu nó giống hay gần giống với những mật khẩu trước đây thì FB lại có thông báo và phải gõ mật khẩu khác.
Không biết có kĩ thuật hay công nghệ nào có thể làm được điều này nếu như mật khẩu chỉ được lưu dưới database theo kiểu không thể revert lại
LikeLike
Khi em đổi mật khẩu mới thì nó cũng hash ra rồi so với mật khẩu trong DB thôi em.
LikeLike
vậy ông nghĩ mật khẩu hash ra rồi và không thể revert thì đăng nhập bằng cách nào? =]]
LikeLike
Bạn nghĩ mình rất nguy hiểm?
Nguyên tắc bảo mật: tuyệt đối không được để bất cứ ai đọc được mật khẩu. Không bao giờ cho phép revert để đọc mật khẩu.
Cách đăng nhập mà không cần revert hashed password: mật khẩu sẽ được lưu dưới DB dưới dạng hash. Khi đăng nhập thì đem mật khẩu hash cùng với salt, rồi đem so sánh với hashed-pasword dưới DB. Nếu trùng thì cho đăng nhập, sai báo lỗi. Và lưu ta là không revert pasword.
LikeLike
mình cũng thắc mắc nè. Nếu hash + salt mà tìm được mật khẩu gần đúng thì thực sự hàm băm đó rất tệ, cũng có khi có thể giải được. Còn băm tốt thì không có cách nào truy ngược lại mật khẩu cũ và chỉ cần đổi 1 ký tự cũng đủ để cái chuỗi đó ra chuỗi mới hoàn toàn rồi. Vậy cũng có thể họ sẽ lưu plain text hoặc mã hóa có thể truy ngược được ở trong column của bảng nào đó hoặc trong một tập tin nào đó. (Cách giải thích này có thể hợp lý rồi)
LikeLike
Có lẽ bạn nhầm. Đổi mật khẩu Giống và Gần Giống là 2 trường hợp hoàn toàn khác nhau.
Mình chưa bao giờ, và có lẽ sẽ không bao giờ nhận được Thông báo rằng mật khẩu gần giống, vì thế có khác gì bảo Hacker: các ông đoán gần đúng rồi, cố lên, tiếp tục đi.
Bạn trong thực tế các website lớn chỉ lưu mật khẩu và mật khẩu trong quá khứ kẻ dạng hash, day đó khi đăng nhập hay đổi mk thì háhed rồi do sánh với mi hiện tại/ quá khứ trong db.
Và mình khẳng định: không bao giờ Thông báo: mật khẩu nhập vào GẦN GIỐNG mk trong quá khứ vì không ai được phép đọc mk, và 2 mk gần giống được Haag hoàn toàn khác nhau.
LikeLike
Chào anh Hoàng cùng các anh em đọc giả,
Các bạn có thấy điều gì đặc biệt trong file robots.txt của facebook không? (Truy cập facebook.com/robots.txt).
LikeLike
cơ mà 2 ngày nay e vào fb nó báo bị lộ mk :v rõ chán đều dùng trong 1 cái lap mà vẫn bị
LikeLike
Vậy trường hợp login fb có thể gõ mật khẩu rồi + thêm 1 ký tự bất kỳ. Vẫn pass thì giải thích sao a nhỉ?
LikeLike