How WhatsApp enables de-identified authenticated telemetry (DIT)

Bài tóm tắt WhatsApp 2021 3. Quy mô lớn Độ khó: Khó

WhatsApp · 2021 · 3. Quy mô lớn · Độ khó: Khó — bài gốc

Dịch vụ phía sau (Anonymous Credential Service) được kể riêng ở Meta 2022.

Bối cảnh

  • WhatsApp (2021): hơn 100 tỉ tin nhắn và 1 tỉ cuộc gọi mỗi ngày. Để vận hành cần metric như tin có tới nơi không, bao nhiêu người dùng hệ điều hành nào.
  • Trước đó họ dựa vào lưu trữ bảo mật và xoá dữ liệu để log không bị gắn về một người. Nhưng log gửi qua kết nối đã xác thực thì về bản chất vẫn gắn được với danh tính.
  • Bắt đầu xây từ đầu 2020 (tên cũ PrivateStats); bài viết khi đã rollout toàn cầu và đang thử nghiệm ở quy mô thật.

Thay đổi chính

  • Tách log thành hai bước:
    1. Qua kết nối đã xác thực, client lấy trước một lô token bằng VOPRF (verifiable oblivious pseudorandom function): ACS tính VOPRF bằng khoá bí mật của nó, trả về làm credential.
    2. Khi gửi log, client gửi qua kết nối không xác thực, kèm input của token và HMAC trên dữ liệu bằng khoá dẫn xuất từ token. Server ứng dụng chuyển cho ACS kiểm token và giới hạn số lần dùng, lấy lại khoá HMAC rồi kiểm toàn vẹn log.
  • Tính giả ngẫu nhiên của VOPRF làm token ở hai bước không nối được với nhau; tính "verifiable" giúp client biết mình không bị đưa khoá độc. Ý tưởng lấy từ Privacy Pass và chữ ký mù.

Đánh đổi khi chạy ở quy mô lớn

  • Đường cong: chọn EC-VOPRF như Privacy Pass vì có đường chuẩn hoá. Định dùng Ristretto nhưng chuyển sang Curve25519 đã có sẵn trong app cho mã hoá đầu cuối, vì giới hạn kích thước app; bù lại rủi ro tấn công static DH bằng xoay khoá thường xuyên hơn.
  • Không nối được, nhưng vẫn cần gộp: mỗi client có một định danh giả xoay định kỳ gửi kèm log. Token được dùng lại tối đa 64 lần/ngày để đa số client cả ngày không phải lấy token mới; đổi lại tính không nối được yếu đi.
  • Nguy cơ định danh lại: đo khả năng nối/định danh lại của dữ liệu thu được, báo động khi vượt ngưỡng và ngừng thu loại dữ liệu đó; edge server bỏ IP trước khi tới logging server.
  • Rate limit khi không biết là ai: giới hạn số token mỗi client được xin theo từng public key rồi xoay key để token hết hạn; server đếm số lần một credential đã dùng và từ chối khi vượt ngưỡng.
  • Chi phí liên lạc: thêm bước lấy credential và gọi ACS ở mỗi bước; giảm bằng cho dùng lại token và đặt ACS cùng vùng với server ứng dụng để tránh traffic chéo vùng.

Vì sao

  • Theo WhatsApp: muốn biết "bao nhiêu người bị crash" mà không biết "ai bị crash", tức giảm dữ liệu ngay từ lúc thu thay vì xoá sau.

Bài học cho SWE

  • Có thể tách "client này hợp lệ" khỏi "client này là ai" bằng token ẩn danh lấy trước; xác thực và định danh không nhất thiết đi cùng nhau.
  • Mỗi núm vặn (số lần dùng lại token, tần suất xoay khoá) là đánh đổi trực tiếp giữa quyền riêng tư và chi phí, độ tin cậy.
  • Khi không thể rate limit theo user, rate limit theo khoá và theo credential.

Liên quan