- WhatsApp ซึ่งมีผู้ใช้มากกว่า 3 พันล้านคน ได้เริ่มนำ ชั้นความปลอดภัยที่พัฒนาด้วย Rust มาใช้เพื่อเสริมความสามารถในการป้องกันภัยคุกคามจากมัลแวร์
- มีการ เขียนไลบรารีความสอดคล้องของสื่อใหม่ด้วย Rust และแจกจ่ายไปยังอุปกรณ์และเบราว์เซอร์หลายพันล้านเครื่อง พร้อมผ่านการพิสูจน์การใช้งานจริงในระดับโลกแล้ว
- โค้ด C++ เดิม 160,000 บรรทัดถูกแทนที่ด้วย Rust 90,000 บรรทัด พร้อมทั้งปรับปรุงทั้งประสิทธิภาพและประสิทธิภาพการใช้หน่วยความจำ
- หลังเหตุ ช่องโหว่ Stagefright ในปี 2015 มีการผลักดันให้ใช้ ภาษาแบบ memory-safe อย่าง Rust เพื่อเพิ่มความปลอดภัยของกระบวนการจัดการไฟล์มีเดีย
- การเปลี่ยนแปลงนี้เป็นจุดเปลี่ยนที่ขยายบทบาทของภาษาแบบ memory-safe ใน กลยุทธ์ความปลอดภัยของ WhatsApp, Messenger และ Instagram โดยรวม
กลยุทธ์การประมวลผลมีเดียของ WhatsApp
- WhatsApp เป็น บริการส่งข้อความแบบเข้ารหัสจากต้นทางถึงปลายทาง ที่มีผู้ใช้มากกว่า 3 พันล้านคน และได้พัฒนากลยุทธ์อย่างต่อเนื่องเพื่อรับมือกับภัยคุกคามด้านความปลอดภัย
- เมื่อผู้ใช้แชร์สื่ออย่างรูปภาพหรือวิดีโอ ก็มีความเป็นไปได้ที่มัลแวร์จะถูกฝังมากับไฟล์
- ไฟล์บางประเภทอาจใช้ประโยชน์จาก ช่องโหว่ที่ยังไม่ได้แพตช์ ของระบบปฏิบัติการหรือแอปได้
- เพื่อป้องกันสิ่งนี้ จึงได้นำ ภาษา Rust มาใช้กับฟีเจอร์การแชร์มีเดียเพื่อให้ได้ความปลอดภัยด้านหน่วยความจำ
- กรณีนี้ถูกกล่าวถึงว่าเป็นหนึ่งใน ตัวอย่างการแจกจ่ายไลบรารีที่พัฒนาด้วย Rust ในขนาดใหญ่ที่สุดของโลก
ช่องโหว่ Android Stagefright ในปี 2015 และการรับมือ
- ช่องโหว่ Stagefright ของ Android ในปี 2015 อยู่ในไลบรารีประมวลผลมีเดียระดับระบบปฏิบัติการ ทำให้ไม่สามารถแก้ไขได้ในระดับแอป
- WhatsApp ได้ปรับปรุงไลบรารี C++ ภายในของตนชื่อ “wamedia” ให้สามารถ ตรวจจับไฟล์ที่ไม่เป็นไปตามมาตรฐาน MP4 ได้
- ทำให้สามารถปกป้องผู้ใช้ได้โดยไม่ต้องรอการอัปเดตระบบปฏิบัติการ
- อย่างไรก็ตาม เนื่องจาก wamedia ประมวลผลอินพุตที่ไม่น่าเชื่อถือโดยอัตโนมัติ จึงเกิดความจำเป็นที่จะต้องเปลี่ยนไปใช้ภาษาแบบ memory-safe
การเปลี่ยนผ่านสู่ Rust: การเขียนใหม่ครั้งใหญ่และผลลัพธ์
- WhatsApp ได้พัฒนา wamedia เวอร์ชัน Rust ควบคู่ไปกับเวอร์ชัน C++ เดิม
- ใช้ differential fuzzing, integration test และ unit test เพื่อตรวจสอบความเข้ากันได้ระหว่างสอง implementation
- ในระยะแรกมีปัญหาเรื่อง ขนาดไบนารีที่เพิ่มขึ้น จาก Rust standard library และ ความเข้ากันได้กับระบบ build แต่ได้วางระบบรองรับระยะยาวไว้แล้ว
- ผลลัพธ์คือมีการแทนที่ C++ 160,000 บรรทัด → Rust 90,000 บรรทัด พร้อมปรับปรุงทั้งประสิทธิภาพและประสิทธิภาพการใช้หน่วยความจำ
- เสร็จสิ้นการแจกจ่ายเวอร์ชัน Rust แบบสมบูรณ์แล้วบน ทุกแพลตฟอร์ม เช่น Android, iOS, Mac, Web และอุปกรณ์สวมใส่
- หลังจากนั้นยังได้เปิดตัวระบบ “Kaleidoscope” เพื่อใช้ตรวจจับไฟล์เสี่ยง เช่น PDF และไฟล์ปฏิบัติการ รวมถึงตรวจจับการปลอมแปลงนามสกุลไฟล์และ MIME spoofing
แนวทางด้านความปลอดภัยของ WhatsApp
- WhatsApp มีชั้นความปลอดภัยหลายรูปแบบ เช่น การเข้ารหัสจากต้นทางถึงปลายทาง, การสำรองข้อมูลแบบเข้ารหัส, key transparency และ ฟีเจอร์ป้องกันการโทร
- มีการระบุความเสี่ยงผ่าน การเปิดเผย CVE, การตรวจสอบความปลอดภัยทั้งภายในและภายนอก, fuzzing และ static analysis, การจัดการซัพพลายเชน และ การวิเคราะห์ attack surface
- มีการขยาย โปรแกรม Bug Bounty พร้อมให้ Research Proxy เพื่อให้นักวิจัยสามารถวิเคราะห์ network protocol ของ WhatsApp ได้
- เมื่อยืนยันได้ว่าช่องโหว่สำคัญจำนวนมากมีต้นตอจาก ปัญหา memory safety ใน C/C++ จึงดำเนิน 3 กลยุทธ์ควบคู่กัน
- ลด attack surface ที่ไม่จำเป็น
- เสริมการรับประกันความปลอดภัยให้โค้ด C/C++ ที่ยังเหลืออยู่
- เปลี่ยนภาษาเริ่มต้นของโค้ดใหม่เป็น ภาษาแบบ memory-safe
การเร่งนำ Rust มาใช้และทิศทางในอนาคต
- Rust ทำให้ WhatsApp สามารถพัฒนา ไลบรารีความปลอดภัยประสิทธิภาพสูงแบบข้ามแพลตฟอร์ม ได้
- การเปลี่ยนแปลงนี้มอบ ชั้นความปลอดภัยเพิ่มเติมที่ผู้ใช้มองไม่เห็น และเป็นส่วนหนึ่งของกลยุทธ์ defense-in-depth
- ทีมความปลอดภัยของ WhatsApp และ Meta กำลังขยาย พื้นที่ใช้งาน Rust ที่ให้ผลลัพธ์สูง และมีแผน เร่งการนำ Rust มาใช้ ต่อไป
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
WhatsApp เป็นเมสเซนเจอร์ที่มีผู้ใช้ 3 พันล้านคน ต่อวัน
แม้ในสหรัฐฯ จะไม่ได้ใช้กันมากนัก แต่ในระดับโลกมันได้กลายเป็น โครงสร้างพื้นฐานด้านการสื่อสาร ไปแล้ว
ถ้าคุณอยากสร้างผลิตภัณฑ์สำหรับตลาดโลก คุณต้องเข้าใจวิธีคิดและพฤติกรรมของผู้ใช้กลุ่มนี้
ยังมีคนหัวแข็งแบบนี้อยู่อีกอย่างน้อย หลายสิบคน
ได้โปรดอย่าไปมีส่วนร่วมในการทำให้ WhatsApp ยิ่งหลีกเลี่ยงไม่ได้กว่าเดิม
คนส่วนใหญ่แทบไม่เช็กอีเมลเลย
ฉันดูแลคอมมูนิตี้นักพัฒนา และชนเพดานจำนวนสมาชิกกลุ่ม (1024 คน) อยู่บ่อย ๆ
ต่อให้พยายามย้ายไป Discord หรือ Slack สุดท้ายก็ต้องกลับมาที่ WhatsApp
เพราะ แพ็กเกจดาต้าของผู้ให้บริการเครือข่าย ทำให้ WhatsApp แทบจะใช้ฟรี
TechCrunch ลงข่าวเรื่องสแปมจากข้อความธุรกิจบน WhatsApp หลายครั้ง เช่น บทความนี้ แต่ในความเป็นจริงแทบไม่มีอะไรเปลี่ยน
UX ของฟีเจอร์คอมมูนิตี้ก็ไม่ค่อยดี
สุดท้ายผมคิดว่าปัญหาคือการ ผูกติดกับ ecosystem ของ Facebook ที่หนักขึ้นเรื่อย ๆ
ฉันไม่ได้ใช้ WhatsApp มา 10 ปีแล้ว และเพื่อนกับครอบครัวของฉันส่วนใหญ่ก็ย้ายไป Signal กันหมด
ในยุโรปก็ยังมีบางพื้นที่ที่ใช้ Viber กันอยู่
เขาบอกว่าเป็นการดีพลอยไลบรารีที่เขียนด้วย Rust ในสเกลใหญ่ที่สุด แต่จริง ๆ แล้ว Fontations อาจใหญ่กว่าก็ได้
มันถูกรวมอยู่ใน Chromium และถ้านับ dependency ด้วย ฐานการติดตั้งก็น่าจะกว้างกว่า
จากข้อความอ้างอิงดูเหมือนว่า WhatsApp ไม่ได้ใช้ libsignal โดยตรง
เช่น image-png, CrabbyAvif, qr_code, icu4x
การที่โค้ดลดจาก 160,000 บรรทัดเหลือ 90,000 บรรทัดก็ดีอยู่แล้ว แต่สิ่งที่น่าสนใจกว่าคือ กลยุทธ์การทยอยปล่อยแบบขนาน
การรันเวอร์ชัน Rust กับ C++ พร้อมกัน แล้วตรวจสอบความเท่าเทียมด้วย differential fuzzing เป็นแนวทางที่สมจริงมาก
บนไคลเอนต์มือถือ ขนาดไบนารี เป็นเรื่องสำคัญ และก็น่าประทับใจที่พวกเขาลงทุนกับ tooling ฝั่ง build
อาจเป็น optimization ที่ทำได้เฉพาะบน nightly build
ส่วนที่ยากที่สุดของการ rewrite แบบนี้ ไม่ใช่ตัว implementation ใน Rust เอง แต่เป็นการ คงความเข้ากันได้กับบั๊กของ parser เดิม
ไฟล์มีเดียจริงมักจะมีรูปแบบที่ผิดพลาดอยู่บ่อย ๆ ถ้า parse แบบเข้มงวดเกินไป ข้อมูลของผู้ใช้ก็จะพัง
ในทางปฏิบัติ differential fuzzing แทบเป็นวิธีเดียวที่ใช้ได้จริง
ที่บอกว่า WhatsApp คือการดีพลอย Rust ที่ใหญ่ที่สุด ก็คงเพราะมันรันอยู่บน อุปกรณ์มากกว่า Windows 11
แต่ก็ยังน่าสงสัยว่า WhatsApp ใช้ libsignal โดยตรงหรือไม่
ตัว Android เองก็มี โค้ดที่พัฒนาด้วย Rust อยู่มากแล้ว และในอุปกรณ์ embedded ก็ถูกใช้อย่างแพร่หลายเช่นกัน
ส่วน Windows ก็ยังคงเน้น C/C++ เป็นหลัก
มีการบอกว่าการนำ Rust standard library เข้ามาทำให้ ขนาดไบนารีเพิ่มขึ้น แต่ไม่ได้ระบุชัดว่าแก้ปัญหาอย่างไร
คอมมิตที่เกี่ยวข้อง: commit1, commit2
ปัญหาไม่ได้อยู่ที่ขนาดอย่างเดียว แต่คือ dependency ของ Rust ที่ซ้ำซ้อน
ใน build ที่ผสม C++ กับ Rust ต่างฝ่ายต่างรวม libstd ของตัวเอง จึงต้องมีระบบ build แบบรวมศูนย์อย่าง Bazel
ตอนแรกยอมรับ overhead ราว 200KiB แต่พอ ย้ายไป Buck2 ก็ลดได้ทั้งขนาดและเวลา build
ด้วยอานิสงส์จาก optimization ใหม่ของ clang และการปรับปรุง LTO
สงสัยว่า Signal ทำอะไรคล้าย ๆ กันหรือไม่
libsignal เขียนด้วย Rust ก็จริง แต่ส่วนอื่น ๆ ยังไม่ค่อยทราบ
มีข้อความว่า “ให้บริการ end-to-end encryption แก่ผู้ใช้ 3 พันล้านคนโดยค่าเริ่มต้น” แต่ก็เคยมีข่าวว่าพวกเขาอ่านข้อความได้
Skype เองก็เข้ารหัสโดยค่าเริ่มต้นเหมือนกัน แต่ก็ปิดได้ตามการตั้งค่าฝั่งเซิร์ฟเวอร์
ประเด็นคือคุณ เชื่อได้หรือไม่ ว่า Meta จะไม่แอบดูข้อมูล
เป็นเรื่องน่าขันที่ Meta ขยันกับเรื่องอื่น แต่กลับไม่ยอมจัดการฟิชชิงหรือ การโกงด้วยบัตรเติมเงินล่วงหน้า
น่าประทับใจที่การนำ Rust มาใช้ช่วยลดบั๊กได้มาก
C++ มี undefined behavior (UB) อยู่มากมาย แต่ Rust ปิดกั้นสิ่งเหล่านี้ในระดับโครงสร้าง
ด้วย type system ที่แข็งแรง ความน่าเชื่อถือจึงดีขึ้นอย่างมาก