보안 솔루션 분석 방법

보안 솔루션 분석 방법

2025년 5월 23일

공부해야할것 #

  • 유니콘엔진도 필요함 에뮬레이션을 해야하는데 .. + unidbg?
  • 사실 안드로이드가 더 유리함. PC는 어차피 공격자도 로컬에서 더높은 권한을 갖고있는데 안드로이드는 그래도 TEE라도 있지..
  • SELinux/eBPF 같은것도 공부해야됨. 안드로이드도 커널기반 안티치트가 있다??? 그럼 운영체제랑 협업을 하는거네..?
  • GKI 구조의 벤더 커널모듈? 이게 텐센트 ACE?
    구현 층 어떻게 커널에 발붙이냐 대표 예시 무슨 일을 하나
    ① Vendor kernel module (.ko) 제조사 / SoC 벤더가 vendor ramdisk 안에 .ko 넣어 부팅 때 modprobe로 로드 ( Android Open Source Project) tc_anticheat.ko (Tencent ACE), “xshield.ko”(넷이즈) security_ptrace_access()·process_vm_writev() 후킹
    /proc/*/mem 오픈 감시 → Frida·GameGuardian 차단
    ② eBPF 프로그램 시스템 데몬(게임부스터, 보안앱)이 CAP_BPF 로 eBPF 바이트코드 로드 ( Android Open Source Project, Medium) 중국 게이밍폰 “Turbo-BPF”, 삼성 Knox Net Manager tracepoint/sys_enter_ptrace 같이 특정 syscall 실시간 스니핑
    • 비정상 패턴 잡으면 bpf_send_signal(SIGKILL)
    ③ LSM 패치 / Yama 강화 OEM이 security_ptrace_access() 를 패치하거나 kernel.yama.ptrace_scope=3 하드코딩 ( Android Git Repositories) MIUI 커널, 일부 Vivo 커스텀커널 • 비시스템 UID가 ptrace 시도 → 직접 -EPERM 리턴
    ④ 하이퍼바이저 / RKP 계열 ARM EL2(케이진, 삼성 RKP)에서 커널 메모리 무결성 감시 플래그십 갤럭시, 퀄컴 “Game Security Engine” • 코드 페이지가 R-X 아닌 W 시그널 → 즉시 PANIC or kill

보안 솔루션의 역할 #

  • 후킹 탐지
  • 메모리 변경감지
  • 코드 보호(java, jni, 보안솔루션 코드도)
  • 난독화(문자열, 로직)
  • 암호화(데이터 문자열 등)
  • 리포팅?
  • 악성 패키지 탐지?
  • 해시값 검증
  • 악성 환경 탐지
    • 에뮬레이터
    • 루팅

보안솔루션이 탐지하게 되면 실행하는 로직 #

  • 리포팅
  • 프로세스 킬 이건 어떻게하나? 방법은 개많음
    • adb logcat | grep -E “Fatal|signal|Abort”
    • 종료위치 찾는 코드
 1const targets = [
 2  { n: "kill",             ret: "int",  args: ["int", "int"] },
 3  { n: "tgkill",           ret: "int",  args: ["int", "int", "int"] },
 4  { n: "tkill",            ret: "int",  args: ["int", "int"] },
 5  { n: "pthread_kill",     ret: "int",  args: ["pointer", "int"] },
 6  { n: "exit_group",       ret: "void", args: ["int"] },
 7  { n: "_exit",            ret: "void", args: ["int"] },
 8  { n: "exit",             ret: "void", args: ["int"] },
 9  { n: "syscall",          ret: "long", args: ["long", "..."] },   // 직접 syscall 우회
10];
11
12targets.forEach(t => {
13  const p = Module.findExportByName("libc.so", t.n);
14  if (!p) return;
15  Interceptor.replace(p, new NativeCallback(function () {
16    console.log(`[BLOCK] ${t.n}`, JSON.stringify(Array.prototype.slice.call(arguments)));
17    if (t.n === "syscall") {
18      const nr = arguments[0].toInt32();
19      if (nr === 94 || nr === 129 || nr === 131) {  // exit_group / kill / tgkill
20        console.log("  ↳ sys_exit / kill family blocked");
21        return 0;
22      }
23      // non-exit syscalls는 그냥 통과
24      return this.orig.apply(this, arguments);
25    }
26    return (t.ret === "void") ? undefined : 0;
27  }, t.ret, t.args));
28});

가장 먼저 실행될 수 있는 코드 #

  • 사실상 process 기준으로 먼저 실행할 수 있는 권한이 있는건 frida?
  • initarray? (native)
  • attachBaseContext (java)

게임은 어떻게? #

  • unity C# 같은 엔진이 있는 경우
  • 언리얼은 자체 게임엔진이 들어갈거임

그럼 분석은 어떻게 해야하는가? #

정적분석 또는 동적분석밖에 선택지가 없는데, 정적분석은 사실상 난독화만 되어있어도 분석하기 어려워진다.
만약 난독화나 암호화로 인해 Frida 탐지 로직이 보이지 않고, Frida 연결하자마자 종료된다면 보안 로직을 찾는데 가장 효율적인건 Frida이다.

  1. 순정 단말 1대 (정상동작 시 로그나 여러가지 정보 수집용), 루팅 마지스크 프리다 단말 1대 (우회 테스트)
  2. 정적분석으로 쉬운 해결이 가능할지 코드를 확인해본다.
  3. 만약 어렵다면 가장먼저 frida 사용이 가능하도록 세팅해야한다.
    • frida spawn (-f), kill/exit 훅이 가장 먼저해볼 내용임
    • pause 상태에서 죽으면 initarray를 의심해야한다.
    • initarray 보다 먼저 실행하는 방법은 있다. systemserver 후킹?

보안은 어떻게 해야하는가 #

정적분석 방어 #

난독·보호 기법 정적 분석에 주는 타격
컨트롤 플로 플래티닝 / CFG 스플릿 그래프 연결이 끊겨 IDA/JADX가 논리 흐름 복구 실패 → 의도적 “죽음의 엣지” 다수 삽입
동적 클래스·메서드 로딩 (Class.forName, dexClassLoader) 코드가 APK 밖(암호화 blob·서버)에서 내려와 정적 바이너리엔 없음
스트링·리터럴 암호화 탐지 키워드(“frida”, “ptrace”)가 전부 런타임 복호화 → grep·xrefs 무력화
OPCode 가상머신 랩핑 (e.g., Qihoo, Bangcle packer) DEX 바이트코드가 단순 디스패처/해시로 치환돼 실제 로직 미노출
자체 무결성 해시 (calculate_md5(…dex_section)) 패치 시도 자체를 앱이 체크해 즉시 크래시
ELF 변형 + PAC/BTI 보호 (ARM64e) IDA/Ghidra가 함수 경계·리턴타입 추론 실패, 정적 해독 속도 ↓

동적분석 방어 #

comments powered by Disqus