콘텐츠로 이동하기
위협 인텔리전스

capa 규칙을 활용한 안드로이드 악성코드 탐지

2025년 2월 6일
Lin Chen

모바일 기기는 온라인 뱅킹, 의료 관리, 개인 사진 저장과 같은 일상 업무에 필수적인 도구가 되었으며, 귀중한 정보를 탈취하려는 악성 행위자들의 주요 표적이 되었습니다. 악당들은 불법적이거나 비윤리적인 이익을 창출하는 수익성 있는 채널로 앱을 통해 악성코드를 게시하고 배포하는 방법을 자주 사용합니다.

Android는 사용자를 안전하게 보호하기 위해 다층적인 악성코드 방어 접근 방식을 취하고 있지만(자세한 내용은 게시물 뒷부분에서 설명), 악성코드 방어 체계를 지속적으로 강화하는 동안에도 위협 행위자들은 탐지를 피하기 위해 끊임없이 악성코드를 업데이트하고 있습니다. 악성코드 개발자들은 이전에는 일반적인 Android 앱 개발 툴킷인 Java를 사용하여 악성 행위를 완료했으며, 이는 Java 바이트코드를 리버싱하여 쉽게 탐지할 수 있었습니다. 최근 몇 년 동안 악성코드 개발자들은 중요한 악성코드 동작 중 일부를 난독화하기 위해 네이티브 코드를 사용하는 경우가 늘어났으며, 컴파일되고 심볼이 제거된 ELF(Executable and Linkable Format) 파일의 난독화에 희망을 걸고 있습니다. 이러한 파일은 실제 의도를 밝히는 것이 더 어렵고 시간이 오래 걸릴 수 있습니다.

이러한 새로운 문제에 대처하기 위해 Android 보안 및 개인 정보 보호 팀은 Mandiant FLARE와 협력하여 오픈 소스 바이너리 분석 도구인 capa를 확장하여 Android를 대상으로 하는 네이티브 ARM ELF 파일을 분석하고 있습니다. 함께 Android 악성코드에서 관찰되는 기능을 탐지하기 위해 기존 capa 규칙을 개선하고 새로운 규칙을 개발했으며, capa 규칙 일치를 사용하여 네이티브 파일에서 매우 의심스러운 코드를 강조 표시하고, 강조 표시된 코드 동작을 Gemini에 요약하도록 요청하여 검토 프로세스를 개선하고 더 빠른 의사 결정을 내릴 수 있도록 했습니다.

이 블로그 게시물에서는 capa 동작 탐지 기능과 Gemini 요약 기능을 활용하는 방법을 다음을 통해 설명합니다.

  • 탐지를 피하기 위해 다양한 안티 분석 기법을 사용한 악성코드 샘플을 보여줍니다.
  • 기존 및 새로운 capa 규칙이 이러한 동작을 식별하고 강조 표시하는 방법을 설명합니다.
  • Gemini가 보안 검토를 위해 강조 표시된 코드를 요약하는 방법을 제시합니다.

음악 앱 외관을 가진 불법 도박 앱

Google Play 스토어는 게시된 모든 앱이 지역 법률 및 규정을 준수하도록 보장합니다. 여기에는 일부 지역에서 금지되거나 라이선스가 필요한 도박 앱도 포함됩니다. 이러한 지역에서 불법 도박 앱을 개발하고 배포하면 상당한 불법 수익을 창출할 수 있으며, 이는 때때로 조직 범죄와 관련되기도 합니다. Google Play 스토어의 보안 검열 절차를 우회하기 위해 일부 도박 앱은 음악이나 캐주얼 게임과 같은 무해한 외관으로 위장합니다. 이러한 앱은 다양한 안티 분석 기법을 사용하여 특정 지역 시장에서만 도박 포털을 공개합니다. 불행히도 에뮬레이션 및 샌드박스 폭파와 같은 동적 분석은 특정 장치 구성에 의존하며, 위협 행위자들은 탐지를 피하기 위해 다양한 설정 조합을 계속 시도합니다. 이는 끊임없이 쫓고 쫓기는 게임입니다!

이에 대응하여 Android 보안 및 개인 정보 보호 팀은 전체 프로그램과 모든 조건부 논리의 동작을 평가하는 정적 분석 기술과 같은 기술을 발전시켜 왔습니다. 이제 Google Play 스토어 규칙을 위반한 앱을 설명하고 이와 같은 다른 앱을 더 잘 탐지하고 차단하는 방법을 보여드리겠습니다.

