OWASP 카테고리: MASVS-CODE: 코드 품질
개요
Android 애플리케이션은 특정 기능을 위해 C 및 C++와 같은 언어로 작성된 네이티브 코드를 활용할 수 있습니다. 그러나 애플리케이션이 Java 네이티브 인터페이스 (JNI)를 사용하여 이 네이티브 코드와 상호작용할 때 네이티브 코드 구현에 있을 수 있는 버퍼 오버플로와 같은 취약점 및 기타 문제에 노출될 수 있습니다.
영향
성능 최적화 및 난독화와 같은 매우 긍정적인 영향에도 불구하고 Android 애플리케이션에서 네이티브 코드를 사용하면 보안에 부정적인 영향을 미칠 수 있습니다. C/C++와 같은 네이티브 코드 언어에는 Java/Kotlin의 메모리 안전 기능이 없으므로 버퍼 오버플로, use-after-free 오류 및 기타 메모리 손상 문제와 같은 취약점에 취약하여 비정상 종료 또는 임의 코드 실행으로 이어질 수 있습니다. 또한 네이티브 코드 구성요소에 취약점이 있는 경우 나머지 부분이 Java로 안전하게 작성되어 있더라도 전체 애플리케이션이 손상될 수 있습니다.
완화 조치
개발 및 코딩 가이드
- 보안 코딩 가이드: C/C++ 프로젝트의 경우 버퍼 오버플로, 정수 오버플로, 형식 문자열 공격과 같은 취약점을 완화하기 위해 확립된 보안 코딩 표준 (예: CERT, OWASP)을 준수합니다. 품질과 보안으로 알려진 Abseil과 같은 라이브러리를 우선시합니다. 가능한 경우 C/C++와 비슷한 성능을 제공하는 Rust와 같은 메모리 안전 언어를 채택하는 것이 좋습니다.
- 입력 유효성 검사: 사용자 입력, 네트워크 데이터, 파일 등 외부 소스에서 수신된 모든 입력 데이터를 엄격하게 검증하여 삽입 공격 및 기타 취약점을 방지합니다.
컴파일 옵션 강화
ELF 형식을 사용하는 네이티브 라이브러리는 스택 보호(카나리아), 재배치 읽기 전용 (RELRO), 데이터 실행 방지 (NX), 위치 독립 실행 파일 (PIE)과 같은 보호 메커니즘을 활성화하여 다양한 취약점에 대해 강화할 수 있습니다. Android NDK 컴파일 옵션은 기본적으로 이러한 모든 보호를 사용 설정합니다.
바이너리 내에서 이러한 보안 메커니즘의 구현을 확인하려면 hardening-check 또는 pwntools와 같은 도구를 사용하면 됩니다.
Bash
$ pwn checksec --file path/to/libnativecode.so
Arch: aarch64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
서드 파티 라이브러리가 취약하지 않은지 확인
서드 파티 라이브러리를 선택할 때는 개발 커뮤니티에서 좋은 평판을 얻고 있는 라이브러리를 사용하는 것이 좋습니다. Google Play SDK
색인과 같은 리소스를 사용하면 평판이 좋고 신뢰할 수 있는 라이브러리를 식별하는 데 도움이 됩니다. 라이브러리를 최신 버전으로 업데이트하고 Exploit-DB의 데이터베이스와 같은 리소스를 사용하여 관련 알려진 취약점을 적극적으로 검색해야 합니다. [library_name] vulnerability 또는 [library_name] CVE와 같은 키워드를 사용하여 웹 검색을 하면 중요한 보안 정보를 확인할 수 있습니다.
리소스
- CWE-111: 안전하지 않은 JNI 직접 사용
- 익스플로잇 데이터베이스
- 보안 강화 기능이 있는지 바이너리 확인
- pwntools로 바이너리 보안 설정 확인
- Linux 바이너리 보안 강화
- 재배치 읽기 전용 (RELRO)을 사용하여 ELF 바이너리 강화
- OWASP 바이너리 보호 메커니즘
- SEI CERT 코딩 표준
- OWASP 개발자 가이드
- Google Play SDK 색인
- Android NDK
- Android Rust 소개
- Abseil (C++ 공통 라이브러리)
- PIE는 링커에 의해 적용됨