libandroid_runtime Zygote Injection을 통한 펌웨어 수준 Android 백도어

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

개요

공급망 변조로 /system/lib[64]/libandroid_runtime.so를 조작하면 android.util.Log.println_native를 가로채서 Zygote에서 포크된 모든 앱이 공격자 코드를 실행하게 만들 수 있습니다. Keenadu 백도어는 println_native 내부에 네이티브 드로퍼를 구동하는 단일 호출을 추가합니다. 모든 앱 프로세스가 이 코드를 실행하기 때문에 Android 샌드박스 경계와 앱별 권한이 사실상 우회됩니다.

드로퍼 경로: native patch → RC4 → DexClassLoader

  • 후킹 진입점: println_native 안에 __log_check_tag_count로의 추가 호출 (주입된 정적 라이브러리 libVndxUtils.a).
  • 페이로드 저장: .so에 포함된 RC4로 암호화된 블롭을 복호화하여 /data/dalvik-cache/arm[64]/system@framework@vndx_10x.jar@classes.jar로 드롭.
  • 로드 및 실행: DexClassLoader가 jar을 로드하고 com.ak.test.Main.main을 호출. 런타임 로그는 태그 AK_CPP 사용(분석 결과물).
  • 안티-분석: Google/Sprint/T-Mobile 시스템 앱 내에서 또는 킬스위치 파일이 존재하면 중단(abort).
  • Zygote 역할 분리:
    • system_server에서는 AKServer 인스턴스화.
    • 다른 앱에서는 AKClient 인스턴스화.

Binder 기반 클라이언트/서버 백도어

  • AKServer (system_server에서 실행)는 보호된 브로드캐스트를 보냄:
    • com.action.SystemOptimizeService → 클라이언트를 위한 binder 인터페이스.
    • com.action.SystemProtectService → 다운로드된 모듈을 위한 binder 인터페이스.
  • AKClient (모든 앱 내부)는 브로드캐스트로 해당 인터페이스를 수신하고 attach 트랜잭션을 수행해 IPC 래퍼를 전달한다. 이를 통해 서버는 임의의 DEX를 현재 앱 프로세스 내부에서 로드할 수 있다.
  • 노출된 특권 연산(SystemProtectService 통해): 모든 패키지에 대한 권한 부여/회수, 지리 위치 수집, 디바이스 정보 유출. 이는 권한 우회를 중앙집중화하면서도 선택된 대상 앱(Chrome, YouTube, launcher, 쇼핑 앱 등)에서 코드를 실행할 수 있게 한다.

C2 스테이징, 암호화, 및 게이팅

  • 호스트 검색: Base64 → gzip → AES-128-CFB 복호화, 키 MD5("ota.host.ba60d29da7fd4794b5c5f732916f7d5c"), IV "0102030405060708".
  • 피해자 등록: IMEI/MAC/model/OS 수집, 키 MD5("ota.api.bbf6e0a947a5f41d7f5226affcfd858c")로 암호화, /ak/api/pts/v4m=MD5(IMEI)n=w|m(네트워크 타입) 파라미터로 POST. 응답의 data도 동일하게 암호화됨.
  • 활성화 지연: C2는 요청의 “activation time“으로부터 약 2.5개월 이후에만 모듈을 제공하여 샌드박스 폭발을 방해한다.
  • 모듈 컨테이너(독점):
struct KeenaduPayload {
int32_t  version;
uint8_t  padding[0x100];
uint8_t  salt[0x20];
KeenaduChunk config;   // size + data
KeenaduChunk payload;  // size + data
KeenaduChunk signature;// size + data
} __packed;
  • 무결성: MD5 파일 검사 + DSA 서명 (모듈을 발급할 수 있는 유일한 사람은 개인 키를 가진 운영자).
  • 복호화: AES-128-CFB, 키 MD5("37d9a33df833c0d6f11f1b8079aaa2dc" + salt), IV "0102030405060708".

지속성 및 포렌식 팁

  • 공급망 배치: 빌드 과정에서 악성 정적 라이브러리 libVndxUtils.alibandroid_runtime.so에 링크됨 (예: vendor/mediatek/proprietary/external/libutils/arm[64]/libVndxUtils.a).
  • 펌웨어 감사: 펌웨어 이미지는 Android Sparse super.img 형식으로 제공됨; 파티션을 추출하고 libandroid_runtime.so에서 추가된 println_native 호출을 검사하려면 lpunpack(또는 유사 도구)을 사용.
  • 디바이스 상의 아티팩트: /data/dalvik-cache/arm*/system@framework@vndx_10x.jar@classes.jar의 존재, logcat 태그 AK_CPP, 또는 com.action.SystemOptimizeService/com.action.SystemProtectService로 명명된 보호된 브로드캐스트는 compromise를 나타냄.

References

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기