특정 지역의 사용자에게 도박 웹사이트를 여는 음악 앱에 대한 보고서를 받았습니다. 이 앱은 대부분의 심볼(내보낸 심볼 제외)이 제거되고 탐지를 피하기 위해 런타임에 로드되는 네이티브 ELF 파일에 주요 동작을 숨기는 흥미로운 트릭을 사용했습니다.

JEB Decompiler와 같은 도구를 사용하여 앱을 Java 소스 코드로 디컴파일했을 때, 그림 1의 "MainActivity"에 표시된 것처럼 앱에 노래 재생 기능이 있음을 발견했습니다. 이는 무해한 동작처럼 보이며 Google Play 스토어 정책의 범위 내에 있습니다.

그러나 그림 1의 com.x.y.z 클래스에 표시된 것처럼 앱이 초기화될 때 onCreate 함수를 호출할 때 ELF 파일을 로드하는 작은 초기화 코드 영역이 있었습니다. 전체 앱의 동작을 완전히 이해하려면 완전히 다른 도구 세트가 필요한 ELF 파일도 리버스 엔지니어링해야 했습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/capa-android-fig1.max-900x900.png

그림 1: 앱이 안티 분석 기법을 적용하는 방법

Ghidra와 같은 도구를 사용하여 ARM64 ELF 파일을 C 소스 코드로 디컴파일한 결과, 이 앱은 시간대 정보를 사용하여 사용자의 지리적 위치를 추정하는 것을 발견했습니다("그림 1의 코드 섹션 1"). 이 코드는 사용자의 시간대를 대상 지역 목록과 비교하는 루프를 구현합니다("그림 1의 데이터 섹션").

사용자의 위치가 목록의 값과 일치하면("그림 1의 데이터 섹션") 이 악성코드는 다음을 수행합니다.

  1. 원격 서버에서 암호화된 DEX 파일을 다운로드합니다("그림 1의 코드 섹션 2").
  2. 다운로드한 DEX 파일을 해독합니다 ("그림 1의 코드 섹션 3").

  3. 해독된 DEX 파일을 메모리에 로드합니다("그림 1의 코드 섹션 4").

로드된 DEX 파일은 추가 서버 측 클로킹 기술을 사용하고 최종적으로 앱 사용자에게 도박 웹사이트(그림 3)를 로드합니다. 그림 2의 앱 아이콘과 비교해 볼 때, 앱의 광고된 기능과 명백한 불일치입니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/capa-android-fig2.max-600x600.png

그림 2: 게시된 앱 아이콘

https://storage.googleapis.com/gweb-cloudblog-publish/images/capa-android-fig3.max-1000x1000.png

그림 3: 앱에 로드된 도박 웹사이트

YARA와 같은 많은 탐지 기술을 ELF 파일에 배포된 악성코드를 식별하는 데 사용할 수 있지만, 위협 행위자가 도입한 앱 업데이트나 변형에 덜 탄력적입니다. 다행히도 Android 보안 및 개인 정보 보호 팀은 네이티브 ELF 구성 요소를 검사하여 악성 Android 앱을 탐지하는 새로운 기술을 개발했습니다. 예를 들어, 그림 3의 도박 앱에는 Android 런타임과 상호 작용하는 JNI(Java Native Interface)를 통해 동적으로 확인되는 많은 API 호출이 있습니다. 당사의 탐지 시스템은 이러한 교차 런타임 상호 작용을 인식하고 그 의도를 추론했습니다. 당사는 ptrace API 호출, 장치 정보 추출, 원격 서버에서 로컬 저장소로 코드 다운로드, JNI를 통한 다양한 암호화 작업 수행 등 Android 악성코드에서 흔히 볼 수 있는 동작을 열거하여 이를 capa 탐지로 전환하여 Google Play 스토어 위협을 식별하고 차단하는 데 사용할 수 있습니다.

이제 이것이 어떻게 작동하는지 좀 더 자세히 이야기해 보겠습니다.

Android capa 규칙

capa는 실행 파일의 기능을 탐지하는 도구입니다. 컴파일된 프로그램에 대해 실행하면 프로그램이 수행할 수 있다고 생각하는 것을 알려줍니다. 예를 들어, capa는 파일이 백도어이거나 서비스를 설치할 수 있거나 HTTP를 사용하여 통신한다고 제안할 수 있습니다.

