J2TEAM Security: A must-have extension for Chrome users. Install now!

Về Defoundly, Profoundly và Privacy

Đây là bài viết chính thức từ J2TEAM sau bài viết phân tích kỹ thuật "Profoundly: Có thật sự ẩn danh?" bởi T-Rekt từ hơn một tuần trước.
Đây là bài viết chính thức từ J2TEAM sau bài viết phân tích kỹ thuật “Profoundly: Có thật sự ẩn danh?” bởi T-Rekt từ hơn một tuần trước.

TL;DR (tóm tắt cho ai lười đọc): Profoundly đã cập nhật, không còn sửa truy vấn để đọc dữ liệu của người chơi khác được nữa. Vấn đề quyền riêng tư đã được giải quyết. Các bạn có thể yên tâm chơi cùng bạn bè rồi nha!

Ngay sau khi chia sẻ lên nhóm J2TEAM Community, bài viết đó đã nhanh chóng nhận được phản ứng nhiệt tình từ các thành viên do Profoundly đang là một ứng dụng hot trên Facebook – mạng xã hội lớn nhất thế giới với hơn 2 tỉ người dùng hàng tháng. Hãy cùng điểm qua một vài số liệu thống kê bởi SMCC:


Với cá nhân mình thì nó không thu hút lắm vì được làm lại theo ý tưởng của một ứng dụng “hỏi ẩn danh” phổ biến trước đó là Ask.fm hay gần đây nhất là Sarahah. Tuy nhiên, điều khiến Profoundly trở nên hot chỉ trong mấy ngày ra mắt có lẽ dựa trên vài yếu tố sau:

  • Dựa vào ông lớn Facebook: nhờ việc là Instant Games, Profoundly có thể nhanh chóng tiếp cận được với lượng người dùng khổng lồ sẵn có từ Facebook mà không mất quá nhiều chi phí marketing để thu hút lượng người dùng ban đầu.
  • Nếu như Ask hay Sarahah có cơ chế (game flow) là trả lời trên ứng dụng rồi sau đó mới chia sẻ câu trả lời lên các mạng xã hội để lan tỏa thì Profoundly lại có một cách chơi khá thông minh là sử dụng chính tính năng Chia sẻ để người dùng ghi câu trả lời. Điều này khiến game lan tỏa với tốc độ chóng mặt vì người dùng muốn trả lời thì họ đã bị “ép buộc” chia sẻ game một cách hoàn toàn tự nguyện. Hơn nữa, khi bạn bè của người chơi nhấn vào xem câu trả lời thì ngay lập tức có thể chơi game ngay, nhờ điểm này của Instant Games mà mức độ lan tỏa tăng theo cấp số nhân.
  • Cũng vì là Instant Games, người chơi có thể chơi trực tiếp từ Facebook mà không phải sang một trang thứ ba. Hơn nữa, việc đăng ký/đăng nhập là không còn cần thiết nữa khi quá trình xác thực và khởi tạo người chơi mới đã không còn là vấn đề, tài khoản Facebook của bạn chính là tài khoản để chơi game. Điều này khiến trải nghiệm người dùng trở nên tiện lợi và nhanh chóng.

Vì mức độ hot như vậy, việc J2TEAM công bố bài viết phân tích kỹ thuật cho thấy Profoundly có lỗ hổng về quyền riêng tư đã ngay lập tức nhận được sự quan tâm không chỉ từ những thành viên của J2TEAM Community mà còn lan tỏa tới khắp cộng đồng mạng.


Với áp lực truyền thông tới từ Defoundly – tiện ích phá vỡ tính ẩn danh của Profoundly đã khiến đội ngũ phát triển game ngay lập tức phản ứng và cập nhật liên tục. Trong bài viết này, chúng ta sẽ cùng phân tích xem liệu tới giờ phút này Profoundly đã an toàn hay chưa?

Cuộc đấu code giữa Profoundly vs. Defoundly

Ở thời điểm ra mắt, Profoundly sử dụng một truy vấn GET tới địa chỉ sau để lấy toàn bộ câu hỏi của người chơi:

https://game.n***group.me/ng/GetAllMessages?playerId=UID

Trong đó, UID là ID định danh người chơi hiện tại. Vấn đề họ gặp phải ở đây là gì? Đó là không có sự xác thực ID từ phía server (máy chủ game) để đảm bảo ID đó có thực sự của người đang gửi truy vấn hay không. Bằng cách thay đổi ID, chúng ta có thể xem được toàn bộ câu hỏi của người chơi khác (kể cả không phải bạn bè của mình).

Sau khi cập nhật, Profoundly đổi tên miền của link trên thành:

https://*****.execute-api.us-west-2.amazonaws.com/Testing/getmessage?playerId=UID

Thay đổi nhỏ này khiến Defoundly chỉ việc đổi link theo là có thể hoạt động bình thường.

Sau khi tiếp tục cập nhật, họ đã để 2 trường “name” và “image” trả về giá trị rỗng. Sự thay đổi nhỏ này khiến dù có lấy được câu hỏi nhưng cũng không biết tên và ảnh đại diện của người hỏi. Tuy nhiên, chúng mình cũng có một thủ thuật nhỏ để vượt qua.

Vì khi nạp game có một truy vấn lấy toàn bộ danh sách bạn bè đã chơi. Chúng mình có thể so sánh ID của truy vấn phía trên với ID từ danh sách bạn bè để tìm ra 2 trường tên và ảnh đại diện.

