Google Security Blog의 게시물에 따르면 Pixel 10 시리즈는 Pixel 기기 최초로 메모리 안전 언어인 Rust로 작성된 구성 요소를 셀룰러 모뎀 소프트웨어에 통합합니다. 이번 조치는 Rust 기반의 도메인 이름 시스템(DNS) 파서를 모뎀 펌웨어에 도입하는 것으로, 신뢰할 수 없는 데이터를 처리하는 부분에서 메모리 안전성과 관련된 취약점의 위험을 줄이는 것을 목표로 합니다.
이번 조치는 셀룰러 통신 모뎀을 악용으로부터 강화하려는 Google의 노력의 일환입니다. Google은 Pixel 9에 여러 메모리 안전성 취약점에 대한 완화 조치를 적용했지만, 모뎀 펌웨어의 복잡성과 넓은 공격 표면 때문에 추가적인 사전 예방 조치가 필요하다고 보고 있습니다. Google은 Project Zero가 앞서 인터넷을 통해 Pixel 모뎀에서 원격 코드 실행에 성공한 바 있으며, Pixel 모뎀에는 수십 메가바이트의 실행 가능한 코드가 포함되어 있다고 밝혔습니다.
Google은 왜 DNS 파서를 선택했나?
DNS는 브라우저가 웹사이트를 찾도록 돕는 데만 사용되지 않습니다. 현대 셀룰러 통신이 디지털 데이터 네트워크로 전환되면서 통화 연결과 같은 기본 작업도 DNS 서비스에 의존합니다. 이 복잡한 프로토콜은 신뢰할 수 없을 수 있는 데이터를 분석해야 하므로, 메모리 보호 기능이 없는 언어로 구현될 경우 민감한 지점이 됩니다. 게시물에 따르면 이러한 유형의 위험은 CVE-2024-27227 취약점과 관련이 있습니다.
Google은 Rust로 DNS를 구현하기 위한 여러 오픈 소스 패키지를 평가한 뒤, 유지 관리 수준, 75%를 넘는 테스트 커버리지, Rust 커뮤니티에서의 사용 범위를 기준으로 hickory-proto 라이브러리를 선택했습니다. 이 라이브러리는 처음에는 리소스가 제한되거나 운영 체제 없이 실행되는 환경에 필요한 no_std 지원이 부족했기 때문에, Google은 라이브러리와 일부 종속 항목에 이 지원을 추가했습니다. 이 작업으로 rust-url 프로젝트의 URL 파서에도 no_std 지원이 추가되었습니다.
크기 비용과 기존 소프트웨어와의 통합
크기 분석 결과, Rust로 작성된 중간 구성 요소는 4킬로바이트를 사용했고, core·alloc·compiler_builtins 구성 요소에는 17킬로바이트가 필요했으며, hickory-proto 라이브러리와 그 종속 항목은 350킬로바이트를 차지해 총 371킬로바이트에 달했습니다. Google은 Pixel 모뎀의 메모리 크기가 엄격한 제약을 부과하지 않는다고 보고 있어, 현 단계에서는 크기 최적화보다 커뮤니티 지원과 코드 품질을 우선했습니다. 그러나 이러한 증가는 다른 임베디드 시스템에서는 장애물이 될 수 있으며, 향후에는 필요하지 않은 기능을 제외하는 컴파일 옵션을 통해 줄일 수 있다고 설명했습니다.
기존 C 및 C++ 코드베이스에 Rust를 통합하기 위해 팀은 기본 산술 연산, 동적 메모리 할당, 언어 간 연결 인터페이스를 검증하는 단위 테스트를 사용했습니다. 또한 Cargo를 통해 별도의 정적 라이브러리를 만드는 대신 Rust 컴파일 단계를 현재 빌드 시스템에 직접 통합하기로 했습니다. 이 방식이 다른 Rust 구성 요소가 추가될 때 확장하기 쉽고 심볼 충돌 가능성을 줄이기 때문입니다.
기본 빌드 시스템은 Pigweed를 기반으로 하며, FFI 인터페이스는 펌웨어에 존재하는 메모리 할당 시스템을 Rust의 alloc 구성 요소와 연결하고 Rust와 C/C++ 간 패닉 처리도 통일하는 데 사용되었습니다. 연결 과정에서는 modem에 최적화된 memset 및 memcpy 구현이 compiler_builtins에서 제공하는 구현으로 대체되면서 성능과 전력 소비 문제가 발생했습니다. 팀은 연결 단계 전에 정적 라이브러리에서 compiler_builtins 파일을 제거해 이 문제를 해결했습니다.
DNS 인터페이스와 다음 단계
Google은 DNS 응답을 처리하기 위한 C 언어 API를 정의한 뒤 이를 Rust로 구현했습니다. 응답을 분석한 후 이 구성 요소는 기존 프로그램에서 사용하는 데이터 구조를 업데이트하기 위해 기존 C 함수를 호출합니다. 데이터 형식 간 복잡한 변환에 필요한 연결 코드는 bindgen 도구를 사용해 생성했습니다.
Google에 따르면 Pixel 10 시리즈는 메모리 안전 언어를 모뎀 내부에 통합한 최초의 Pixel 기기라는 점에서 중요한 이정표입니다. 목표는 단일 파서를 교체하는 데 그치지 않습니다. 회사는 이번 프로젝트가 향후 셀룰러 통신 기반에 메모리 안전 언어로 작성된 다른 파서와 구성 요소를 도입하기 위한 토대를 마련한다고 보고 있습니다.