Mandiant FLARE는 BinExport2를 지원하도록 capa를 확장했는데, 이는 디스어셈블된 프로그램을 아키텍처에 구애받지 않는 표현 방식입니다. 이를 통해 capa는 Ghidra와 해당 BinExport2 플러그인에서 지원하는 것과 같은 추가 아키텍처 및 파일 형식에 대한 기능을 매치할 수 있으며, 초기에는 ARM64 ELF 파일에 중점을 두었습니다. 그런 다음 Android 보안 및 개인 정보 보호 팀은 다양한 Android 악성코드 샘플에서 사용되는 ARM64 ELF 파일에서 관찰되는 기능을 탐지하는 데 특히 중점을 둔 새로운 capa 규칙을 만들었습니다. 이러한 독점 규칙은 capa의 오픈 소스 규칙과 함께 내부 Android 악성코드 분석 파이프라인의 일부로 악성코드 기능을 탐지하는 데 사용됩니다.

그림 3의 도박 앱을 다시 살펴보면, 다음 Google 독점 규칙과 오픈 소스 capa 규칙이 추가 검사를 위해 클로킹 기술을 수행하는 악성 기능과 일치했습니다.

독점 규칙:

  • ptrace API 호출 수행
  • Android에서 JNI를 통해 장치 구성 정보 추출
  • Android에서 JNI를 통해 시간대 추출
  • Android에서 JNI를 통해 Base64를 사용하여 데이터 인코딩 또는 디코딩
  • Android에서 JNI를 통해 Cipher API를 사용하여 데이터 암호화 또는 해독

Open-source capa rules:

분석가들은 수십만 줄의 난독화된 코드를 탐색하는 대신 이러한 규칙과 일치하는 함수 주소를 사용하여 앱의 잘못된 행위에 대한 증거를 신속하게 식별하고 앱에 대해 조치를 취할 수 있었습니다. 

capa 규칙 일치 항목의 Gemini 요약

Android 생태계를 보호하기 위해 당사의 Android 악성코드 분석 파이프라인은 매일 수백만 개의 ELF 파일을 심층적으로 검사하며, 각 파일에는 디컴파일된 코드에 수천 줄에서 수백만 줄의 코드가 포함되어 있습니다. 빠르게 진화하는 악성코드 분석의 Gemini 기능 외에도 capa 규칙은 Gemini 요약을 위해 가장 흥미로운 코드를 선택할 수 있으며, 훨씬 더 작은 가장 의심스러운 함수 집합에 집중할 수 있습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/android-capa-fig4a.max-1200x1200.png

그림 4: capa 규칙과 Gemini가 검토자와 자동화를 어떻게 돕는지 보여줍니다.

우리는 앞서 언급한 도박 앱에서 capa 규칙과 일치하는 함수들을 요약하도록 Gemini에게 다음 프롬프트를 사용하여 요청했습니다.

(영문 번역)

당신은 안드로이드 악성코드 분석 전문가인 세계적인 수준의 안드로이드 리버스 엔지니어입니다. 안드로이드 앱의 일부인 ARM/AArch64 ELF 파일에서 몇 가지 함수가 주어졌으며, 디컴파일된 의사 C 코드가 함께 제공됩니다. 당신은 다음을 위해 이 함수들을 분석해야 합니다.

        1. 이 함수들이 무엇을 하려고 하는지 요약합니다.

        2. 이 함수들 중 안드로이드 악성코드에 발견될 수 있는 코드/행동 패턴을 가진 것이 있는지 판단합니다.

{추가 지침...}

이 함수들은 Ghidra에 의해 다음과 같이 의사 C 형식으로 디컴파일됩니다. 

[function_1 내용]

[function_2 내용]

답변에서, 시작 부분에 HIGH / MEDIUM / LOW를 사용하여 위험 수준을 평가하는 전체 평결을 내리고 각 잠재적 악성 행동에 대한 근거를 설명하십시오.

Gemini는 다음과 같은 제안으로 응답했습니다.

평결: 매우 높은 위험(HIGH RISK)

