Google นำ Rust มาใช้ในเฟิร์มแวร์เบสแบนด์ของ Pixel 10
(security.googleblog.com)Google ได้นำ DNS parser ที่พัฒนาด้วย Rust ซึ่งเป็นภาษาแบบ memory-safe มาใช้ในเฟิร์มแวร์เซลลูลาร์เบสแบนด์ (modem) ของ Pixel 10
เป็นการรับมือเชิงรุกเพื่อลดกลุ่มช่องโหว่ด้าน memory safety ในเบสแบนด์ซึ่งมีพื้นผิวการโจมตีจากระยะไกลสูง
ประเด็นสำคัญ
- ใน Pixel 9 มีการใช้มาตรการบรรเทาช่องโหว่ด้าน memory safety แล้ว และใน Pixel 10 ก็ไปไกลขึ้นอีกขั้นด้วยการใส่โค้ด Rust ลงในเฟิร์มแวร์เบสแบนด์จริง
- เป้าหมายแรกของการใช้งานคือ DNS parser โดย DNS ไม่ได้ใช้แค่ในเบราว์เซอร์เท่านั้น แต่ยังใช้กับความสามารถพื้นฐานของเครือข่ายมือถืออย่างการโอนสาย และเพราะต้อง parse ข้อมูลที่ไม่น่าเชื่อถือโดยตรง จึงเป็นจุดที่เกิดช่องโหว่ได้ง่าย
- Google เลือกใช้ไลบรารี Rust DNS แบบโอเพนซอร์ส
hickory-protoโดยประเมินว่าสถานะการบำรุงรักษา test coverage และการยอมรับจากชุมชนอยู่ในระดับสูง - อย่างไรก็ตาม การรองรับ
no_stdที่จำเป็นสำหรับสภาพแวดล้อมแบบ bare-metal ยังไม่เพียงพอ ทำให้ Google ต้องเพิ่มการรองรับno_stdให้กับ crate และ dependency ที่เกี่ยวข้องด้วยตนเอง และส่งกลับเข้า upstream - ขนาดโค้ดวัดได้ราว 371KB โดย 350KB เป็น
hickory-protoและ dependency, 17KB เป็นcore·alloc·compiler_builtinsและ 4KB เป็นโค้ด shim ที่ใช้เชื่อมกับโมเด็ม - แทนที่จะใช้วิธีนำ staticlib อิสระหลายตัวมาต่อกันด้วย Cargo ทาง Google เลือกผสานขั้นตอนคอมไพล์ Rust เข้าไปในระบบบิลด์ของโมเด็มเดิม (Pigweed/GN) โดยตรง
- ตัวจัดสรรหน่วยความจำและการจัดการ panic ของ Rust ก็ถูกผสานเข้ากับ allocator และ crash backend ของเฟิร์มแวร์โมเด็มเดิมผ่าน FFI
- ในขั้นตอนลิงก์
compiler_builtinsไปเขียนทับ implementation ของmemcpy/memsetที่ปรับจูนไว้เดิมในโมเด็มจนทำให้ประสิทธิภาพลดลง และได้แก้ปัญหาด้วยสคริปต์ one-line - Google อธิบายว่าการนำมาใช้ครั้งนี้ไม่ใช่มาตรการเฉพาะกิจ แต่เป็นฐานสำหรับขยายการใช้ภาษาแบบ memory-safe ไปยัง parser และโค้ดที่มีความเสี่ยงสูงอื่น ๆ ภายในเบสแบนด์ต่อไปในอนาคต
ทำไมจึงสำคัญ
เซลลูลาร์เบสแบนด์เป็นซอฟต์แวร์ระดับล่างที่เชื่อมต่อกับภายนอกโดยตรง จึงมีมูลค่าสูงในมุมของการโจมตี ก่อนหน้านี้ Project Zero ก็เคยสาธิตการรันโค้ดจากระยะไกลผ่านอินเทอร์เน็ตบนโมเด็มของ Pixel มาแล้ว ในสภาพแวดล้อมแบบนี้ ปัญหา memory safety ในโค้ดสาย C/C++ จึงมักกลายเป็นความเสี่ยงเชิงโครงสร้างได้ง่าย
การประกาศครั้งนี้ของ Google จึงมีความหมายมากกว่าการบอกว่า “ใช้ Rust แล้ว” เพราะมันแสดงให้เห็นว่า ภาษาแบบ memory-safe สามารถนำไปใช้งานจริงได้แม้ในพื้นที่เฟิร์มแวร์ที่อ่อนไหวและมีข้อจำกัดสูงอย่างโมบายล์เบสแบนด์
จุดที่น่าสนใจในเชิงเทคนิค
- มีการเพิ่มการรองรับ
no_stdเพื่อให้hickory-protoทำงานบน bare-metal ได้ - อินเทอร์เฟซระหว่าง Rust กับโค้ด C/C++ เดิม เชื่อมต่อกันผ่าน FFI
- Rust รับหน้าที่ parse การตอบกลับ ส่วนการอัปเดตโครงสร้างหน่วยความจำแบบ C เดิมนั้นยังใช้ callback ของฟังก์ชัน C เดิมต่อไป
- เนื่องจากมี external crate มากกว่า 30 ตัว จึงใช้
cargo-gnawของ Fuchsia เพื่อสร้างกฎบิลด์ของ GN แทนการเขียนกฎบิลด์ด้วยมือ
ยังไม่มีความคิดเห็น