> For the complete documentation index, see [llms.txt](https://sul.skill.or.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sul.skill.or.kr/android-security-test/undefined-2.md).

# 메모리 안전

## 메모리 안전 버그 란?

## 메모리 안전하지 않음 <a href="#memory-unsafety" id="memory-unsafety"></a>

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

<figure><img src="/files/9uOo3UTO1EHK3S8cqUqJ" alt=""><figcaption><p>그림 1: 메모리 안전 버그와 이 버그가 품질, 보안, 비용에 미치는 부정적인 영향 </p></figcaption></figure>

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

### 품질에 부정적인 영향을 미치는 메모리 안전 버그 <a href="#affects-quality" id="affects-quality"></a>

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

Google에서는 최종 사용자 기기에서 발생하는 수백만 건의 네이티브 충돌을 매일 관찰하고, [GWP-ASan](https://developer.android.com/ndk/guides/gwp-asan?hl=ko)을 도입하면서 이 중 대다수가 메모리 안전 버그임을 알아냈습니다.\
이 데이터 포인트는 품질과 메모리 안전 버그의 밀도 간 상관관계를 검증하며 Chrome 동료가 관찰한 내용과 일치합니다(Chrome [GWP-ASan 버그 핫리스트](https://bugs.chromium.org/p/chromium/issues/list?can=1\&q=Hotlist%3DGWP-ASan) 참고).

### 보안에 부정적인 영향을 미치는 메모리 안전 버그 <a href="#affects-security" id="affects-security"></a>

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

<figure><img src="/files/W3GzwHOv4sfvdASEaERV" alt=""><figcaption><p>그림 2: Android 취약점에 영향을 미치는 메모리 안전 버그</p></figcaption></figure>

이 문제가 Android만의 문제가 아니라는 점([Chrome](https://www.chromium.org/Home/chromium-security/memory-safety) 및 [Microsoft](https://msrc-blog.microsoft.com/2019/07/16/a-proactive-approach-to-more-secure-code/) 통계 참고)은 위로가 되지만 사용자의 안전을 위해 더 큰 노력이 필요합니다.\
Google의 [Project Zero팀](https://googleprojectzero.blogspot.com/)은 사용자에 대한 실제 공격에 사용된 제로데이 악용을 제로데이 취약점으로 [추적](https://docs.google.com/spreadsheets/d/1lkNJ0uQwbeC1ZTRrxdtuPLCIl7mlUreoKfSIgajnSyY/view?hl=ko#gid=0)합니다. 이는 가상의 버그가 아니라 사용자를 향한 공격에서 적극적으로 사용되는 악용입니다. 메모리 안전 버그(메모리 손상 및 use-after-free)는 압도적으로 대다수를 차지합니다.

### 메모리 안전 버그로 인한 비용 증가 <a href="#affects-costs" id="affects-costs"></a>

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

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

[연구](https://www.researchgate.net/figure/IBM-System-Science-Institute-Relative-Cost-of-Fixing-Defects_fig1_255965523)에 따르면 버그를 조기에 감지하면 비용을 최대 6분의 1로 줄일 수 있습니다. 하지만 Google 생태계의 복잡성과 공급업체에서 관리하는 평균 코드베이스 수, 점점 늘어나는 소프트웨어의 복잡성을 감안할 때 절감 효과는 더 클 수 있습니다.

## 메모리 안전 <a href="#memory-safety" id="memory-safety"></a>

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

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

### 메모리 안전 지원을 위한 요구사항 <a href="#requirements" id="requirements"></a>

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

### 플랫폼 코드의 새로운 프로그래밍 언어 Rust <a href="#rust" id="rust"></a>

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

## 메모리 안전 도구 <a href="#memory-safety-tools" id="memory-safety-tools"></a>

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

<figure><img src="/files/Gfsg8Cbd0OFSJPv8oMu7" alt=""><figcaption><p>그림 3: Android 메모리 안전 도구 현황</p></figcaption></figure>

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

## 출처 : [바로가기 ](https://source.android.com/)

{% embed url="<https://doc.skill.or.kr>" %}
NHN Cloud 정보 사이트&#x20;
{% endembed %}

{% embed url="<https://ssv.skill.or.kr>" %}
취약점 진단 분석 평가 방법 사이트
{% endembed %}