제공된 안드로이드 애플리케이션 코드는 악성 의도를 강력하게 나타내는 여러 가지 우려스러운 행동을 보입니다. 정교한 안드로이드 악성코드 기술과 일치하는 여러 위험 신호의 존재로 인해 위험 수준은 매우 높음(HIGH)으로 평가됩니다. 아래 분석은 관찰된 특정 악성 행동 패턴을 자세히 설명합니다.

  1. 동적 코드 로딩 (HIGH): comeOn 함수는 코드를 동적으로 로딩하고 실행하는 패턴을 보여줍니다. 앱은 getCacheFilePathdownloadFile을 사용하여 파일(잠재적으로 DEX 또는 ELF)을 가져온 다음 getDexClassLoader를 사용하여 실행을 시도합니다. 이는 초기 설치 후 악성 페이로드를 전달하는 고전적인 기술로, 악성코드가 기능을 쉽게 업데이트하고 정적 분석을 회피할 수 있도록 합니다. 사용자 정의 복호화(decryptFile, decryptAES)의 사용은 난독화 및 안티 분석 기능을 더욱 강화하며, 로드된 코드의 진정한 성격을 숨기려는 의도적인 시도를 나타냅니다.

  2. 사용자 정의 복호화 및 실행 (HIGH): decryptFile 함수는 악성 페이로드를 난독화하기 위해 파일의 사용자 정의 복호화를 수행합니다. 복호화는 AES 알고리즘을 사용하며, 이는 리버싱 프로세스에 복잡성을 더합니다. 동적 로딩과 결합하면 이는 정교한 악성코드 전략을 강력하게 나타냅니다. 복호화된 파일은 디스크에 기록(fopen, fwrite)되고 사용자 정의 클래스 로더를 사용하여 실행됩니다.

  3. 시간 기반 은폐 (MEDIUM): thread_function은 시간 기반 은폐를 통합합니다. 사용자 시간대(getTimeZoneInfo)를 확인하고 시간대가 "America/Sao Paulo"가 아닌 경우 행동을 변경할 수 있습니다. 더 중요한 것은, 추가 파일을 다운로드하는 데 사용되는 문자열에 타임스탬프("?time=" + 현재 시간)를 추가한다는 것입니다. 이는 장치의 시간에 따라 행동을 변경하고 잠재적으로 다양한 네트워크 요청을 동적으로 생성하여 분석을 더욱 어렵게 만들어서 탐지를 회피하려는 시도를 암시합니다.

  4. 네트워크 은폐 (MEDIUM): thread_function은 추가적인 은폐 행동을 보이지만, 세부 사항은 제한적입니다. 이 함수는 네트워크 리소스와 상호 작용하여 추가 리소스를 다운로드하며, 네트워크 활성 특성을 보여줍니다. 네트워크 작업에 사용되는 데이터는 문자열 조작 및 URL 난독화를 통해 난독화되어 식별 및 분석을 어렵게 만듭니다. 사용된 정확한 은폐 메커니즘은 디컴파일된 코드에서 완전히 명확하지 않지만, 이러한 행동의 존재는 심각한 우려 사항입니다.

  5. 난독화 기술 (HIGH): 전체 코드베이스는 광범위한 난독화 기술을 사용합니다. 코드는 복잡한 데이터 구조(데크, 해시 테이블, 트리)와 복잡한 제어 흐름에 크게 의존합니다. 함수 및 변수 이름은 무의미하여 분석을 방해합니다. 여러 겹의 간접 참조와 공격적인 힙 메모리 관리(operator_new, operator_delete)의 사용은 코드를 이해하고 분석하기 어렵게 만듭니다. 이러한 난독화 방법은 리버스 엔지니어링을 회피하려는 악성코드의 전형적인 특징입니다.

  6. 디버깅 방지/분석 방지 기술 (HIGH): JNI_OnLoad 함수에는 ptrace(PTRACE_TRACEME, 0, 0, 0) 호출이 포함되어 있습니다. 이는 디버깅 또는 분석 도구를 탐지하려는 시도의 명확한 지표입니다. 디버거가 연결되어 있으면 이 함수의 행동은 달라질 가능성이 높습니다. 충돌하거나 실행을 중단하거나 악성 코드를 숨길 수도 있습니다.

결론:

동적 코드 로딩, 사용자 정의 복호화, 정교한 난독화 및 디버깅 방지 기술의 조합은 악성 활동의 가능성이 높음을 나타냅니다. 여러 사용자 정의 함수의 역할에 대한 불완전한 이해는 위험을 더욱 가중시킵니다. 앱의 행동은 수신된 데이터와 시간에 민감한 요인에 크게 의존하므로 광범위한 악성 행위의 가능성에 대한 심각한 우려를 제기합니다. 이 애플리케이션을 격리하고 추가 조사를 위한 즉각적인 조치를 취해야 합니다. 네트워크 통신, 파일 시스템 조작 또는 기타 악성 활동을 식별하려면 상세한 샌드박스 분석이 중요합니다.

Gemini 출력에서 볼 수 있듯이, Android ELF 동작은 capa 규칙과 일치하는 함수에 대해 명확하게 설명됩니다.

이 특정 예에서 Gemini는 다음을 수행하는 데 도움을 주었습니다.

  • 동적 코드 로딩을 수행하기 위한 함수 호출 시퀀스를 강조 표시하여 분석가가 핵심 함수 호출인 getCacheFilePathgetDexClassLoader를 쉽게 검사할 수 있도록 합니다
  • 추가 URL 매개변수 힌트와 함께 시간대 추출을 식별하여 분석가가 악성 페이로드를 신속하고 정확하게 조사할 수 있도록 합니다.
  • 추가 규칙 작성 아이디어를 위해 더 잠재적인 의심스러운 동작(예: getDexClassLoader JNI 호출, URL 난독화)을 설명합니다.

