Thực hư chuyện Facebook lưu mật khẩu dưới dạng text, để lộ mật khẩu trăm triệu người dùng?

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.

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
Facebook xây dựng luôn cả 1 hệ thống để kiểm tra mật khẩu bị lộ của người dùng (Nguồn)

Đấ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õ.

Mật khẩu của vài trăm triệu user đang nằm hớ hênh trong những file log thế này đây!

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.

10 thoughts on “Thực hư chuyện Facebook lưu mật khẩu dưới dạng text, để lộ mật khẩu trăm triệu người dùng?”

  1. 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 😀

    Like

  2. 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

    Like

    1. 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? =]]

      Like

      1. 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.

        Like

    2. 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)

      Like

    3. 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.

      Like

  3. 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ị

    Like

  4. 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ỉ?

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s