
안드로이드 운영체제의 아키텍처는 각 계층마다 서로 다른 기능과 사용자 인터페이스 수준을 제공한다.
System Apps
Java API Framework
ActivityManager같은 Manager class와 Content Provider, View System 등이 존재Native C/C++ Libraries
WebKit은 웹 콘텐츠 렌더링, Media Framework는 오디오/비디오 처리 등Android Runtime
Hardware Abstraction Layer
Linux Kernel

assets/ : 앱을 실행할 때 필요한 정적 자원 중 큰 파일(동영상, 폰트 등)을 관리하는 폴더res/ : 앱을 실행할 때 필요한 자원 중 작은 파일(이미지 등)을 관리하는 폴더META-INF/ : 인증 서명과 관련한 정보(APK 서명, 인증서)가 담긴 폴더lib/ : 라이브러리 파일(*.so)이 들어있는 폴더AndroidManifest.xml : 앱의 기본 정보, 접근 권한, 버전, activity 등이 적힌 파일resources.arsc : res에 대한 세부 정보가(문자열, 리소스 인덱스) 담긴 파일class.dex : bytecode로 변환된 핵심 실행 파일(.dex)Android는 linux 기반이라 root 디렉토리를 기준으로 하위 디렉토리가 존재한다.
/system : Android OS의 핵심 파일들이 있는 영역/data : 사용자 데이터를 저장하는 곳 (app, cache, user)/proc : 실행 중인 프로세스나 시스템 정보를 저장하는 가상 파일 시스템/sys : kernel이 장치 트리, 드라이버, 전원 상태를 노출하는 가상 디렉토리/dev, /sbin, /etc, /root, /tmp 등 전통적인 linux 계층 구조를 이루고 있으며, 일반 앱은 /data/data 디렉토리 안에서만 동작 가능하다. (나머지는 root 권한 필요)앱의 화면 하나를 나타내는 컴포넌트
onCreate ,onStart ,onResume 함수를 실행하며 화면을 출력onPause ,onStop 함수 등으로 기존의 activity가 중지 혹은 종료됨. 다시 기존 activity로 돌아오면 onRestart 함수를 실행.onDestroy 함수로 스택에서 완전히 삭제함.Intent를 통해 서로 이동할 수 있음.AndroidManifest.xml : 앱의 핵심 정보를 담고 있다.Data Leak : 자동 로그인과 같이 앱/디바이스 저장소 내부에 credential (id, pw, API key 등)을 평문으로 저장하는 경우 데이터가 유출될 수 있음. 디버깅 용 log 코드를 지우지 않거나, 소스 코드 내 하드 코딩 되어있는 credential를 지우지 않은 경우가 이에 해당된다.
AWS Cognito : 웹 및 모바일 앱에 대한 인증 및 권한 부여 기능을 제공하는 서비스로, 사용자 풀(User pool)과 자격 증명 풀(Identity pool)로 구성되어 있다.
Deep Link : 특정 링크를 클릭했을 때 모바일 앱의 기능(activity)이 실행되게 하는 기술
<intent-filter> 를 추가해서 설정할 수 있는 기능이다.<activity android:name=".ProductDetailActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/product/" />
</intent-filter>
</activity>
사용자가 링크를 클릭하면 필터와 URL을 비교하고, 일치하는 경우 특정 activity를 실행한다 URL 검증이 미흡하거나, HOST 검증이 미흡하면 이를 악용하여 XSS 공격, 세션/토큰 탈취, Phising Page로 redirect하는 등 공격이 가능하고, 사용자가 신뢰할 수 있는 앱을 믿고 입력한 credential이 공격자한테 전송이 될 수 있다.Broadcast receiver 취약점
Broadcast Reciever : Android 시스템 또는 다른 앱에서 발생한 특정 이벤트를 감지하고 반응하는 컴포넌트. 충전 중, 부팅 완료, 네트워크 상태 변경 같은 이벤트를 감지하고, 앱에 전달한다.
manifest 파일에서 exported=“true” 이 설정되어 있으면 리시버는 외부 앱에서 직접 호출이 가능하게 된다. 이 때, 특정 리시버가 외부 Intent를 받을 수 있게 설정되어 있으면 특정 피싱 URL이 포함된 intent를 전송하여 공격할 수 있다.
특정한 컴포넌트를 명확히 지정하여 호출하지 않고, 암시적 intent로 조건에 맞는 모든 앱에 intent를 보내게 되면 사용자가 그 중 선택하도록 되어 있다. 그러나 이 앱 중 공격자가 개발한 악성 앱이 있을 경우 intent에 사용자의 credential이 있으면 이것이봇 가로채질 수 있다.
Intent Redirection : 외부에서 실행할 수 없는 activity (exported=”false”)가 있어 특정 앱에서만 실행할 수 있도록 되어 있는 경우, intent를 전달받아 activity를 실행하는 코드가 있을 때
Content Provider : Android 앱이 어떤 데이터, 파일 리소스에 접근할 수 있도록 해주는 컴포넌트
이 때 exported=”true”로 설정되어 있으면 다른 앱에서도 접근이 가능함.

