performing-mobile-app-certificate-pinning-bypass skill (Anthropic-Cybersecurity-Skills)
- Install
- SKILL.md (verbatim)
- When to Use
- Prerequisites
- Workflow
- Step 1: Identify Pinning Implementation
- Step 2: Bypass with Objection (Quickest Approach)
- Step 3: Bypass with Custom Frida Scripts
- Step 4: Handle Advanced Pinning
- Step 5: Verify Bypass Success
- Key Concepts
- Tools & Systems
- Common Pitfalls
- Other files in this skill
- assets/template.md (verbatim)
- Target
- Pinning Implementation Analysis
- Findings
- Recommendations
- references/api-reference.md (verbatim)
- Libraries Used
- CLI Interface
- Core Functions
- detectpinningimplementation(apkpath) — Static APK analysis
- runfridabypass(packagename, deviceid) — Dynamic Frida bypass
- runobjectionbypass(packagename) — Objection framework bypass
- checkproxysetup() — Verify interception environment
- Pinning Strength Classification
- Dependencies
- references/standards.md (verbatim)
- OWASP Mobile Top 10 2024
- OWASP MASVS v2.0
- CWE Mappings
- references/workflows.md (verbatim)
- Workflow 1: Escalating Bypass Approach
- Decision Matrix
What it does. 'Bypasses SSL/TLS certificate pinning implementations in Android and Part of mukul975/Anthropic-Cybersecurity-Skills (817 security skills) (mukul975/Anthropic-Cybersecurity-Skills).
| Upstream | mukul975/Anthropic-Cybersecurity-Skills |
| Skill file | skills/performing-mobile-app-certificate-pinning-bypass/SKILL.md |
| License | Apache-2.0 (skill folder LICENSE) |
| Author | mukul975 |
| Fetched | 2026-09-10 |
Install
npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill performing-mobile-app-certificate-pinning-bypass, or copy the skill folder into~/.claude/skills/performing-mobile-app-certificate-pinning-bypass/.- Raw file:
curl -sL https://raw.githubusercontent.com/mukul975/Anthropic-Cybersecurity-Skills/HEAD/skills/performing-mobile-app-certificate-pinning-bypass/SKILL.md
SKILL.md (verbatim)
name: performing-mobile-app-certificate-pinning-bypass
description: 'Bypasses SSL/TLS certificate pinning implementations in Android and
iOS applications to enable traffic interception during authorized security assessments.
Covers OkHttp, TrustManager, NSURLSession, and third-party pinning library bypass
techniques using Frida, Objection, and custom scripts. Activates for requests involving
certificate pinning bypass, SSL pinning defeat, mobile TLS interception, or proxy-resistant
app testing.
'
domain: cybersecurity
subdomain: mobile-security
author: mahipal
tags:
- mobile-security
- android
- ios
- certificate-pinning
- frida
- penetration-testing
version: 1.0.0
license: Apache-2.0
nist_csf:
- PR.PS-01
- PR.AA-05
- ID.RA-01
- DE.CM-09
mitre_attack:
- T1059
- T1056
- T1036
- T1078
- T1027
Performing Mobile App Certificate Pinning Bypass
When to Use
Use this skill when:
- Mobile app refuses connections through a proxy due to certificate pinning
- Performing authorized security testing requiring HTTPS traffic interception
- Assessing the strength and bypass difficulty of pinning implementations
- Evaluating defense-in-depth of mobile app network security
Do not use to bypass pinning on apps without explicit testing authorization.
Prerequisites
- Burp Suite configured as proxy with listener on all interfaces
- Rooted Android device or jailbroken iOS device
- Frida server running on target device
- Objection installed (
pip install objection) - Target app installed and reproducing the pinning behavior
Workflow
Step 1: Identify Pinning Implementation
Android pinning methods to identify:
1. Network Security Config (res/xml/network_security_config.xml)
<pin-set> with certificate hash pins
2. OkHttp CertificatePinner
CertificatePinner.Builder().add("api.target.com", "sha256/...")
3. Custom TrustManager
X509TrustManager overrides in code
4. Third-party libraries
- TrustKit
- Certificate Transparency checks
iOS pinning methods:
1. NSURLSession delegate (URLSession:didReceiveChallenge:)
2. ATS (App Transport Security) with custom trust evaluation
3. TrustKit framework
4. Alamofire ServerTrustPolicy
5. Custom SecTrust evaluation
Step 2: Bypass with Objection (Quickest Approach)
# Android
objection --gadget com.target.app explore
android sslpinning disable
# iOS
objection --gadget com.target.app explore
ios sslpinning disable
Objection hooks common pinning implementations including OkHttp CertificatePinner, TrustManagerImpl, NSURLSession delegate methods, and SecTrust evaluation.
Step 3: Bypass with Custom Frida Scripts
Android - Universal SSL Pinning Bypass:
// android_ssl_bypass.js
Java.perform(function() {
// Bypass TrustManagerImpl
var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl");
TrustManagerImpl.verifyChain.implementation = function(untrustedChain, trustAnchorChain,
host, clientAuth, ocspData, tlsSctData) {
console.log("[+] Bypassing TrustManagerImpl for: " + host);
return untrustedChain;
};
// Bypass OkHttp3 CertificatePinner
try {
var CertificatePinner = Java.use("okhttp3.CertificatePinner");
CertificatePinner.check.overload("java.lang.String", "java.util.List").implementation =
function(hostname, peerCertificates) {
console.log("[+] Bypassing OkHttp3 pinning for: " + hostname);
return;
};
} catch(e) {}
// Bypass custom X509TrustManager
var X509TrustManager = Java.use("javax.net.ssl.X509TrustManager");
var TrustManager = Java.registerClass({
name: "com.bypass.TrustManager",
implements: [X509TrustManager],
methods: {
checkClientTrusted: function(chain, authType) {},
checkServerTrusted: function(chain, authType) {},
getAcceptedIssuers: function() { return []; }
}
});
// Bypass SSLContext
var SSLContext = Java.use("javax.net.ssl.SSLContext");
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;",
"[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation =
function(km, tm, sr) {
console.log("[+] Replacing TrustManagers in SSLContext.init");
this.init(km, [TrustManager.$new()], sr);
};
// Bypass NetworkSecurityConfig (Android 7+)
try {
var NetworkSecurityConfig = Java.use(
"android.security.net.config.NetworkSecurityConfig");
NetworkSecurityConfig.isCleartextTrafficPermitted.implementation = function() {
return true;
};
} catch(e) {}
console.log("[*] SSL pinning bypass loaded");
});
frida -U -f com.target.app -l android_ssl_bypass.js --no-pause
iOS - Universal SSL Pinning Bypass:
// ios_ssl_bypass.js
if (ObjC.available) {
// Bypass NSURLSession delegate
var resolver = new ApiResolver("objc");
resolver.enumerateMatches(
"-[* URLSession:didReceiveChallenge:completionHandler:]", {
onMatch: function(match) {
Interceptor.attach(match.address, {
onEnter: function(args) {
var completionHandler = new ObjC.Block(args[4]);
var NSURLSessionAuthChallengeUseCredential = 0;
var trust = new ObjC.Object(args[3])
.protectionSpace().serverTrust();
var credential = ObjC.classes.NSURLCredential
.credentialForTrust_(trust);
completionHandler.invoke(NSURLSessionAuthChallengeUseCredential,
credential);
}
});
},
onComplete: function() {}
});
// Bypass SecTrustEvaluate
var SecTrustEvaluateWithError = Module.findExportByName(
"Security", "SecTrustEvaluateWithError");
if (SecTrustEvaluateWithError) {
Interceptor.replace(SecTrustEvaluateWithError, new NativeCallback(
function(trust, error) {
return 1; // Always return true
}, "bool", ["pointer", "pointer"]
));
}
console.log("[*] iOS SSL pinning bypass loaded");
}
Step 4: Handle Advanced Pinning
For apps using advanced pinning (TrustKit, custom binary checks):
# Identify the specific pinning library
frida-trace -U -n TargetApp -m "*[*Trust*]" -m "*[*Pin*]" -m "*[*SSL*]" -m "*[*Certificate*]"
# Hook the identified validation function
# Custom Frida script targeting the specific implementation
Step 5: Verify Bypass Success
After applying the bypass:
- Configure device proxy to Burp Suite
- Open target app and navigate through authenticated flows
- Verify HTTPS traffic appears in Burp Suite HTTP History
- Check for any remaining pinned connections that are not captured
Key Concepts
| Term | Definition |
|---|---|
| Certificate Pinning | Restricting accepted server certificates to a known set, preventing MITM via rogue CA certificates |
| Public Key Pinning | Pinning the server's public key hash rather than the full certificate, surviving certificate rotation |
| Network Security Config | Android XML configuration for declaring trust anchors, pins, and cleartext policy per-domain |
| TrustKit | Open-source library implementing certificate pinning with reporting for both Android and iOS |
| HPKP Deprecation | HTTP Public Key Pinning header was deprecated in browsers but concept persists in mobile apps |
Tools & Systems
- Objection: Pre-built pinning bypass for common libraries (OkHttp, NSURLSession, TrustKit)
- Frida: Custom JavaScript hooks targeting specific pinning implementations
- apktool: APK decompilation for identifying pinning in Network Security Config
- SSLUnpinning (Xposed): Xposed framework module for system-wide pinning bypass on Android
- ssl-kill-switch2: iOS tweak for disabling SSL pinning system-wide on jailbroken devices
Common Pitfalls
- Certificate transparency: Some apps check CT logs in addition to pinning. May need to bypass CT verification separately.
- Multi-layer pinning: Apps may implement pinning at multiple levels (OkHttp + custom TrustManager). Bypass all layers.
- Binary-level pinning: Some apps validate certificates in native C/C++ code, which requires Interceptor.attach at native function addresses rather than Java/ObjC hooks.
- Dynamic pinning updates: Apps using TrustKit or similar may fetch updated pins from a server. Monitor for pin rotation during testing.
Other files in this skill
- LICENSE
- assets/template.md
- references/api-reference.md
- references/standards.md
- references/workflows.md
- scripts/agent.py
- scripts/process.py
assets/template.md (verbatim)
Certificate Pinning Bypass Assessment Report
Target
| Field | Value |
|---|---|
| Application | [APP_NAME] |
| Platform | [Android/iOS] |
| Pinning Method | [OkHttp/TrustManager/NSURLSession/TrustKit/Custom] |
| Bypass Method | [Objection/Frida/Manual] |
| Bypass Difficulty | [Easy/Medium/Hard] |
Pinning Implementation Analysis
| Layer | Implementation | Bypass Status |
|---|---|---|
| [Java/ObjC/Native] | [DETAILS] | [Bypassed/Not Bypassed] |
Findings
- [FINDING]
Recommendations
- [RECOMMENDATION]
references/api-reference.md (verbatim)
API Reference — Performing Mobile App Certificate Pinning Bypass
Libraries Used
- subprocess: Execute frida, objection, apktool, adb commands
- pathlib: Read decompiled APK smali files
CLI Interface
python agent.py detect --apk app.apk
python agent.py frida --package com.example.app [--device emulator-5554]
python agent.py objection --package com.example.app
python agent.py proxy
Core Functions
detect_pinning_implementation(apk_path) — Static APK analysis
Decompiles APK with apktool. Searches smali for pinning indicators: OkHttp CertificatePinner, X509TrustManager, network_security_config, WebView SSL error handler, Conscrypt TrustManagerImpl, Certificate Transparency.
run_frida_bypass(package_name, device_id) — Dynamic Frida bypass
Injects JavaScript to bypass: TrustManagerImpl.verifyChain, OkHttp CertificatePinner.check, WebViewClient.onReceivedSslError.
run_objection_bypass(package_name) — Objection framework bypass
Runs android sslpinning disable via objection exploration mode.
check_proxy_setup() — Verify interception environment
Checks: Android proxy settings, system CA certificates, user-installed CA certs.
Pinning Strength Classification
| Level | Criteria |
|---|---|
| STRONG | 3+ pinning implementations detected |
| MODERATE | 1-2 implementations |
| NONE | No pinning indicators found |
Dependencies
pip install frida-tools objection
System: apktool, adb (Android Debug Bridge)
references/standards.md (verbatim)
Standards Reference: Certificate Pinning Bypass
OWASP Mobile Top 10 2024
| ID | Risk | Relevance |
|---|---|---|
| M5 | Insecure Communication | Pinning assessment as part of network security |
| M7 | Insufficient Binary Protections | Pinning as binary-level protection |
OWASP MASVS v2.0
| Control | Description |
|---|---|
| MASVS-NETWORK-1 | App uses TLS for all network communication |
| MASVS-NETWORK-2 | App performs certificate pinning for critical connections |
| MASVS-RESILIENCE-1 | App detects and responds to running in instrumented environment |
CWE Mappings
| CWE | Title |
|---|---|
| CWE-295 | Improper Certificate Validation |
| CWE-297 | Improper Validation of Certificate with Host Mismatch |
references/workflows.md (verbatim)
Workflows: Certificate Pinning Bypass
Workflow 1: Escalating Bypass Approach
[Configure Burp proxy] --> [App connection fails?] --> [Yes: Pinning active]
|
[Try Objection generic bypass]
|
[Traffic visible?]
/ \
[Yes: Done] [No: Advanced]
|
[Identify pinning library]
[frida-trace *Trust* *Pin*]
|
[Write custom Frida script]
[Target specific implementation]
|
[Verify traffic capture]
Decision Matrix
| Pinning Method | Bypass Tool | Difficulty |
|---|---|---|
| OkHttp CertificatePinner | Objection | Easy |
| Network Security Config | Manifest modification | Easy |
| Custom TrustManager | Frida hook | Medium |
| TrustKit | Objection or Frida | Medium |
| Native C/C++ validation | Frida Interceptor.attach | Hard |
| Certificate Transparency | Custom Frida script | Hard |
Back to mukul975/Anthropic-Cybersecurity-Skills (817 security skills) or Agent skills.