- WhatsApp, với hơn 3 tỷ người dùng, đã triển khai một lớp bảo mật dựa trên Rust để tăng cường khả năng phòng vệ trước các mối đe dọa từ mã độc
- Thư viện đảm bảo tính nhất quán của media đã được viết lại bằng Rust và triển khai đến hàng chục tỷ thiết bị cùng trình duyệt, hoàn tất kiểm chứng trong thực tế ở quy mô toàn cầu
- 160.000 dòng mã C++ hiện có đã được thay thế bằng 90.000 dòng Rust, đồng thời cải thiện cả hiệu năng lẫn hiệu quả sử dụng bộ nhớ
- Sau lỗ hổng Stagefright năm 2015, WhatsApp đã thúc đẩy việc áp dụng ngôn ngữ an toàn bộ nhớ như Rust để nâng cao độ an toàn trong quá trình xử lý tệp media
- Thay đổi này là bước ngoặt mở rộng vai trò của ngôn ngữ an toàn bộ nhớ trong chiến lược bảo mật của WhatsApp, Messenger và Instagram
Chiến lược xử lý media của WhatsApp
- WhatsApp là dịch vụ nhắn tin mã hóa đầu cuối được hơn 3 tỷ người sử dụng, và đã liên tục phát triển chiến lược để ứng phó với các mối đe dọa bảo mật
- Khi người dùng chia sẻ media như hình ảnh hoặc video, luôn tồn tại khả năng các tệp này chứa mã độc
- Một số tệp có thể khai thác các lỗ hổng chưa được vá trong hệ điều hành hoặc ứng dụng
- Để ngăn chặn điều này, WhatsApp đã đưa ngôn ngữ Rust vào tính năng chia sẻ media nhằm bảo đảm an toàn bộ nhớ
- Đây được xem là một trong những trường hợp triển khai thư viện dựa trên Rust ở quy mô lớn nhất thế giới
Lỗ hổng Android Stagefright năm 2015 và cách ứng phó
- Lỗ hổng Stagefright trên Android năm 2015 tồn tại trong thư viện xử lý media ở cấp hệ điều hành, nên không thể được khắc phục ở cấp ứng dụng
- WhatsApp đã sửa đổi thư viện C++ nội bộ “wamedia” để phát hiện các tệp không tuân thủ chuẩn MP4
- Nhờ đó có thể bảo vệ người dùng mà không cần chờ cập nhật hệ điều hành
- Tuy nhiên, vì wamedia tự động xử lý đầu vào không đáng tin cậy, nhu cầu chuyển sang ngôn ngữ an toàn bộ nhớ ngày càng trở nên rõ ràng
Chuyển sang Rust: Viết lại ở quy mô lớn và kết quả đạt được
- WhatsApp đã phát triển phiên bản wamedia bằng Rust song song với phiên bản C++ hiện có
- Tính tương thích giữa hai bản triển khai được xác minh bằng differential fuzzing, kiểm thử tích hợp và kiểm thử đơn vị
- Ban đầu có các vấn đề như kích thước binary tăng lên do thư viện chuẩn của Rust và khả năng tương thích với hệ thống build, nhưng về lâu dài WhatsApp đã xây dựng được cơ chế hỗ trợ phù hợp
- Kết quả là 160.000 dòng C++ → 90.000 dòng Rust, đồng thời cải thiện cả hiệu năng và hiệu quả sử dụng bộ nhớ
- Phiên bản Rust hiện đã được triển khai hoàn toàn trên mọi nền tảng như Android, iOS, Mac, Web và thiết bị đeo
- Sau đó, WhatsApp còn đưa vào hệ thống “Kaleidoscope” để phát hiện các loại tệp nguy hiểm như PDF, tệp thực thi, cũng như nhận diện việc giả mạo phần mở rộng hoặc MIME spoofing
Cách tiếp cận bảo mật của WhatsApp
- WhatsApp vận hành nhiều lớp bảo mật như mã hóa đầu cuối, sao lưu được mã hóa, key transparency và các tính năng bảo vệ cuộc gọi
- Rủi ro được nhận diện thông qua công bố CVE, kiểm toán bảo mật nội bộ và bên ngoài, fuzzing và phân tích tĩnh, quản lý chuỗi cung ứng và phân tích bề mặt tấn công
- WhatsApp đã mở rộng chương trình Bug Bounty, cung cấp Research Proxy để các nhà nghiên cứu có thể phân tích giao thức mạng của WhatsApp
- Sau khi xác nhận rằng phần lớn các lỗ hổng nghiêm trọng bắt nguồn từ vấn đề an toàn bộ nhớ trong C/C++, WhatsApp đã đồng thời triển khai ba chiến lược
- Giảm thiểu các bề mặt tấn công không cần thiết
- Tăng cường bảo đảm an toàn cho phần mã C/C++ còn lại
- Chuyển ngôn ngữ mặc định của mã mới sang ngôn ngữ an toàn bộ nhớ
Tăng tốc áp dụng Rust và định hướng sắp tới
- Rust cho phép WhatsApp phát triển thư viện bảo mật hiệu năng cao, đa nền tảng
- Thay đổi này mang lại một lớp bảo mật bổ sung mà người dùng không nhìn thấy, như một phần của chiến lược phòng thủ nhiều lớp (defense-in-depth)
- Đội ngũ bảo mật của WhatsApp và Meta đang mở rộng các lĩnh vực áp dụng Rust có hiệu quả cao, và có kế hoạch đẩy nhanh việc áp dụng Rust trong thời gian tới
1 bình luận
Ý kiến trên Hacker News
WhatsApp là ứng dụng nhắn tin được 3 tỷ người sử dụng mỗi ngày
Ở Mỹ thì không phổ biến lắm, nhưng trên toàn cầu nó đã trở thành hạ tầng giao tiếp cơ bản
Nếu muốn làm sản phẩm cho thị trường toàn cầu, cần hiểu cách nghĩ và thói quen của những người dùng này
Vẫn còn vài chục người độc lập như vậy
Mong là đừng tham gia vào việc khiến WhatsApp càng khó tránh né hơn
Hầu hết mọi người gần như không kiểm tra email
Tôi điều hành một cộng đồng lập trình viên và thường xuyên chạm giới hạn số người trong nhóm (1024 người)
Dù cố chuyển sang Discord hay Slack thì cuối cùng mọi người vẫn quay lại WhatsApp
Vì nhờ các gói dữ liệu của nhà mạng, WhatsApp về cơ bản là miễn phí
TechCrunch đã nhiều lần đăng bài về spam tin nhắn doanh nghiệp, nhưng thực tế hầu như không có gì thay đổi
UX của tính năng cộng đồng cũng không tốt
Cuối cùng, tôi nghĩ vấn đề là sự phụ thuộc ngày càng nặng vào hệ sinh thái Facebook
Tôi đã không dùng WhatsApp suốt 10 năm, và phần lớn bạn bè, người thân của tôi cũng đã chuyển sang Signal
Ở châu Âu vẫn có những khu vực còn dùng Viber
Bài viết nói đây là đợt triển khai lớn nhất của một thư viện viết bằng Rust, nhưng thực tế Fontations có thể còn lớn hơn
Nó được tích hợp trong Chromium, và nếu tính cả các dependency thì khả năng cao có nền cài đặt rộng hơn
Nhìn vào phần trích dẫn thì có vẻ WhatsApp không trực tiếp dùng libsignal
Ví dụ: image-png, CrabbyAvif, qr_code, icu4x
Việc mã nguồn giảm từ 160 nghìn dòng xuống 90 nghìn dòng cũng tốt, nhưng chiến lược rollout song song còn thú vị hơn
Việc chạy đồng thời bản Rust và C++, rồi dùng differential fuzzing để kiểm chứng tính tương đương là rất thực tế
Trên client di động, kích thước binary rất quan trọng, nên việc họ đầu tư vào tooling cho build thật sự ấn tượng
Cũng có thể đó là tối ưu hóa chỉ khả dụng trên bản build nightly
Phần khó nhất của kiểu rewrite này không phải là bản hiện thực Rust, mà là giữ tương thích lỗi với parser cũ
Các file media ngoài thực tế thường bị sai định dạng, nên nếu parse quá nghiêm ngặt thì dữ liệu người dùng sẽ bị hỏng
differential fuzzing gần như là cách tiếp cận thực tiễn duy nhất
Việc nói WhatsApp có đợt triển khai Rust lớn nhất có lẽ là vì nó chạy trên nhiều thiết bị hơn Windows 11
Tuy vậy, vẫn còn nghi ngờ liệu WhatsApp có trực tiếp dùng libsignal hay không
Bản thân Android đã bao gồm khá nhiều mã dựa trên Rust, và Rust cũng được dùng rộng rãi trên thiết bị nhúng
còn Windows vẫn chủ yếu xoay quanh C/C++
Bài viết có nói việc đưa Rust standard library vào đã làm tăng kích thước binary, nhưng không nêu rõ họ đã giải quyết thế nào
Commit liên quan: commit1, commit2
Vấn đề không hẳn là kích thước, mà là các dependency Rust bị trùng lặp
Trong các bản build trộn C++ và Rust, mỗi bên đều tự mang theo libstd, nên cần một hệ thống build hợp nhất như Bazel
Ban đầu họ chấp nhận overhead khoảng 200KiB, nhưng nhờ chuyển sang Buck2 nên giảm được cả kích thước lẫn thời gian build
Đó là nhờ các tối ưu mới của clang và cải tiến LTO
Không rõ Signal có đang thử điều tương tự không
libsignal được hiện thực bằng Rust, nhưng những phần còn lại thì tôi không rõ
Có câu nói rằng họ cung cấp mã hóa đầu cuối mặc định cho 3 tỷ người, nhưng cũng từng có tin tức nói rằng họ có thể đọc được tin nhắn
Skype cũng mặc định có mã hóa, nhưng tùy cấu hình máy chủ mà có thể bị vô hiệu hóa
Vấn đề là liệu có thể tin tưởng rằng Meta không nhìn trộm dữ liệu hay không
Thật mỉa mai khi Meta lại rất tích cực trong những việc khác, trong khi không chặn được lừa đảo phishing hay lừa đảo thẻ trả trước
Điều ấn tượng là số lượng lỗi đã giảm nhiều nhờ đưa Rust vào
C++ có rất nhiều hành vi không xác định (UB), còn Rust chặn điều đó theo cấu trúc
Nhờ hệ thống kiểu mạnh, độ tin cậy được cải thiện đáng kể