Nhận ra được thủ thuật chúng mình sử dụng, Profoundly nhanh chóng cập nhật tiếp và đặt giá trị của trường “from” thành rỗng, khiến Defoundly không thể so sánh được. Tại thời điểm này, extension của J2TEAM vẫn có thể lấy toàn bộ câu hỏi của bạn bè, đây vẫn là một vấn đề về quyền riêng tư của người chơi khác. Ngoài ra, bạn Phan Tuấn trên J2TEAM Community cũng tìm thấy thủ thuật khác để kết hợp cùng Defoundly lần ra tung tích của người gửi câu hỏi.

Nhóm phát triển game tiếp tục cập nhật, chuyển đổi phương thức gửi truy vấn từ GET thành POST. Defoundly chỉ đơn giản là thay đổi phương thức theo.

Cuối cùng, có vẻ như họ đã thực sự tìm thấy đúng cách để giải quyết vấn đề. Truy vấn gọi API giờ đây sẽ có thêm tham số “authentication”.


Nếu đọc kỹ lại từ đầu cũng như trong bài phân tích trước đó của T-Rekt, các bạn sẽ thấy là chỉ có một tham số “playerId”. Việc sử dụng “authentication” với giá trị là một chuỗi chữ ký (signature) sẽ có tác dụng giống như CSRF Token vậy. Bạn nào là dân lập trình web sẽ hiểu ngay nó có tác dụng gì phải không.

Theo như Facebook cho biết:

A signature to verify this object indeed comes from Facebook. The string is base64url encoded and signed with an HMAC version of your App Secret, based on the OAuth 2.0 spec.

Như vậy, thực hiện giải mã thử một chuỗi chữ ký, ta được:


Các bạn thấy ID của mình (player_id) trong đó chứ? Sau khi truy vấn được gửi lên, tại phía máy chủ game (server) sẽ thực hiện giải mã chữ ký để so sánh ID người chơi có đúng là ID đang gửi truy vấn hay không. Bằng cách sử dụng khóa bí mật được cung cấp khi tạo ứng dụng, server có thể đảm bảo đây không phải là chữ ký giả. Và đồng nghĩa với việc chúng ta không thể tạo giả chữ ký để truy vấn vì không có khóa bí mật đang được lưu từ server.

Bạn có lẽ đang tự hỏi, vậy chữ ký mà mình lấy được trong hình trên (chụp từ client) được tạo từ đâu, có thể tìm ra hàm tạo từ client hay không? Xin trả lời luôn là nó được tạo bởi một truy vấn tới Graph API (server-side) thông qua SDK, chứ không phải tạo trực tiếp từ client-side (JavaScript). Như vậy, chỉ có hai bên nắm khóa bí mật: Facebook và nhà phát triển ứng dụng (team Profoundly).

Như vậy, nhờ vào việc cập nhật sử dụng chữ ký này, việc sửa đổi ID người chơi để “đọc trộm” câu hỏi của người chơi khác đã trở nên bất khả thi. Truy vấn giờ đây sẽ trả về kết quả là “Player ID không khớp” (sau khi so sánh với ID trong chữ ký).


Profoundly đã thật sự ẩn danh chưa?

Họ đã phạm phải vấn đề kỹ thuật trong những ngày đầu phát hành. Tuy nhiên chúng mình đánh giá cao phản ứng của họ ngay khi phát hiện ra lỗ hổng về quyền riêng tư. Theo dõi cho thấy Defoundly chỉ vừa cập nhật là 3, 4 tiếng sau đã có thay đổi từ Profoundly.

Các bạn đã có thể yên tâm sử dụng ứng dụng mà không phải lo lắng về danh tính bị lộ diện nữa. Việc đọc được câu hỏi của người chơi khác cũng không còn là vấn đề. Giờ nếu ai mà đọc được tức là tìm được cách để tạo chữ ký từ client-side. Nên báo cáo cho Facebook để nhận thưởng nha!

Về extension Defoundly

Sẽ không có một bản cập nhật extension nào nữa. Từ lúc phát hành extension này chúng mình đã đạt được quá nhiều: J2TEAM Community tăng thêm hơn 10.000 thành viên và vẫn chưa có dấu hiệu dừng tới tận hôm nay. Tương tự với các fanpage của team, kênh Youtube của mình đăng một video demo cho extension thôi mà cũng được hơn 30.000 lượt xem và kênh tăng hơn 1000 người theo dõi.


Về phía Profoundly, họ nhanh chóng nhận biết được vấn đề và khắc phục trước lúc mọi chuyện trở nên lớn hơn. Rõ ràng, với hơn 5 triệu người dùng (theo thông tin từ Facebook) dù đây là ứng dụng mới ra mắt thì việc xử lý lỗ hổng này càng sớm càng tránh được khủng hoảng từ truyền thông sau này. Đặc biệt là khi vấn đề về quyền riêng tư đang trở nên nhức nhối khi các ông lớn liên tục dính scandal.

Có thể nói, qua sự việc này thì “đôi bên cùng có lợi” (win-win). Chúng mình không cần tiếp tục cập nhật Defoundly để gây khó dễ cho các nhà phát triển nữa.

P/S: Một game khác đang phổ biến mà chúng mình đã nhắm tới sẽ được công khai trong thời gian ngắn tới đây nhé.
Leader at J2TEAM. Website: https://j2team.dev/