Android의 capa 규칙은 Gemini 요약과 함께 더욱 발전된 기술을 사용한 악성코드 탐지를 위한 큰 잠재력을 보여줍니다. 당사의 분석가들은 시장의 악성코드 동향과 기술을 면밀히 모니터링하고 날뛰는 공격자를 잡기 위해 최신 capa 규칙을 작성하고 있습니다.

Android의 다층적 보안 접근 방식

끊임없이 진화하는 Android의 다층적 보안 접근 방식에는 고급 기능을 통합하고 개발자 및 장치 구현자와 협력하여 Android 플랫폼과 생태계를 안전하게 유지하는 것이 포함됩니다. 여기에는 다음이 포함되지만 이에 국한되지는 않습니다.

  • 고급 내장 보호 기능: Google Play 프로텍트는 다운로드 출처에 관계없이 Google Play 서비스가 있는 Android 기기의 모든 앱을 자동으로 검사합니다. 기본적으로 활성화된 이 내장 보호 기능은 악성코드 및 원치 않는 소프트웨어에 대한 중요한 보안을 제공합니다. Google Play 프로텍트는 매일 2,000억 개 이상의 앱을 검사하고 새로운 앱에 대해 코드 수준에서 실시간 검사를 수행하여 다형성 악성코드와 같은 새롭게 등장하는 숨겨진 위협에 대처합니다. 2024년 Google Play 프로텍트의 실시간 검사Google Play 외부에서 1,300만 개 이상의 새로운 악성 앱을 식별했습니다.

  • Google Play 및 개발자의 악성코드 보호: Google Play에서 모든 사람에게 신뢰할 수 있는 경험을 제공하기 위해 당사는 SAFE 원칙을 지침으로 사용하여 Google Play를 안전하게 유지하는 데 도움이 되는 끊임없이 진화하는 다층적 보호 기능을 통합합니다. 이러한 보호 기능은 안전한 앱을 구축하는 데 중요한 역할을 하는 개발자 자신부터 시작됩니다. 당사는 개발자에게 안전하고 고품질의 앱을 구축하기 위한 동급 최고의 도구, 모범 사례 및 온디맨드 교육 리소스를 제공합니다. 모든 앱은 엄격한 검토 및 테스트를 거치며 승인된 앱만 Play 스토어에 표시될 수 있습니다. 사용자가 Play에서 앱을 다운로드하기 전에 사용자 리뷰, 평점 및 Google Play의 데이터 안전 섹션을 탐색하여 정보에 입각한 결정을 내릴 수 있습니다.

  • Google Play는 모든 사용자가 신뢰할 수 있는 환경을 만들고자 SAFE 원칙을 지침으로 삼아 끊임없이 진화하는 다층적 보호 장치를 통합하여 Google Play를 안전하게 유지합니다. 이러한 보호는 안전한 앱을 구축하는 데 중요한 역할을 하는 개발자 자신으로부터 시작됩니다. Google은 개발자에게 동급 최고의 도구, 모범 사례 및 안전하고 고품질의 앱을 구축하기 위한 온디맨드 교육 리소스를 제공합니다. 모든 앱은 엄격한 검토 및 테스트를 거치며 승인된 앱만 Play 스토어에 표시될 수 있습니다. 사용자가 Play에서 앱을 다운로드하기 전에 Google Play에서 사용자 리뷰, 평점데이터 안전 섹션을 살펴보고 정보에 입각한 결정을 내릴 수 있습니다.

  • 보안 연구 커뮤니티와의 협력: Google은 앱 안전 표준을 발전시키기 위해 App Defense Alliance를 포함하여 여러 수준에서 보안 커뮤니티와 긴밀하게 협력합니다. Android는 또한 Google Threat Intelligence Group(GTIG)과 협력하여 새롭게 등장하는 위협에 대처하고 전 세계 Android 사용자를 보호합니다.

빠르게 진화하는 Gemini를 통해 당사의 분석가들은 이러한 정교한 샘플에 소비하는 시간을 줄여 악성 앱에 대한 노출을 최소화하고 Android 생태계의 안전을 보장할 수 있습니다.

감사의 글

Willi Ballenthin, Yannis Gasparis, Mike Hunhoff 및 Moritz Raabe의 지원에 특별히 감사드립니다.

게시 위치