메모리 안전

메모리 안전하지 않음

메모리 안전 버그는 네이티브 프로그래밍 언어로 메모리를 처리할 때 발생하는 오류로, Android 코드베이스에서 가장 일반적인 문제입니다. 심각도가 높은 보안 취약점의 60% 이상을 차지하고 사용자에게 표시되는 수백만 건의 비정상 종료를 차지합니다.

 메모리 안전 버그는 사용자 환경, 비용, 보안에 영향을 미칩니다.
그림 1: 메모리 안전 버그와 이 버그가 품질, 보안, 비용에 미치는 부정적인 영향

메모리 안전 버그는 품질과 안정성에 부정적인 영향을 미치고 최종 사용자 기기에서 관찰되는 비정상 종료의 상당 부분을 차지합니다. 따라서 고밀도의 메모리 안전 버그는 사용자 환경 저하와 직접적인 상관관계가 있습니다.
C, C++, 어셈블리와 같은 메모리에 안전하지 않은 언어로 작성된 네이티브 코드는 Android 플랫폼 코드의 70% 이상을 차지하며 Play 스토어 애플리케이션의 약 50%에 있습니다.
점점 복잡해지는 코드를 감안할 때 주의를 기울이지 않으면 메모리 안전 버그는 시간이 지남에 따라 증가할 것입니다. 따라서 Google의 생태계에 이러한 버그를 감지하고 완화할 수 있는 도구와 기술을 제공하는 것이 장기적인 성공에 매우 중요합니다.
지난 몇 년간 Google은 하드웨어 파트너와 긴밀히 협력하여 Arm Memory Tagging과 같은 하드웨어 기술을 개발했으며 Android 코드베이스에 Rust를 도입했습니다.
이러한 기술은 Google의 메모리 안전을 더욱 강화하고 더 광범위한 소프트웨어 업종에서 주요 문제 영역을 해결하는 데 도움이 될 것입니다.

품질에 부정적인 영향을 미치는 메모리 안전 버그

메모리 안전 버그가 잠재되어 있으면 시스템 상태에 따라 확정적이지 않은 결과가 발생할 수 있습니다. 예측할 수 없는 이 동작으로 인해 비정상 종료가 발생하고 사용자가 불편을 겪습니다.

Google에서는 최종 사용자 기기에서 발생하는 수백만 건의 네이티브 충돌을 매일 관찰하고, GWP-ASan을 도입하면서 이 중 대다수가 메모리 안전 버그임을 알아냈습니다.
이 데이터 포인트는 품질과 메모리 안전 버그의 밀도 간 상관관계를 검증하며 Chrome 동료가 관찰한 내용과 일치합니다(Chrome GWP-ASan 버그 핫리스트 참고).

보안에 부정적인 영향을 미치는 메모리 안전 버그

메모리 안전 버그는 첫 번째 Android 출시부터 일관되게 Android 보안 취약점의 주요 원인이었습니다.

보안에 부정적인 영향을 미치는 메모리 안전 버그
그림 2: Android 취약점에 영향을 미치는 메모리 안전 버그

이 문제가 Android만의 문제가 아니라는 점(ChromeMicrosoft 통계 참고)은 위로가 되지만 사용자의 안전을 위해 더 큰 노력이 필요합니다.
Google의 Project Zero팀은 사용자에 대한 실제 공격에 사용된 제로데이 악용을 제로데이 취약점으로 추적합니다. 이는 가상의 버그가 아니라 사용자를 향한 공격에서 적극적으로 사용되는 악용입니다. 메모리 안전 버그(메모리 손상 및 use-after-free)는 압도적으로 대다수를 차지합니다.

메모리 안전 버그로 인한 비용 증가

보안 수정사항으로 기기를 최신 상태로 유지하면 사용자를 안전하게 보호할 수 있지만 생태계에는 금전적 비용이 발생합니다.

맞춤 수정사항이 있는 경우가 많은 하위 수준의 공급업체 코드의 고밀도 메모리 안전 버그로 인해 수정 및 테스트 비용이 많이 증가합니다. 하지만 개발 주기 중에 이러한 버그를 조기에 감지하면 이러한 비용을 절감할 수 있습니다.

연구에 따르면 버그를 조기에 감지하면 비용을 최대 6분의 1로 줄일 수 있습니다. 하지만 Google 생태계의 복잡성과 공급업체에서 관리하는 평균 코드베이스 수, 점점 늘어나는 소프트웨어의 복잡성을 감안할 때 절감 효과는 더 클 수 있습니다.

메모리 안전

Android 12부터 Android 코드베이스의 메모리 안전 버그 밀도를 줄이기 위해 시스템 변경사항을 적용했습니다. Android 메모리 안전 도구를 확장하고 Google 생태계에서 이 카테고리의 버그를 해결하도록 장려하는 새로운 요구사항을 도입합니다. 시간이 지남에 따라 사용자에게 더 높은 품질과 더 나은 보안을 제공하고 공급업체의 비용을 절감하게 됩니다.

메모리 안전은 향후 몇 년간 품질과 보안의 차별화 요소가 될 가능성이 높으며 Android에서 이를 주도할 계획입니다.

메모리 안전 지원을 위한 요구사항

Android 호환성 정의 문서(CDD)에서는 개발 중에 메모리 안전 도구를 사용할 것을 적극 권장합니다.
Google은 메모리 안전 도구의 사용을 늘리고 지속적 통합 및 테스트 프로세스에 이러한 도구를 통합하기 위해 Google 생태계와 긴밀하게 협력하고 있습니다.
시간이 지남에 따라 각 기기가 이러한 버그를 찾을 수 없음을 보여주는 메모리 안전 도구를 사용하여 전체 호환성 테스트 모음(CTS)을 통과하도록 하고 있습니다. 예를 들어 Arm v9 플랫폼은 Memory Tagging이 사용 설정된 CTS 실행을 제공해야 하지만 Arm v8 플랫폼은 HWASAN 및 KASAN을 사용하여 CTS 실행을 제공해야 합니다.

플랫폼 코드의 새로운 프로그래밍 언어 Rust

Android 12에서는 Rust를 플랫폼 언어로 도입했습니다. Rust는 C/C++와 유사한 성능 수준에서 메모리와 스레드 안전을 제공합니다. 대부분의 신규 네이티브 프로젝트에 Rust가 선호될 것으로 예상됩니다. 그러나 현재 Android 플랫폼 코드의 70% 이상을 나타내는 메모리에 안전하지 않은 모든 코드를 Rust로 재작성하는 것은 불가능합니다. 앞으로 Rust는 메모리 안전 도구를 보완할 것입니다.

메모리 안전 도구

Android에서는 메모리 안전 버그를 감지할 수 있는 다양한 도구를 지원합니다. 아래 그림은 사용 가능한 Android 메모리 안전 도구의 분류를 보여줍니다.

보안에 부정적인 영향을 미치는 메모리 안전 버그
그림 3: Android 메모리 안전 도구 현황

Google의 도구는 다양한 배포 시나리오 및 타겟을 다룹니다. 다음 문서에서는 각 도구를 설명하고 제품에 이러한 도구를 사용하기 위한 참조를 제공합니다.