네이티브 코드 사용

OWASP 카테고리: MASVS-CODE: 코드 품질

개요

Android 애플리케이션은 특정 기능을 위해 C 및 C++와 같은 언어로 작성된 네이티브 코드를 활용할 수 있습니다. 그러나 애플리케이션이 Java Native Interface (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와 같은 키워드를 사용하여 웹을 검색하면 중요한 보안 정보가 유출될 수 있습니다.

리소스