모바일 앱 보안은 한 가지 가정에서 출발합니다 — “클라이언트는 신뢰할 수 없다.” 앱은 결국 사용자의 단말에서 실행되니까요. 분석할 수도, 변조할 수도, 실행 중에 후킹할 수도 있습니다. 그래서 클라이언트 안에서 하는 검증은 언제든 우회될 수 있다는 전제로 봅니다. 이 글은 저희가 Android/iOS 앱을 점검할 때의 흐름을, 어디에 무엇이 있는지부터 차분히 정리한 글입니다.
먼저, 신뢰 경계를 그려봅니다
점검을 시작할 때 머릿속으로 이런 그림을 그립니다. ‘어디까지가 공격자가 만질 수 있는 영역인가’를 나눠 보는 거죠.
[ 사용자 단말 — 신뢰할 수 없는 영역 ]
앱 바이너리 (디컴파일·후킹 가능) ← 정적/동적 분석
│
로컬 저장소 (평문 토큰·키가 있진 않은지)
│
- - - - 통신 구간 (SSL 피닝이 걸려 있나? 평문은 없나?) - - - -
│ ← 프록시로 가로채기
[ 서버 — 진짜 통제가 있어야 하는 곳 ]
서버 API (BOLA/BFLA?) ← 사실 여기가 핵심
이 그림에서 가장 강조하고 싶은 건 맨 아래입니다. 모바일 점검은 ‘앱’에서 끝나는 게 아니라, 앱이 호출하는 서버 API까지 봐야 비로소 의미가 있습니다. 치명적인 결함은 의외로 백엔드 인가에서 나오거든요.
정적 분석 — 일단 열어봅니다
APK/IPA를 디컴파일해 코드·리소스·설정을 살펴봅니다. API 키, 비밀값, 숨은 엔드포인트, 디버그 플래그가 코드에 그대로 박혀 있는 경우가 생각보다 흔합니다.
apktool d app.apk -o out/ # 리소스·설정 추출
jadx -d src/ app.apk # 자바 소스로 디컴파일
grep -rEi "api[_-]?key|secret|password|http://" out/ src/
동적 분석 — 실행 중에 들여다봅니다 (Frida)
실행 중인 앱의 함수를 후킹해, 루팅/탈옥 탐지나 인증 로직이 어떻게 동작하는지 런타임에 관찰하고 바꿔봅니다. 클라이언트 검증이 왜 ‘참고용’일 수밖에 없는지 직접 확인하는 단계입니다.
// Frida: 루팅 탐지가 항상 '안전'을 반환하도록 후킹해 봅니다
Java.perform(function () {
var Sec = Java.use('com.app.security.RootCheck');
Sec.isDeviceRooted.implementation = function () {
return false;
};
});
통신·저장소·인증
통신: 프록시로 가로채려면 SSL 피닝을 우회해야 합니다. 우회 후 평문 전송·민감정보 노출·파라미터 변조를 봅니다.
로컬 저장소: SharedPreferences·Keychain·DB에 토큰·개인정보·키가 평문으로 남아 있지 않은지 확인합니다.
인증·세션: 토큰의 수명·갱신·바인딩, 생체 인증이 클라이언트에서만 막혀 있진 않은지 봅니다.
한 걸음 더 — 앱이 품고 있는 SDK와 라이브러리
요즘 앱은 광고·분석·결제·지도 같은 서드파티 SDK와 네이티브 라이브러리를 여럿 품고 있습니다. 그중 하나에 알려진 취약점이 있으면, 그게 곧 입구가 됩니다. 실제 표적 공격(APT)도 이런 ‘기대고 있는 부품’을 노리는 경우가 많아, 저희는 내장 컴포넌트의 버전을 식별하고 알려진 결함이 실제로 악용 가능한지 1-day 관점으로 확인합니다. (관련: 0-day는 어떻게 발굴되는가)
현장 노트: “난독화를 했는데 괜찮지 않나요?”라는 질문을 자주 받습니다. 난독화는 분석을 늦춰주긴 하지만 막아주진 못합니다. 보안은 클라이언트가 아니라 서버 쪽 통제에서 보장돼야 한다고 차분히 말씀드리곤 합니다.
자주 묻는 질문
Android와 iOS 둘 다 봐야 하나요?
저장소·권한·우회 방식이 플랫폼마다 달라 둘 다 점검하는 걸 권해드립니다. 다만 서버 API는 공통이라, 한 번 점검으로 양쪽에 도움이 됩니다.
앱만 보면 충분한가요?
앱은 입구일 뿐이고, 데이터의 관문은 서버 API입니다. 그래서 저희는 앱·통신·서버를 한 흐름으로 함께 봅니다.
마치며
클라이언트는 신뢰할 수 없다 — 이 한 문장을 전제로 하면, 모바일 점검에서 봐야 할 것들이 자연스럽게 정리됩니다. 우리 앱과 그 뒤의 서버 API를 함께 살펴보고 싶으시면 모바일 모의해킹 상담으로 편하게 연락 주세요.