
How we found 24 Android vulnerabilities using our open source AI security agent
GitHub Security Lab describes the architecture behind its open-source "Taskflow Agent," a set of YAML-defined prompt workflows (e.g. gather_mobile_entry_point_info.yaml, classify_application_local.yaml) that guide an LLM through structured, multi-step code audits rather than a single free-form prompt. Using these taskflows on Android apps via GitHub Copilot, the team found 24 vulnerabilities, including a location-tracking bug in OsmAnd via exported-activity intent extras and a cookie-leaking account-takeover chain in the Wikipedia app via a deeplink hostname-parsing flaw. The post's more durable contribution is its analysis of LLM auditing behavior: strong at recognizing API-level unsafe patterns and generating working PoCs, but unreliable at severity estimation and prone to false positives from mitigating factors the model doesn't account for, requiring human review and repeated/guided runs.
What it claims
GitHub Security Lab adapted its existing audit taskflows to Android and reports 24 vulnerabilities found so far. Most are simple, such as path traversal. A handful are critical, including the OsmAnd and Wikipedia chains. The author notes that findings land where an Android researcher would expect: cross-app scripting in WebViews, exposed JavaScript bridges, exported components that trust intent extras, and suffix-based hostname checks.
How it works
The Android work builds on earlier generic audit taskflows and changes two things:
gather_mobile_entry_point_info.yaml(new) sorts the discovered entry points into mobile and non-mobile. This lets a monorepo that also holds web servers or desktop apps be audited against the correct attack surface.classify_application_local.yaml(edited) gives the model a fixed checklist of vulnerability classes for each entry-point type. For example, an intent-based entry point is always checked for confused deputy and insecure broadcasts. The rationale is that mobile bug classes are less widely known and LLM output is non-deterministic.
Results come from combining runs:
- Strict checklist prompt, run repeatedly: keeps obvious bugs from being missed.
- Broad, open-ended prompt: leaves room for the model's creativity.
A separate "create a proof of concept" pass is used to make the model try to exploit each finding, which exposes mitigating factors.
The two bug patterns the taskflows caught generalise:
- Trusted-caller extras on an exported activity. OsmAnd's
MapActivityreadsilent_import,replaceandexport_type_list_keyas if they came from its AIDL service. Any app, even one with no permissions, can set those extras. - Hostname checks done with
endsWith. The Wikipedia app usedendsWith(WikiSite.BASE_DOMAIN)both for deeplink routing and inSharedPreferenceCookieManager.kt:101.evil-wikipedia.orgpasses both checks.
How to use it
Requirements and costs:
- A GitHub Copilot licence is required.
- Runs consume premium model requests and many tool calls, so token use can be large.
- A medium-sized repo takes about an hour or two.
To run it, start a codespace on the seclab-taskflows repository, wait for it to initialise, then run:
./scripts/audit/run_mobile.sh myorg/myrepoWhen the run finishes, an SQLite viewer opens. Open the audit_results table and filter for rows where has_vulnerability is checked.
Limits
- Noisy output. The model reports low-severity bugs and bugs needing near-impossible states, even when told not to. Every finding needs review by someone who knows mobile security.
- Unreliable severity. The model misses mitigating factors unless pushed through a PoC pass. Example: a path traversal confined to external storage is low severity.
- Wrong assumptions about data flow. The model may assume attacker-written external-storage data affects the app when internal storage actually takes precedence, producing a false positive. The stated fixes are giving the model a debugger to run the PoC against the original code, or prompting it explicitly to look for this.
- Where it does well. The model knows security-relevant API behaviour well (e.g. Go's
path.Cleanversusfilepath.Clean), and generated PoCs usually needed little modification. - No measured rates. The page gives no false-positive rate, no per-run counts and no breakdown of the 24 findings. The model behind Copilot is not named.
Organisations named here
- GitHub Security Lab
- GitHub
- Wikimedia Foundation
- Wikipedia
- GitHub Copilot
- OsmAnd
Technologies named here
- GitHub Security Lab Taskflow Agent
- seclab-taskflows
- GitHub Copilot
- SQLite
- YAML
Techniques named here
- gather_mobile_entry_point_info taskflow
- classify_application_local taskflow
- Proof-of-concept prompting for severity estimation
Related in coding-agents
