Android
196 Android manual-verification steps, grouped by category. Each is a module that needs an external tool the in-app suite can’t drive.
Insecure Data Storage
- insecure_local_storage, pull
shared_prefs/*.xml(Android) or the app’sNSUserDefaultsplist (iOS) viaadb/objection and confirm the token/SSN/card are cleartext. - keychain_keystore_misuse, dump the Keychain with objection /
keychain-dumperand confirm weak accessibility / no hardware backing. - insecure_backups, run
adb backup(or a Finder/iMazing backup) and confirm app data is recoverable from the backup. - clipboard_leakage, copy a sensitive field, then read the clipboard from a second app /
adb shelland confirm the secret is present. - screenshot_taskswitcher_leakage, background the app on a sensitive screen and inspect the task-switcher snapshot.
- sensitive_data_in_logs,
adb logcat/idevicesyslogwhile using the app; confirm PII/tokens are logged. - keyboard_cache_autofill_leakage, type into a sensitive field, then inspect the IME’s personalized-dictionary / autofill cache and confirm the secret was retained (field not marked no-suggestions / no-autofill).
- temp_file_leftovers, browse the app cache/temp dirs and confirm sensitive leftovers.
- third_party_sdk_data_leakage, proxy traffic with mitmproxy and confirm the SDK exfiltrates more than its stated purpose.
- sensitive_data_in_memory, dump the process memory (fridump / objection / gdb) and recover the retained password/key.
- insecure_sdcard_external_storage, read the app’s file from shared / external storage with a second app or
adb. - backup_archive_integrity_tampering, pull a backup, flip a persisted flag (e.g.
is_premium/is_admin) or a balance, re-pack, restore, and confirm the app trusts the tampered state; verify the secure build verifies a keyed MAC over the archive and rejects it (CVE-2025-49199, MASTG-BEST-0065). - local_security_state_integrity_tampering, edit a UserDefaults / SharedPreferences / SQLite value that gates a security decision (role / entitlement) and confirm the app trusts it; verify the secure build binds the value to a keyed MAC / server authority and rejects the edit.
- auth_state_rollback_restore, restore a stale session/token blob (old backup/snapshot) and confirm the app revives the ended/revoked session; verify the secure build validates freshness/revocation server-side and rejects the rolled-back state.
- sensitive_data_in_crash_reports, trigger a crash and confirm the crash payload shipped to the crash service contains secrets/PII/request bodies; verify the secure build scrubs/allowlists the crash payload before sending.
Insufficient Cryptography
- weak_algorithms,
strings/jadx the binary and confirm a broken primitive (DES/RC4/MD5/SHA-1/ECB) is used; capture ciphertext and show the structural weakness (e.g. ECB pattern leakage). - hardcoded_keys_ivs,
strings/jadx the binary and recover the key/IV. - insecure_random, sample the “random” token/nonce/OTP repeatedly and confirm it is predictable (java.util.Random / non-CSPRNG seed).
- weak_key_derivation, capture the derived material and crack with hashcat given the low/absent iteration count.
- custom_crypto_implementation, reverse the hand-rolled cipher with jadx/Ghidra and confirm it is trivially reversible (XOR / rolled AES) vs a platform primitive.
- improper_mac_verification, flip a byte in an authenticated payload and confirm it is accepted (no constant-time MAC compare / MAC not checked).
- improper_signature_verification, tamper a signed blob/update and confirm it is accepted (signature skipped or wrong key/no chain check).
- device_secure_lock_not_enforced, run the app on a device with no screen lock and confirm sensitive features/keys are still available (no
setUserAuthenticationRequired/ secure-lock gate). - unauthenticated_encryption_malleable_ciphertext, bit-flip AES-CBC ciphertext (no MAC) and confirm the corresponding plaintext bit flips on decrypt (malleable / no integrity).
- rsa_no_oaep_padding, confirm RSA uses PKCS#1 v1.5 (not OAEP) and demonstrate the padding-oracle distinguisher against the decrypt endpoint.
Insecure Authentication / Authorization
- weak_session_management, capture the session token and confirm it is predictable / never rotated on privilege change / never expires (replay it after logout).
- insecure_biometric_prompt, hook the auth callback with Frida and force the success path.
- weak_password_policy, register/change password to a trivial value (
123456,password) and confirm it is accepted (no length/complexity/breach check). - client_side_only_authorization, flip the client-side admin flag with Frida/objection and confirm privileged actions unlock.
- jwt_vulnerabilities, forge an
alg:nonetoken / crack the weak secret withjwt_tooland confirm acceptance. - oauth_misconfiguration, capture the implicit-flow token from the redirect/logs under mitmproxy.
- passkey_weak_attestation, register with
noneattestation via a WebAuthn test harness and confirm acceptance. - passkey_origin_binding_bypass, assert from an origin that merely contains the rpId and confirm acceptance.
- passkey_credential_exfiltration, pull the credential store off-device and confirm private-key material is present.
- passkey_fallback_downgrade, force “passkey unavailable” and confirm the weak fallback path is accepted.
- passkey_assertion_replay_signcount, capture a WebAuthn assertion and replay it; confirm it is accepted again because the sign-count/credential counter is never compared (Craft CMS CVE-2026-72780 class).
- passkey_challenge_reuse, record an assertion for the server’s challenge and replay it; confirm the static/reused challenge accepts it.
- passkey_user_verification_bypass, submit an assertion with the UV flag unset under a
userVerification=REQUIREDpolicy and confirm it is accepted (Spring Security CVE-2026-47841 class). - passkey_stepup_auth_bypass, trigger a sensitive action and confirm step-up is marked “verified” from a registered passkey without completing an assertion (New-API AI gateway CVE-2026-32879 class).
- passkey_credential_management_authz, call the register/delete passkey endpoint as a different user and confirm you can add your own passkey or delete the victim’s (account takeover / lockout; USENIX 2026 class).
- passkey_session_fixation, set a known pre-auth session id, complete a passkey assertion, and confirm the id is not rotated afterwards.
- passkey_thirdparty_pairing_authz, approve a third-party authenticator / cross-device pairing and confirm no permission check gates it (Android CVE-2025-48640 / BLE CVE-2026-65935 class).
- insecure_credential_manager, confirm a credential is associated with an unverified domain (no Digital Asset Links / AASA) and autofills into an insecure field.
- username_enumeration, compare login responses for valid vs invalid usernames and confirm they differ.
- insecure_password_reset_token, request multiple reset tokens/magic links and confirm they are short, related/predictable, and never expire.
- developer_backdoor, decompile with jadx /
stringsand recover the hardcoded backdoor credential or debug route. - cross_app_otp_credential_leak, from a second (unprivileged) app, read the OTP /
myauth://auth deep link this app publishes on an unprotected exported component/broadcast/clipboard (Authenticator CVE-2026-26123 class); confirm an allowlisted/signature-checked channel yields nothing. - deeplink_authentication_bypass, fire a deep link (e.g.
dvma://wallet) via adb while logged out and confirm it reaches the authenticated screen without the app-lock/login gate (Groww CVE-2026-12065 class). - biometric_authorization_not_bound, capture a biometric success for operation A and replay it to authorize operation B (the boolean isn’t tied to the operation), and overlay the prompt; verify the secure build binds the result to a per-operation signed challenge (CryptoObject) so it only authorizes the exact op (Android biometric-overlay CVE-2025-48528 class).
- credential_provider_release_authorization, from a spoofed calling app / with an rpId mismatch (and no user-verification) extract a stored credential/passkey and enumerate entries; verify the secure build binds the calling app to the rpId, requires UV, and refuses enumeration (credential- provider release-boundary class).
- multi_account_isolation_failure, log into account A, switch to / log into account B, and confirm A’s cached token/data is still readable (and A’s session survives logout); verify the secure build scopes per-account state to the active principal and wipes/rotates it on switch and logout.
- identity_credential_presentation_binding, replay a captured mDL/mDoc (Identity Credential / ISO 18013-5) or Wallet identity presentation from a different session and confirm the verifier accepts it on issuer signature alone; verify the secure build binds the device signature to this session’s transcript + reader nonce and requires fresh user presence.
Insecure Communication
- cleartext_traffic_allowed, confirm plain HTTP under mitmproxy.
- weak_tls_config, run
testssl.shagainst the endpoint. - ssl_pinning_bypass, bypass pinning with objection/Frida and MITM.
- accept_all_trust_manager, confirm any cert is accepted under MITM.
- insecure_webview_networking, confirm mixed/cleartext content loads.
Improper Platform Usage
- insecure_webview, reach the JS bridge /
file://and demonstrate RCE-style behavior. - deeplink_url_scheme_hijack, fire crafted deep links with
adb. - exported_android_components, enumerate/invoke with drozer.
- content_provider_sql_injection, inject via the provider with drozer.
- pending_intent_hijacking, intercept the mutable PendingIntent.
- tapjacking, overlay a PoC app and confirm the tap passes through.
- over_privileged_permissions, review the manifest with aapt/jadx.
- push_notification_leakage, inspect notification payloads / lockscreen.
- qr_code_injection, scan a crafted QR and confirm unvalidated action.
- zip_path_traversal, feed a zip-slip archive to the update unpacker.
- missing_flag_secure,
adb shell screenrecorda sensitive screen. - intent_redirection, send crafted extras carrying a nested intent via drozer/adb and confirm it is forwarded to an internal component.
- predictive_back_leakage, trigger the Android 14+ predictive-back / recents snapshot on a sensitive screen and confirm it is captured.
- photo_picker_over_access, review the manifest/Info.plist and confirm full media-library access is requested instead of the scoped photo picker.
- fileprovider_path_traversal, via drozer / a companion app, request a traversal path (
../) through the FileProvider and read an app-private file. - dynamic_code_loading_rce, supply a malicious module/dex from a companion app or external storage and confirm it executes unverified.
- overlay_phishing, draw an overlay over the credential screen with a PoC app and confirm input can be captured / the tap is obscured.
- intent_arg_injection_rce, with drozer/adb, invoke the exported component with a crafted extra (e.g.
-xrun/cmd/loadLibrary) and confirm attacker-controlled args reach an execution path with the app’s privileges (Unity CVE-2025-59489 class); confirm the allowlist handler rejects it. - deeplink_to_webview_navigation, send a deep link whose
urlparam points off-origin (orjavascript:/file://) and confirm it loads in the trusted WebView with no origin allowlist (TikTok CVE-2024-45240 / Rakuten CVE-2024-41918 / EcoOnline CVE-2026-26897 class). - exported_component_arbitrary_url_activity, via drozer/adb, deliver an external intent naming an attacker URL / internal activity and confirm it opens with the app’s identity (ABEMA CVE-2024-28745 / Samsung Members CVE-2026-20985 & CVE-2025-21079 class).
- implicit_intent_sensitive_data, register a receiver in a second app for the same action and confirm sensitive extras sent on an implicit intent are delivered to it (Samsung Smart View CVE-2025-21024 class); confirm an explicit (packaged) send does not leak.
- pendingintent_provenance_confusion, obtain/replay a PendingIntent the app created and confirm the receiving SDK authenticates the presenter as the creator app (arXiv 2603.02539); confirm strict presenter==creator checking rejects it.
- inapp_browser_ui_spoofing, load attacker content that sets a fake title/origin and confirm the in-app browser address bar shows a trusted origin while the real committed URL is the attacker’s (Firefox Focus CVE-2025-10290 / LINE CVE-2024-5739 class).
- cross_app_scripting, from a co-resident app, fire an Intent whose value is a
javascript:payload (or an attacker URL) at the exported activity and confirm it executes in the WebView’s trusted origin; verify the secure build validates scheme+origin first (Google Cross-App Scripting class; Element CVE-2024-26131/26132, TikTok CVE-2024-45240). - grant_uri_permission_abuse, send a redirected Intent carrying
FLAG_GRANT_READ_URI_PERMISSIONto a privatecontent://URI and confirm the malicious app reads a file it was never granted directly (Pixel CVE-2024-27222 class). - custom_url_scheme_authorization,
adb shell am start/xcrun simctl openurladvma://open?url=https://attacker.exampleand confirm the app loads the attacker site with no caller/allowlist check (Rakuten CVE-2024-41918 / @cosme CVE-2024-45203 / Groww CVE-2026-12065 class). - confused_deputy_intent_validation, from an unprivileged app, invoke the privileged component with a superficially-valid Intent and confirm the action runs with the app’s privileges (Android Settings CVE-2025-32326 / CVE-2025-32321 class).
- ssrf_url_media_handler, pass an internal/loopback/metadata URL (
http://169.254.169.254/...) to the media/URL loader and confirm the app fetches it; verify the secure build allowlists public hosts only (WhatsApp iOS CVE-2026-23866 class). - qr_url_no_validation, scan a QR encoding a
javascript:or privilegeddvma://payload and confirm it is opened/navigated with no validation (Firefox iOS QR-scanner CVE-2025-54145 class). - proximity_transfer_unsafe_parsing, feed a malformed plist / deeply nested XML entity-expansion bomb as a proximity-transfer (AirDrop/Quick Share) payload and confirm the naive parser blows up (huge expansion / state confusion) with no pairing; verify the secure build caps depth, entity expansion, and size and rejects it (AirDrop & Quick Share proximity-protocol research class).
- exported_component_state_manipulation, from a
com.evil.*app, send the exported component an intent naming the victim’s notification id and confirm it is cancelled with no ownership check; verify the secure build requires owner==caller (or a signature permission) and refuses the cross-owner mutation (Datadog Android CVE-2026-47361 class). - contentprovider_filename_path_traversal, import a file whose display name is
../../shared_prefs/secrets.xmland confirm it escapes the import dir and overwrites/reads an app file; verify the secure build canonicalizes and confines the path under the import root (Android ContentProvider import traversal CVE-2025-65814 / CVE-2025-65815 class). - content_uri_resolver_confused_deputy, hand the app an attacker
content://com.dvma.private/...URI in an intent extra and confirm it reads the privileged provider through its own ContentResolver and returns the data to you (confused deputy); verify the secure build validates the caller may access that authority and refuses the privileged read (Android DownloadProvider CVE-2025-26417 class). - accessibility_service_privilege_abuse, from the a11y service trigger a background activity launch / UI-hide / injected gesture with no valid a11y event and confirm the privileged action fires; verify the secure build requires a user-enabled service, a genuine foreground event, and an action allowlist (Android AccessibilityServiceConnection CVE-2025-26462 / CVE-2023-21109 class).
- notification_listener_authorization_bypass, bind a notification listener with no recorded user grant (above lock / unverified filter) and read all notification contents; verify the secure build requires a persisted grant recorded while unlocked and a verified listener component (Android CVE-2025-22427 / CVE-2025-26442 class).
- background_activity_launch_abuse, from a background caller drive a component to
startActivity()onto a security-sensitive/consent surface and confirm the phishing/task-hijack UI appears; verify the secure build enforces BAL (foreground or valid launch token) and refuses the launch (Android CVE-2025-26462 class). - clipboard_unauthorized_write_integrity, from untrusted content (a page in the app WebView / another app) overwrite the system clipboard with no user gesture and confirm the user pastes attacker-controlled data (e.g. a swapped crypto address); verify the secure build requires a trusted origin + user gesture (Lenovo Android web-to-clipboard CVE-2026-7516 class).
- clipboard_to_privileged_action_injection, seed the clipboard from an untrusted origin and confirm it flows into a privileged action (auto-paste into a payment/command field / automation step) with no validation; verify the secure build validates/allowlists the value and requires explicit confirmation (webpage → clipboard → automation → privileged capability; CVE-2026-17766 class).
- authorization_by_mutable_resource_state, request access using a file-existence/state pre-check, then create/replace the resource and confirm you gain read/write to a file you shouldn’t own (incl. not-yet-existing files); verify the secure build binds authorization to a stable owner captured atomically (Android MediaProvider CVE-2026-0035 class).
- telephony_capability_abuse, from an untrusted/exported caller invoke a telephony capability (place a call to a premium number / send SMS / register a phone account) with no per-invocation permission check; verify the secure build requires the matching permission + per-invocation confirmation (Android Telecom CVE-2026-28615 class).
- cross_profile_data_capability_leakage, forward a work-profile credential to a personal surface (share sheet / clipboard / intent) and confirm it crosses; verify the secure build enforces a cross-profile policy (only allowlisted, non-sensitive items may cross, with the required user affordance) so work data is blocked (Android managed-profile leakage class).
- unauthenticated_local_loopback_service, hit the app’s loopback HTTP/TCP or unix-domain socket from a co-resident app or a DNS-rebinding web origin (no token) and confirm privileged data/functionality is served; verify the secure build requires a per-session token and validates the Origin/Host, rejecting rebinding + untokened callers.
- contacts_provider_blind_sqli_oracle, with drozer, send boolean/time-based
selectionclauses to the contacts-style provider and confirm a blind-SQLi oracle leaks rows the caller shouldn’t see. - incoming_call_metadata_missing_authorization, from an unprivileged app read/observe incoming-call metadata (number/state) via the exported surface with no permission check and confirm it is disclosed.
- zero_click_call_media_parse_sink, deliver a crafted call/media payload that reaches the parser with no user interaction and confirm it is parsed unsafely (crash / state confusion) at the zero-click sink.
- dynamic_broadcast_receiver_exposure, from a co-resident app, send a crafted broadcast to a receiver registered at runtime without
RECEIVER_NOT_EXPORTED/ a signature permission and confirm the sensitive action fires; verify the secure build registers not-exported and drops it. - privileged_service_binding_exposure,
bindService()from an untrusted package and call a privileged Binder method with no caller check; verify the secure build validates caller identity / a signature permission before returning a usable binder. - activity_task_stack_hijacking, launch a malicious Activity that spoofs the victim’s
taskAffinity(StrandHogg-style) and confirm it appears atop the trusted task; verify the secure build uses a unique affinity and disallows reparenting so it lands in its own task. - activity_alias_exposure, launch a protected Activity through an
<activity-alias>that isexported=true/ lacks the target permission; verify the secure alias echoes the target’s protection and refuses the external caller. - platform_version_security_fallback, run on an OS below the feature threshold and confirm the
if (SDK_INT >= X)guard silently drops to an insecure path (no hardware key backing); verify the secure gate fails closed on the unsupported OS. - default_role_holder_confusion, register a co-resident app for the role intent-filter (browser/dialer/SMS/wallet), confirm the app delegates a secret to whatever
resolveActivity()returns; verify the secure build checks the actual RoleManager holder and pins package + signature. - persistable_uri_grant_abuse, send an exported component a
content://URI withFLAG_GRANT_PERSISTABLE_URI_PERMISSION, confirm it callstakePersistableUriPermission()and the grant survives revocation while the provider swaps data; verify the secure build never persists untrusted grants. - clipdata_uri_grant_leakage, fire an implicit Intent whose
ClipDatacarries a privatecontent://URI +FLAG_GRANT_READ_URI_PERMISSIONand confirm a co-resident resolver can read the private data; verify the secure build sends explicit intents and never grants on untrusted-resolver ClipData. - file_descriptor_capability_leakage, bind the service and receive a
ParcelFileDescriptorfor a sensitive DB the caller couldn’t open by path; verify the secure build validates the caller and only returns a read-only FD to a narrowly-scoped non-sensitive resource. - ordered_broadcast_result_injection, register a higher-priority receiver that rewrites the result via
setResultData()/abortBroadcast()and confirm the app trusts the poisoned result; verify the secure build guards the broadcast with a signature permission and never trusts ordered-broadcast results for security decisions. - remoteviews_widget_action_injection, supply attacker widget-config extras that populate a RemoteViews action
PendingIntentand confirm tapping the widget runs a privileged transfer with attacker params; verify the secure build binds only immutable explicit intents and re-auths destructive ops. - notification_action_authorization_bypass, trigger a notification action (Android trampoline receiver→activity / iOS UNNotificationAction) that approves a transfer with no fresh auth; verify the secure build routes every surface through the same authorization check and re-auths destructive actions.
- custom_signature_permission_squatting, protect an IPC component with a
normal-level custom permission (or define the permission name first from a malicious app) and confirm the guard is trivially held; verify the secure build usessignatureprotection and checks the caller’s signing identity. - android_capability_composition_chain, trigger the notification action (or send the broadcast directly) as an untrusted caller and confirm the mutable PendingIntent → exported receiver → bound Binder service → transfer chain runs the transfer without ever re-checking the original caller; verify the secure build propagates + re-authorizes the original caller at the sink and uses immutable/explicit intents + per-method authorization.
Code Quality & Build Config
- debuggable_release_build, confirm
debuggable=truein the release APK. - no_obfuscation, confirm readable symbols with jadx/
nm. - verbose_error_handling, trigger an error path (bad input, forced failure) and confirm the response/UI/log leaks a stack trace, SQL, or internal path instead of a generic message.
- vulnerable_dependencies, run osv-scanner / dependency-check.
- native_code_memory_bugs, analyze the native lib in Ghidra; trigger the overflow.
Insufficient Resilience
- root_jailbreak_detection_bypass, bypass with objection/Frida.
- anti_debugging_bypass, patch out the debugger check.
- anti_tampering_integrity_bypass, modify the APK and confirm it runs.
- emulator_detection_bypass, spoof build props and bypass.
- frida_detection_bypass, disable the Frida string check.
- toctou_race_condition, win the check-to-use race.
- malware_detection_absent, install a known-bad/sideloaded companion and confirm the app performs no on-device threat check before handling secrets.
- device_attestation_absent, confirm the server accepts requests with no hardware key-attestation / DeviceCheck evidence, so a rooted/emulated device is trusted.
- app_attestation_absent, MITM the app’s API and confirm no app attestation (Play Integrity / App Attest) token is required, so a repackaged/emulated client is served normally.
- virtualization_detection_absent, run inside an app-cloner / work- profile / virtual space and confirm the app runs with no detection of the virtualized container.
Supply Chain (OWASP Mobile M2)
- malicious_third_party_sdk, confirm exfiltration under mitmproxy.
- typosquatted_dependency, review pubspec for the lookalike name.
- unsigned_unverified_build_artifact, verify with
apksignerand confirm the update path skips signature/checksum checks. - insecure_firebase_cloud_config, extract the Firebase/cloud URL + keys with jadx/
stringsand confirm an unauthenticated read returns other users’ data (curl / mitmproxy). - sbom_missing_or_stale, confirm the build produces no Software Bill of Materials; generate one (e.g. CycloneDX) and cross-reference bundled SDK versions against advisories to reveal the components that were invisible.
- silent_sdk_auto_update, under mitmproxy, serve a modified remote “SDK behavior” payload and confirm it is applied at runtime with no signature/checksum check, changing app behavior post-install (SpinOK-style).
- dependency_confusion, confirm an internal/private package name can be resolved from a public registry (pubspec/CocoaPods/SPM), so a higher public version would be pulled over the trusted private one; confirm scoped/pinned resolution prevents it (iOS dependency-management research class).
- sdk_exported_component_redirection, with drozer/adb, deliver a nested “forward” intent to a bundled SDK’s exported component and confirm it redirects to a private component (leaking credentials) with the host app’s privileges (EngageLab SDK class); confirm the allowlisted handler refuses.
Privacy (OWASP Mobile M6)
- missing_consent_before_data_access, confirm data access with no consent screen.
- pii_in_analytics_events, capture analytics events under mitmproxy.
- installed_app_enumeration, confirm the app probes a broad scheme/package list (iOS
canOpenURL/ AndroidqueryIntentActivities) and builds an installed-app fingerprint with no functional need; verify the secure build checks only its one declared scheme (iOS CVE-2026-20641 class). - cross_app_browser_history_access, read browsing history belonging to another app / the system browser with no consent; verify the secure build requires explicit consent and scoping (iOS CVE-2026-20656 Safari-history class).
- notification_alternate_surface_disclosure, trigger a notification redacted on the lock screen and confirm its full content renders on a secondary surface (DeX/desktop mode, widget, companion display); verify the secure build applies the same redaction policy on every unauthenticated surface (Samsung DeX CVE-2026-21006 class).
- lock_state_confusion_data_exposure, while the device is LOCKED, reach sensitive content/action through an accessibility / notification / widget / VoiceOver path that never re-checks the keyguard; verify the secure build re-checks lock state and redacts (iOS CVE-2026-20645 / CVE-2026-20661 class).
- privacy_control_alternate_path_bypass, read protected data through an alternate path (a different API, a shared app-group container, a cached copy) that sidesteps the consent gate; verify the secure build funnels all reads through the single consent-checked accessor (iOS CVE-2026-20606 class).
Input Validation (OWASP Mobile M4)
- unsafe_deserialization, craft a malicious serialized payload.
- unvalidated_intent_extras, send crafted extras with drozer/adb.
- unsafe_media_decoding, feed a crafted image (spoofed huge dimensions / decompression bomb / unexpected format) and confirm the app decodes it with no size/type/dimension validation (Samsung CVE-2025-21043 class); confirm the safe decoder rejects it on caps + format allowlist.
- deeplink_regex_dos, send a crafted deep link that triggers catastrophic regex backtracking in link parsing and confirm the app freezes/hangs (Mattermost CVE-2024-3872 class); confirm the linear/anchored parser stays responsive.
- protected_data_access_via_input_validation, send an evasive identifier (encoded /
../ case / unicode variant such asusers/./admin/%2E%2E/admin/SSN) that slips a protected id past a naive deny check and returns protected data; verify the secure build canonicalizes FIRST and checks the canonical form (Apple protected-data-via-input-sanitization CVE-2026-43714 class).
AI/ML (OWASP LLM/GenAI Top 10)
- prompt_injection_indirect, encode hidden instructions in a scanned QR/image/file and confirm the assistant obeys them.
- insecure_output_handling, confirm LLM output is rendered/executed unsanitized.
- excessive_agent_agency, confirm a tool call fires with no confirmation.
- hardcoded_llm_api_keys,
strings/jadx the binary and recover the key. - insecure_ondevice_model_storage, locate and swap the model file.
- unverified_model_supply_chain, MITM the model update and serve a tampered model with no checksum failure.
- unbounded_ai_resource_consumption, script rapid AI calls and confirm no rate limiting.
- rag_vector_store_poisoning, ingest a poisoned document, then run an unrelated query and confirm the poisoned entry is retrieved and obeyed.
- hidden_context_exposure, confirm private/other-tenant context is surfaced to the model/user (no context partitioning).
- ondevice_model_extraction, pull the on-device model file and confirm the weights are extractable (unencrypted/unsigned).
- unicode_invisible_prompt_injection, craft text with zero-width / RTL-override characters and confirm the assistant obeys the hidden instruction (input not sanitized).
Agentic AI (OWASP Agentic Top 10)
- agent_memory_poisoning, plant an instruction in the agent’s persistent memory and confirm it re-fires in a later session after reset.
- mcp_tool_poisoning, connect a tool/MCP server whose description carries hidden directives and confirm the agent obeys them during planning.
- agent_tool_confused_deputy, cause the agent to reuse the app’s ambient permission/credential for an unauthorized action with no re-auth.
- insecure_inter_agent_comms, spoof a message between sub-agents and confirm the receiver acts on the unauthenticated message.
- mcp_open_url_arbitrary_intent, via prompt injection, drive the agent’s
mobile_open_urlMCP tool to a dangerous scheme (tel:,sms:,content://,intent://) and confirm it is dispatched tostartActivity()with no allowlist; verify the secure build allows only http/https and requires user confirmation (Mobile MCP CVE-2026-35394 class).
AI + Mobile (LLM x IPC / WebView)
- untrusted_mobile_input_to_llm, deliver a prompt-injection payload over a mobile trust boundary (deep-link param, clipboard, scanned QR, notification) and confirm it is concatenated into the assistant prompt and obeyed; verify the secure build treats it as quoted data (Monica CVE-2024-48142 class).
- ai_output_to_webview_xss, steer the model to emit HTML/JS, confirm it executes when rendered into the WebView unescaped, and that the secure build escapes/sanitizes it (FAQ-Bot CVE-2025-63639 / ZOLL ePCR CVE-2025-12699 class).
- ai_output_to_intent_url, steer the model to emit a URL/intent and confirm it is launched with no allowlist/confirmation; verify the secure build allowlists + confirms first.
- ai_output_command_tool_injection, steer the model to emit a tool/command call and confirm it executes with app privileges before any validation; verify the secure build uses an allowlisted tool registry with argument validation (Microsoft 365 Copilot iOS/Android CVE-2026-26133 class).
- accessibility_tree_prompt_injection, plant imperative text in an on-screen/a11y node (e.g. “IGNORE PREVIOUS INSTRUCTIONS…”) and confirm the agent, which builds its prompt from the accessibility tree, obeys it and takes an unauthorized action; verify the secure build treats UI/a11y text as quoted untrusted data and ignores it (Android Accessibility mobile-agent injection research).
Native / WebView Bridge (JS <-> Native)
- js_bridge_callback_id_injection, from web content, post a bridge message naming another plugin’s
callbackIdand confirm you receive that plugin’s native result (Camera/Contacts/Files/Geolocation); verify the secure build validates the callback id (regex + plugin ownership) and rejects it (Cordova InAppBrowser iOS CVE-2026-47430 class). - crossorigin_iframe_to_native_bridge, deliver a bridge message from a cross-origin iframe and confirm the handler acts on it and returns the access/session token; verify the secure build requires
isMainFrameand a trusted origin and blocks it (Home Assistant Companion CVE-2026-44698 class, AndroidaddJavascriptInterface/ iOSWKUserContentController). - js_bridge_exposes_privileged_api, from an arbitrary loaded page, call a bridge method that returns an auth token / reads a file (or reaches camera/location) and confirm it succeeds with no gate; verify the secure build enforces an origin allowlist + capability check.
- qr_nfc_to_privileged_action, feed a QR/NFC payload from an untrusted caller and confirm the named automation/action fires with no user confirmation; verify the secure build requires a trusted source and an explicit confirmation (Home Assistant Companion GHSA NFC/QR class).
- exported_broadcast_receiver_spoof, send a broadcast from a
com.evil.*package with spoofed extras (e.g. device location) and confirm the app treats it as authoritative; verify the secure build checks the sender package / signature-level permission (Home Assistant Companion GHSA location-spoof class). - webview_origin_confusion_ipc, invoke a local-only privileged IPC command from a remote origin (e.g.
https://tauri.localhost.evil.com) and confirm the loose origin classifier treats it as local and executes it; verify the secure build compares the canonical origin (scheme+host+port) exactly and rejects the remote page (Tauri WebView IPC origin confusion CVE-2026-42184 class). - webview_js_injection_ssl_bypass, with the accept-all TLS handler, MITM the WebView load, inject
<script>, and confirm a token is exfiltrated / a privileged action fires; verify the secure build validates the certificate so the forged/MITM content never loads (PayRange CVE-2026-13461 class). - embedded_miniapp_secret_exposure, read the embedded Mini-App’s WebView storage over the JS↔native bridge and confirm a plaintext, replayable auth token (and a recovery secret such as a wallet mnemonic) is exposed to any origin; verify the secure build issues an origin-bound, single-use handle and never exposes the mnemonic (Telegram Mini App / TENET research class).
- webview_sop_csp_disabled, with universal file access on and no CSP, confirm a
file://page reads a cross-origin resource and runs inline script in the app origin (token read); verify the secure build disables universal access and enforces a restrictive CSP (WebKit SOP CVE-2026-20643 / CSP CVE-2026-20665 app-level analog). - shared_webview_miniapp_isolation, from mini-app A, read mini-app B’s cookie/localStorage out of the shared WebView jar; verify the secure build partitions storage per mini-app origin so A cannot see B (WeChat/Alipay cross-mini-program cookie-sharing research class).
- provider_metadata_to_filesystem_traversal, from a malicious ContentProvider return a DISPLAY_NAME of
../../shared_prefs/xand confirm the file-picker plugin writes/reads outside its cache root while the app only called an innocentpick(); verify the secure build takes the basename / canonicalizes and confines under the cache root (Flutter file_picker CVE-2026-38093 plugin-boundary class). - webview_cleartext_mixed_content_downgrade, with cleartext allowed and mixed-content set to ALWAYS_ALLOW, load an
http://(or mixed) page under mitmproxy, inject a script, and confirm it runs / a subresource downgrades HTTPS→HTTP; verify the secure build blocks cleartext and sets mixed-content to BLOCK so the load is refused (USENIX Security 2026 HTTP-in-WebView study). - webview_safe_browsing_disabled, disable Safe Browsing (
setSafeBrowsingEnabled(false)/ manifestEnableSafeBrowsing=false), navigate to a known phishing/malware URL, and confirm it loads with no interstitial; verify the secure build keeps Safe Browsing on and blocks the bad URL while allowing benign ones (MASTG-TEST-0399). - webview_remote_debugging_enabled, with
setWebContentsDebuggingEnabled(true)in a release build, attach chrome://inspect and read the web-context session token; verify the secure build disables debugging in release builds (MASTG-TEST-0227). - webview_url_loading_policy_confusion, feed the URL-policy handler (
shouldOverrideUrlLoading/decidePolicyForNavigationAction) crafted URLs (javascript:,file:, look-alike subdomain, host-in-query) and confirm the naivecontains-style check loads them; verify the secure handler canonicalizes + allowlists scheme AND exact host (MASTG-TEST-0332).
Privileged System-Provider Activation
- privileged_provider_activation_abuse, enable a system provider (accessibility / notification-listener / VPN / IME / phone-account / MediaProjection / credential-provider) with the confirming tap obscured by an overlay, then invoke the granted capability on an untrusted caller’s behalf; verify the secure build refuses an obscured/unconfirmed enablement and re-checks the caller on invoke (Android tapjack-to-enable CVE-2023-20913 class).
- mediaprojection_screencapture_authorization_bypass, start screen capture with a reused/forwarded/forged projection token and confirm recording begins; verify the secure build requires a single-use, unexpired token bound to the package that obtained consent (Android MediaProjection CVE-2025-32322 class).
- custom_keyboard_input_interception, type into a secure field in another app and confirm the custom keyboard / IME logs and exfiltrates the keystrokes (passwords/OTPs); verify the secure build never logs/transmits for secure fields and runs network-isolated (IME provider-privilege class).
- privileged_input_provider_injection, from an untrusted caller, inject synthetic key/motion events into the default IME and confirm they drive a sensitive action (e.g. auto-confirm a payment) in another app; verify the secure build refuses callers lacking the injection permission (Android IME event-injection CVE-2025-26450 class).
- companion_device_pairing_confusion, pair a spoofed/low-trust companion device and request a high-privilege capability (e.g. unlock door); confirm “paired” is treated as “authorized”; verify the secure build binds each capability to a per-capability trust check (CompanionDeviceManager class).
- device_policy_mdm_capability_abuse, from an untrusted caller, apply a device-wide policy (wipe / weaken password quality) and confirm it applies; verify the secure build requires the caller to be the active admin and validates the parameter (DevicePolicyManagerService CVE-2025-48553 class).
- vpn_provider_trust_anchor_abuse, connect the VPN tunnel to a rogue endpoint with an untrusted chain / mismatched hostname / user-installed CA and confirm it establishes (MITM possible); verify the secure build validates the tunnel trust anchor and refuses it (Prisma Access CVE-2026-0248 class).
- notification_intelligence_ai_processing, post a notification whose body carries an injected instruction and confirm the notification-intelligence AI obeys it (leaks the OTP / fires a smart action); verify the secure build redacts sensitive fields and treats notification text as untrusted data.
- assist_screen_context_ai_exposure, share the current screen (with a visible secret + an injected instruction) to the assistant and confirm the secret is shared and the assistant acts on the instruction; verify the secure build opts sensitive views out and treats captured text as data.