iOS 앱을 배포하고 설치할 수 있는 패키지 파일
Payload/ : 앱의 데이터가 포함되어 있는 폴더. {appname}.app 가 있음.iTunesArtwork : 앱 아이콘이 512px 크기의 png파일 형태로 들어가 있음.iTunesMetadata.plist : 개발자 이름, ID, 저작권 정보 등 기본 정보가 들어가 있음.Container
ipa를 설치하면 세 개의 주요 컨테이너에 나뉘어 설치된다
Info.plist 파일이 존재함.NSAppTransportSecurity (ATS) : HTTP 통신을 허용하는지 설정하는 옵션CFBundleExecutable : 앱 실행 바이너리 파일 이름CFBundleIdentifier : 앱 식별자Documents/ : 사용자가 생성한 콘텐츠 및 오프라인 데이터를 영구적으로 저장하는 폴더. 다른 앱과 상호작용 할 때는 Inbox 하위 디렉토리에 저장되기도 한다.Library/ : 앱 실행 시 사용하는 데이터가 저장된 폴더로, 캐시 데이터, 사용자 정보가 담긴 Preferences/ 폴더 등이 존재한다.tmp/ : 앱 종료 시 OS가 자동으로 삭제하는 임시 파일들이 저장되는 폴더이다.Documents 와 앱 내부에 저장되는 Data 로 나뉘어 저장된다.App Delegate
iOS 앱의 실행 상태를 관리하고 시스템 이벤트를 처리하는 핵심 객체
application:WillFinishLaunchingWithOptions (앱 최초 실행될 때 호출되는 메서드)와 같이 delegate에 정의되어 있는 프로토콜iOS 보안
안드로이드만큼 자체 취약점이 많지 않다. iOS 운영 체제의 보안 기능이 뛰어나 악성 앱을 활용하기 쉽지 않다.
대부분의 iOS 취약점은 대부분 Android에서도 발생한다.
Credential Hardcoding : 소스 코드, 리소스 내에 credential을 하드 코딩 하면 취약
URL Scheme Vulnerability : URL을 통해 앱을 실행할 수 있는 기능으로, deep link와 비슷함
UIWebView : js를 활용한 웹 해킹 공격에 취약 (XSS)
Client 측 인증 우회 : 사용자 측에서 앱의 로직을 통한 인증만 구현했으면, 공격자들은 이를 쉽게 우회할 수 있음 (FRIDA 등). 인증의 경우 서버 측에서 검증이 필요함
iOS 앱에는 사전 할당 권한이 없고, 앱이 최초로 민감한 API를 사용 시도 시 권한 부여하라는 메시지를 사용자에서 출력한다. 권한이 부여된 앱은 설정 내 Privacy 메뉴에서 앱 별로 수정할 수 있다.
앱 분석을 어렵게 만들어서 공격자로부터 보호하려는 목적으로 사용되는 방법
Rooting 탐지 (Detection)
.su, .oneclickroot, .magisk 등)su, busybox 등 다양한 경로 탐색)build.prop 변조 여부 확인)무결성 검증
Anti Debugging
/proc/pid/status → TracerPid != 0(디버깅 중이면 pid가 적혀있음)/proc/pid/task/status 의 중괄호 뒤에 t 가 적힌 경우wchan 파일 내 ptrace_stop가 존재하는 경우isDebuggerConnected 메서드가 대표적이다.ptrace를 이용한 안티 디버깅 : 프로세스 당 디버거는 하나만 붙을 수 있기 때문에 ptrace 함수를 이용해 먼저 선점하는 방법SSL Pinning
iOS의 경우
fileExistsPath ,fopen 함수를 활용하여 Cydia, shell(/bin/bash) 여부 등을 확인하여 탈옥 여부를 확인 가능 (iOS는 기본적으로 쉘이 없음)canOpenURL 함수 등으로 URL이 실행이 되면 (cydia:// 등) 현재 환경이 탈옥 상태임을 알 수 있음ptrace 및 sysctl 함수 등으로 안티 디버깅 가능정적 분석
동적 분석