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 แทนการเขียนกฎบิลด์ด้วยมือ

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น