How to Identify Vulnerable Components in an Android App Using This Reverse Engineering Guide
You can identify vulnerable components in an Android app by decompiling the APK using the decompile.sh script and systematically analyzing the manifest, source code, and dependencies for hard-coded secrets, insecure network configurations, and dangerous permissions.
The Android Reverse Engineering skill provides a systematic workflow for transforming compiled binaries into readable source code to locate security-relevant artifacts. According to the SimoneAvogadro/android-reverse-engineering-skill repository, this guide implements a five-phase methodology that security researchers can use to uncover common vulnerable components ranging from exposed API keys to improper SSL certificate validation.
The Five-Phase Security Assessment Workflow
The complete methodology is documented in SKILL.md at plugins/android-reverse-engineering/skills/android-reverse-engineering/SKILL.md. Each phase builds upon the previous to create a comprehensive security audit.
Phase 1: Dependency Verification
Run check-deps.sh to ensure all decompilation tools are present and up-to-date. This script validates installations of jadx, Fernflower/Vineflower, and dex2jar.
Using current decompilers prevents incomplete code recovery that could hide vulnerable components behind obfuscated or malformed output.
Phase 2: Decompilation
Execute decompile.sh with your target engine (jadx, fernflower, or both) to generate complete Java or Kotlin sources. The script processes APK, XAPK, JAR, and AAR formats.
Complete source recovery is required to spot insecure permissions in the manifest and hard-coded secrets in application logic.
Phase 3: Structure Analysis
Inspect AndroidManifest.xml in the decompiled resources directory to identify requested permissions and exported components. Analyze the package layout to determine architectural patterns (MVP, MVVM, Clean).
This phase reveals risky permissions like INTERNET or WRITE_EXTERNAL_STORAGE and maps where networking code resides within the architecture.
Phase 4: Call-Flow Tracing
Starting from the launcher Activity or Application class, follow initialization chains through dependency injection modules to UI-to-network paths. Document how data flows from user input to remote endpoints.
Tracing execution paths exposes whether user input undergoes proper validation and whether TLS enforcement occurs consistently across network calls.
Phase 5: API and Vulnerability Extraction
Run find-api-calls.sh to identify Retrofit, OkHttp, and Volley endpoints. Supplement with targeted grep searches for insecure patterns including hard-coded URLs, API keys, and unsafe SSL implementations.
This produces a concise inventory of endpoints, credentials, and exploitable code patterns for remediation prioritization.
Detecting Specific Vulnerable Components
Apply these targeted searches after decompilation to locate specific security anti-patterns in the generated source code.
Hard-Coded Secrets and Credentials
Search for authentication tokens, API keys, and client secrets embedded directly in source files.
grep -rniE '(api[_-]?key|auth[_-]?token|bearer|authorization|client[_-]?secret|access[_-]?token)' <decompiled>/sources
While find-api-calls.sh includes basic auth patterns, tightening the regex captures proprietary or non-standard token naming conventions that automated scripts might miss.
Insecure HTTP and Clear-Text Traffic
Locate unencrypted endpoint URLs and unsafe HttpURLConnection usage that transmits data without TLS.
grep -rniE '"http://[^"]+"' <decompiled>/sources
grep -rniE 'openConnection\(\).*setRequestMethod\(' <decompiled>/sources
Clear-text HTTP exposes user data to interception, particularly dangerous for authentication endpoints or personal information transmission.
Improper Certificate Validation
Detect custom X509TrustManager implementations that accept all certificates or HostnameVerifier classes that bypass verification.
grep -rniE 'X509TrustManager.*checkServerTrusted' <decompiled>/sources
grep -rniE 'HostnameVerifier.*verify' <decompiled>/sources
Empty checkServerTrusted methods or permissive verify implementations allow man-in-the-middle attacks against otherwise TLS-protected connections.
WebView JavaScript Interface Exposure
Identify addJavascriptInterface calls that expose native Java or Kotlin objects to JavaScript without proper @JavascriptInterface annotations or input validation.
grep -rniE 'addJavascriptInterface\(' <decompiled>/sources
Unsecured JavaScript interfaces can allow remote code execution when malicious web content loads within the application's WebView.
Excessive or Dangerous Permissions
Review AndroidManifest.xml for permissions that exceed the application's core functionality requirements.
grep -nE '<uses-permission' <decompiled>/resources/AndroidManifest.xml
Permissions like WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE, or SYSTEM_ALERT_WINDOW increase attack surface when requested without clear necessity.
Outdated Third-Party Libraries
Identify library version strings in Gradle files or dependency declarations to cross-reference against known CVE databases.
grep -rniE 'implementation|compile' <decompiled>/sources | grep -iE '(okhttp|retrofit|glide|guava)'
Libraries like OkHttp 3.12.0 or older Retrofit versions may contain documented vulnerabilities patched in subsequent releases.
SQL Injection in SQLite Usage
Locate raw execSQL calls that concatenate user input directly into SQL statements.
grep -rniE 'execSQL\([^"]*\+"' <decompiled>/sources
Dynamic SQL construction without parameterized queries enables data extraction or manipulation attacks against local databases.
End-to-End Workflow Example
Execute this complete session from your terminal after cloning the repository. Replace <path-to-apk> with your target Android package.
# 1️⃣ Verify required tools
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/check-deps.sh
# 2️⃣ Decompile the APK using both engines for maximum coverage
OUTPUT_DIR=$(basename "<path-to-apk>" .apk)-decompiled
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/decompile.sh \
--engine both -o "$OUTPUT_DIR" "<path-to-apk>"
# 3️⃣ Analyze the manifest for risky permissions
echo "=== Permissions ==="
grep -nE '<uses-permission' "$OUTPUT_DIR/resources/AndroidManifest.xml"
# 4️⃣ Run the generic API-search script
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/find-api-calls.sh \
"$OUTPUT_DIR/sources"
# 5️⃣ Search for insecure HTTP URLs
echo "=== Hard-coded HTTP URLs ==="
grep -rniE '"http://[^"]+"' "$OUTPUT_DIR/sources"
# 6️⃣ Detect unsafe TrustManager implementations
echo "=== TrustManager that accepts all certs ==="
grep -rniE 'X509TrustManager.*checkServerTrusted' "$OUTPUT_DIR/sources"
# 7️⃣ Find WebView JavaScript interfaces
echo "=== WebView JavaScript interfaces ==="
grep -rniE 'addJavascriptInterface\(' "$OUTPUT_DIR/sources"
Generate a markdown report summarizing your findings for developer handoff:
cat <<'EOF' > vulnerability-report.md
## Vulnerable Components Detected
### 1. Hard-coded HTTP URL
- **File:** com/example/network/ApiClient.java:27
- **Snippet:** `"http://api.example.com/v1/login"`
- **Risk:** Clear-text transmission of credentials.
### 2. TrustManager that trusts all certificates
- **File:** com/example/security/UnsafeTrustManager.kt:12
- **Snippet:** `override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {}`
- **Risk:** Man-in-the-middle attacks.
EOF
Summary
- The Android Reverse Engineering skill provides a structured five-phase workflow for decompiling APKs and locating vulnerable components.
- Phase 1 uses
check-deps.shto ensure decompilers (jadx,Fernflower,dex2jar) are current, preventing incomplete code analysis. - Phase 2 executes
decompile.shto generate Java/Kotlin sources from APK, XAPK, JAR, or AAR files. - Phase 3 analyzes
AndroidManifest.xmland architectural patterns to map risky permissions and networking code locations. - Phase 4 traces call flows from
ActivityorApplicationclasses through DI modules to identify validation and TLS enforcement gaps. - Phase 5 runs
find-api-calls.shand targetedgrepsearches to extract hard-coded secrets, insecure HTTP endpoints, and unsafe SSL implementations.
Frequently Asked Questions
What file contains the master workflow documentation for this reverse engineering guide?
The master documentation resides in SKILL.md at plugins/android-reverse-engineering/skills/android-reverse-engineering/SKILL.md. This file defines the five-phase process from dependency verification through API extraction, serving as the authoritative reference for the security assessment workflow.
How does the decompilation script handle different Android package formats?
The decompile.sh script accepts APK, XAPK, JAR, and AAR files through the --engine flag supporting jadx, fernflower, or both options. Using both engines provides maximum coverage, as different obfuscation techniques may yield better results with one decompiler versus the other.
Which grep patterns detect the most critical vulnerability: custom TrustManager implementations?
Search for X509TrustManager alongside checkServerTrusted to identify certificate validation bypasses. The pattern grep -rniE 'X509TrustManager.*checkServerTrusted' locates implementations where the method body is empty or unconditionally accepts certificates, representing immediate man-in-the-middle vulnerabilities.
Can this workflow integrate with automated CI/CD security scanning?
Yes, the bash scripts return machine-readable status codes suitable for pipeline integration. You can automate check-deps.sh and decompile.sh in CI environments to perform regression testing on release builds, while the grep patterns from api-extraction-patterns.md can feed into static analysis tools for continuous vulnerability monitoring.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →