구글이 안드로이드OS를 러스트로 짜는 이유
구글은 러스트 언어를 2019년부터 안드로이드 운영체제(OS) 코드에 통합해왔다. 4년의 작업을 통해 안드로이드 OS의 보안 취약성을 줄이고 성능을 개선할 수 있는 길을 열었다. 창업 이래 C와 C++ 활용에 강한 애착을 보여온 구글이지만, 이제 C 진영의 옛 선도자는 러스트 옹호자로 변모하고 있다. 지난해말 구글 제프리 반더 스톱 보안 엔지니어는 블로그에서 "안드로이드 보안 게시판에 보고된 취약점을 살펴보면, 메모리 안전 취약점 관련 수가 지난 몇년 간 상당히 감소했다"며 "2019년부터 2022년까지 메모리 보안 취약점 연간 수는 223개에서 85개로 감소했다"고 밝혔다. 그는 "이런 감소는 메모리에 안전하지 않은 언어에서 프로그래밍 언어 사용을 이동한 것과 일치한다"며 "안드로이드13은 추가된 대부분의 새 코드가 메모리 안전 언어로 된 최초의 안드로이드 버전"이라고 덧붙였다. 안드로이드13의 신규 코드 분포를 보면, 러스트의 비중이 C 수준으로 늘어났다. C++의 비중이 큰 가운데 자바, 러스트, C 등이 상당한 비중을 차지하고 코틀린도 꾸준히 늘고 있다. 안드로이드에 사용된 언어가 메모리에 안전한 것으로 변경되면서, 메모리 안전 취약점의 전체 안드로이드 취약점 중 비중은 76%에서 35%로 떨어졌다. 2022년은 메모리 안전 취약점이 안드로이드 취약점에서 눈에 띄게 줄었다. 그는 "이는 2년전 메모리 안전 취약성의 시대와 기존 구성요소를 다시 작성하지 않고 새 코드에 초점을 맞춰야 하는 이유에 대해 밝혔던 글의 기대치와 일치한다"며 "다른 기여 요인이나 대체 설명이 있을 수 있지만, 이런 변화는 안전하지 않은 메모리 언어 개선에 대한 상당한 투자에도 10년 이상 지속된 업계 전반의 추세에서 크게 벗어난 것"이라고 설명했다. 유즈애프터프리(Use After Free), 범위 밖 읽기 및 쓰기 같은 메모리 안전 관련 버그는 안드로이드와 크롬의 중요 버그 65%를 차지한다. 이런 결함은 보안 수준을 낮출 뿐 아니라, 조기에 발견하지 않으면 개발비용이 늘어나게 된다. 그는 "구글은 C와 C++의 안전성을 개선하는 도구에 계속 투자하고 있으며, 지난 몇 번의 버전에서 프로덕션 안드로이드 기기에 Scudo 강화 할당자, HWASAN, GWP-ASAN 및 KFENCE를 도입했고, 기존 코드 기반에서 퍼징 적용 범위를 늘렸다"며 "이러한 도구를 사용해 발견된 취약점은 이전 코드에서 발견된 취약점뿐 아니라 새로운 코드의 취약점 예방에 기여했다"고 밝혔다. 이어 "그러나 이것만으로 우리가 보는 취약점의 큰 변화를 설명할 수 없으며 이러한 기술을 배포한 다른 프로젝트에서는 취약점 구성의 큰 변화를 보지 못했다"고 강조했다. 메모리 안전 언어란 범주에서 구글이 주목하는 언어는 러스트다. 구글은 안드로이드12에서 C와 C++의 메모리 안전 대안으로 러스트를 지원한다고 발표했다. 이후 안드로이드 오픈소스 프로젝트(AOSP)에 러스트 도입이 확대됐다. 구글은 기존 C 및 C++ 언어를 러스트로 대체하는 대신, 신규 코드를 러스트로 작성하는 식으로 진행했다. 안드로이드의 네이티브 코드에서 C와 C++의 비율은 아주 조금씩 감소 추세고, 러스트는 급증하고 있다. 러스트는 안드로이드13에서 새로운 네이티브 코드 중 21%를 차지했다. AOSP의 경우 Keystore2, 새로운 UWB 스택, DNS오버HTTP3, 안드로이드 가상화 프레임워크(AVF) 및 다양한 기타 구성 요소 등 새로운 기능 및 구성 요소 전반에 걸쳐 약 150만 개의 러스트 코드 라인이 있다고 한다. 소프트웨어 개발에서 C와 C++ 대신 메모리 안전 언어를 사용하자는 움직임이 거세게 일어나고 있다. 작년 11월 미국 국가안보국(NSA)은 메모리 안전 언어 사용을 권고했다. 메모리 취약점 문제를 안고 있는 C나 C++ 언어보다 러스트, 고, C# 같은 언어를 사용하란 것이다. 마이크로소프트와 구글 보안팀은 윈도와 크롬의 보안 문제 70%가 메모리 취약점 관련이며, 주로 C와 C++을 사용한 결과라고 밝혔다. 코드의 메모리 관리 문제는 프로그램 실행 오류와 성능 저하, 충돌 등의 문제도 야기할 수 있다. 구글은 그동안 안드로이드의 러스트 코드에서 메모리 보안 취약점이 전혀 발견되지 않았다고 밝혔다. 그는 "OS 개발의 경우 컴파일러에서 추론할 수 없는 자원에 접근해야 하며, 메모리 안전 언어의 경우 이런 시스템 프로그래밍을 수행하려면 탈출구가 필요하다"며 "자바의 경우 안드로이드에서 JNI를 사용해 하위 수준 자원에 접근하고, JNI 사용 시 안전하지 않은 동작을 도입하지 않게 주의해야 한다"고 적었다. 그는 "다행스럽게도 안전을 위해 전체 프로그램보다 C나 C++의 작은 스니펫을 검토하는 게 훨씬 더 간단하다는 게 입증됐다"며 "안드로이드에서 순수한 자바 프로세스는 없고 모두 JNI 상단에 구축됐으며 그럼에도 자바 코드에서 메모리 안전 취약성은 거의 없다"고 덧붙였다. 그는 "러스트는 시스템 자원과 비 러스트 코드 간 상호작용을 위한 unsafe가 있는데, 자바 및 JNI와 마찬가지로 이를 사용하려면 추가 조사가 필요하다"며 "그러나 자바처럼 러스트 코드는 순수 C, C++ 구현보다 훨씬 더 안전한 것으로 입증됐다"고 설명했다. 구글은 안드로이드에 러스트를 사용함으로써 C, C++의 안전조치에 사용되는 추가 샌드박싱, 새니타이저, 런타임 완화, 하드웨어 보호 등의 조치를 덜 취하면서 보안과 시스템 상태를 최적화할 수 있다고 밝혔다. 새로운 UWB 스택을 사용해 메가바이트 메모리를 절약하고 기존 프로세스 내에서 실행해 일부 IPC 대기시간을 피할 수 있었다고 한다. 그는 "러스트 사용은 안드로이드 플랫폼에서 증가하고 있지만, 이게 끝은 아니다"라며 "안드로이드 전체의 보안, 안정성, 품질 향상 등의 목표를 달성하려면 네이티브 코드를 필요로 하는 모든 코드베이스 위치에서 러스트를 사용할 수 있어야 한다"고 밝혔다. 그는 "구글은 러스트에서 사용자 공간 HAL을 구현하고 있고, 신뢰된 애플리케이션에서 러스트 지원을 추가하고 있다"며 "안드로이드 가상화 프레임워크의 VM 펌웨어를 러스트로 마이그레이션했고, 리눅스 6.1의 러스트 지원으로 커널 드라이버부터 커널에 메모리 안정성을 제공하게 돼 기쁘다"고 덧붙였다.