§ Example report
owasp.sat.agoat
v1.0
This is a deliberately-vulnerable demo app. Run the same 88 analyzers on your release APK — your first scan is free.
Scan your app — free, no cardSeverity breakdown
2 crit 10 high 25 med 3 low 0 info
Critical 2
High 10
Medium 25
Low 3
Info 0
False positives 0
Scan metadata
Package
owasp.sat.agoat
Version
1.0
Size
6.8 MB
SHA-256
3e6f6b538b82874dd94c0d8cdadd69ba54d49b59d2c7eb055073892e8a4fc0e0
Findings
85
Started
Sep 20, 2026
2:47:05 AM
Finished
Sep 20, 2026
2:48:58 AM
Duration
1m 53s
Sandbox image
atomic-scanner-sandbox:dev
OWASP Mobile Top 10 (2024) — coverage
Click a category to filter the findings list.
Vulnerabilities 40
Sev Title OWASP / MASVS Plugin Description
critical
AWS access key ID in dex#1:strings
M1 MASVS-AUTH
auth.hardcoded_credentials
`dex#1:strings` contains a value matching the pattern for AWS access key ID. It is a string literal in compiled DEX bytecode (Java / Kotlin source). DEX strings are extracted in seconds with `apktool` / `baksmali` — the bytecode form does not hide them. Anyone with the APK has this credential.
critical
WebView.setAllowUniversalAccessFromFileURLs(true) in owasp.sat.agoat.InputValidationsWebViewURLActivity
M8 MASVS-PLATFORM
platform.webview
`void owasp.sat.agoat.InputValidationsWebViewURLActivity.onCreate$lambda$0(WebView, EditText, View)` calls `WebSettings.setAllowUniversalAccessFromFileURLs(true)` (or `WebView.setAllowUniversalAccessFromFileURLs(true)`). Bridges the SOP entirely from `file://` to ANY origin. JS in a local HTML file can read `https://accounts.google.com` if the user is logged in. The single most dangerous WebView setting.
M4 MASVS-CODE
code.sql_injection
2 instances — click to expand
high
Application is debuggable
M7 MASVS-CODE
manifest.security_attributes
`android:debuggable="true"` is set on `<application>`. Debug builds expose JDWP, allow attaching a debugger to any process, and bypass platform tamper-detection paths — a release APK in this state is trivially modifiable on any unrooted device.
high
BiometricPrompt.authenticate is event-bound in owasp.sat.agoat.BioMetricAuthActivity
M3 MASVS-AUTH
auth.biometric_apis
`void owasp.sat.agoat.BioMetricAuthActivity.onCreate$lambda$0(BioMetricAuthActivity, View)` calls the EVENT-BOUND `BiometricPrompt.authenticate(...)` overload — confirmed from the callsite's target descriptor, which carries no `CryptoObject`. The result is purely a success-callback fire, not a key-unlock: an attacker who can hook the success path on a rooted device bypasses the check entirely. The result-bound overload takes a `CryptoObject` (wrapping a `Cipher`, `Mac`, or `Signature` whose key requires biometric auth to unlock), which this call does not.
high
Cleartext traffic permitted at base config
M5 MASVS-NETWORK
network.nsc
`<base-config cleartextTrafficPermitted="true">` permits unencrypted HTTP for any domain that doesn't have a more specific override. Any host the app talks to over HTTP is observable and modifiable on the network path.
high
Hardcoded AWS secret access key in owasp.sat.agoat.CloudServicesActivity
M1 MASVS-AUTH
auth.instance_field_constants
The field `aws_secret_access_key` in `owasp.sat.agoat.CloudServicesActivity` is initialised in the constructor with a hardcoded AWS secret access key `OviCwsFNWeoCSDKl3ZoD8j4BPnc1kCsfV+lOABCw`. The value is baked into the DEX and extractable by anyone with the APK (`apktool` + `grep`); combined with the app's access-key ID it grants direct programmatic access to the AWS account with whatever IAM permissions that key carries (CWE-798: use of hard-coded credentials).
high
Signed with Android SDK debug key (CN="Android Debug")
M7 MASVS-RESILIENCE
resilience.apk_signing
The certificate's Common Name matches the Android SDK's well-known debug key. Production builds signed with this key share an identity with every other `android-debug-key`-signed app — the package signature no longer uniquely identifies your release, breaking signature-permission models, KeyStore key separation, and Play Store upload verification.
high
User-installed CAs trusted in base-config
M5 MASVS-NETWORK
network.nsc
`<trust-anchors><certificates src="user"/></trust-anchors>` in `base-config` makes the app trust any CA the user has installed on the device. Attackers and corporate MITM boxes typically install their own CAs to inspect TLS traffic; this configuration opts the app into being intercepted.
high
WebView.setAllowFileAccess(true) in owasp.sat.agoat.InputValidationsWebViewURLActivity
M8 MASVS-PLATFORM
platform.webview
`void owasp.sat.agoat.InputValidationsWebViewURLActivity.onCreate$lambda$0(WebView, EditText, View)` calls `WebSettings.setAllowFileAccess(true)` (or `WebView.setAllowFileAccess(true)`). JavaScript loaded via `file://` URIs can read other `file://` URIs (the entire app's filesystem reachable through the WebView). Pre-API 30 this was the default; modern Android defaults it off.
high
WebView.setAllowFileAccessFromFileURLs(true) in owasp.sat.agoat.InputValidationsWebViewURLActivity
M8 MASVS-PLATFORM
platform.webview
`void owasp.sat.agoat.InputValidationsWebViewURLActivity.onCreate$lambda$0(WebView, EditText, View)` calls `WebSettings.setAllowFileAccessFromFileURLs(true)` (or `WebView.setAllowFileAccessFromFileURLs(true)`). Bridges the WebView's same-origin policy across `file://` URIs — JS in one local HTML file can XHR another local file. Ostensibly useful for local single-page apps but a vector for exfiltrating local data.
M9 MASVS-STORAGE
storage.logging_pii
6 instances — click to expand
M9 MASVS-STORAGE
storage.insecure_storage
6 instances — click to expand
M4 MASVS-CODE
code.native_bridge
2 instances — click to expand
M4 MASVS-PLATFORM
platform.deep_link_input
2 instances — click to expand
medium
BiometricPrompt allows fallback in owasp.sat.agoat.BioMetricAuthActivity
M3 MASVS-AUTH
auth.biometric_apis
`void owasp.sat.agoat.BioMetricAuthActivity.onCreate(Bundle)` calls `setNegativeButtonText`, which on `BiometricPrompt` offers the user a fallback path out of the biometric ceremony (typically a PIN/pattern entry, or a `cancel` that lets the app fall back to a plaintext flow). On many apps the fallback drops the cryptographic binding entirely — the fingerprint check becomes a UX nicety rather than a security control.
medium
Exported activity without permission: owasp.sat.agoat.AccessControl1ViewActivity
M8 MASVS-PLATFORM
manifest.security_attributes
The activity `owasp.sat.agoat.AccessControl1ViewActivity` is exported (or implicitly exported via its intent-filter) and declares no `android:permission` to gate access. Any other app on the device can launch / bind to / call into it without consent.
medium
Exported provider without permission: owasp.sat.agoat.ContentProviderActivity
M8 MASVS-PLATFORM
manifest.security_attributes
The provider `owasp.sat.agoat.ContentProviderActivity` is exported (or implicitly exported via its intent-filter) and declares no `android:permission` to gate access. Any other app on the device can launch / bind to / call into it without consent.
medium
Exported receiver without permission: owasp.sat.agoat.ShowDataReceiver
M8 MASVS-PLATFORM
manifest.security_attributes
The receiver `owasp.sat.agoat.ShowDataReceiver` is exported (or implicitly exported via its intent-filter) and declares no `android:permission` to gate access. Any other app on the device can launch / bind to / call into it without consent.
medium
Exported service without permission: owasp.sat.agoat.DownloadInvoiceService
M8 MASVS-PLATFORM
manifest.security_attributes
The service `owasp.sat.agoat.DownloadInvoiceService` is exported (or implicitly exported via its intent-filter) and declares no `android:permission` to gate access. Any other app on the device can launch / bind to / call into it without consent.
medium
Sensitive activity 'InsecureStorageSDCardActivity' has no FLAG_SECURE (card entry)
M9 MASVS-PLATFORM
platform.flag_secure
Activity `owasp.sat.agoat.InsecureStorageSDCardActivity` (matched the 'card entry' naming pattern) does not set `WindowManager.LayoutParams.FLAG_SECURE` — neither directly nor via any class in its superclass chain (`InsecureStorageSDCardActivity -> AppCompatActivity -> FragmentActivity -> ComponentActivity -> ComponentActivity -> Activity`). The screen will be captured by OS screenshots, retained in the recents thumbnail cache (so another app, or anyone with momentary device access, can see the last frame after the user backgrounds the app), and recordable by any `MediaProjection`-based screen recorder. For a screen handling card entry, that exposure is a credible data-leak path.
medium
Untrusted user input reaches WebView.loadUrl in owasp.sat.agoat.InputValidationsWebViewURLActivity
M4 MASVS-PLATFORM
platform.deep_link_input
`void owasp.sat.agoat.InputValidationsWebViewURLActivity.onCreate$lambda$0(WebView, EditText, View)` feeds `WebView.loadUrl` data the taint analyzer traces back to a user-controlled input field (`getText()` on a text widget). A value the user types (or that is injected into the field) reaching a WebView content loader — an injection primitive. Static analysis can't confirm the value is unvalidated or the component reachable; the `requires_review: true` evidence flag marks the callsite for manual triage.
medium
Weak hash algorithm `MD5` used in owasp.sat.agoat.AccessControlIssue1Activity
M10 MASVS-CRYPTO
crypto.weak_algorithms
`String owasp.sat.agoat.AccessControlIssue1Activity.hashPIN(String)` calls `MessageDigest.getInstance("MD5")`. The requested algorithm is broken — chosen-prefix collisions in seconds on commodity hardware. Static analysis cannot tell whether this code path handles security-relevant data, but the safe default is to assume it does — the cost of switching to a modern primitive is minimal compared to a single confirmed vulnerability.
medium
WebView.setAllowContentAccess(true) in owasp.sat.agoat.InputValidationsWebViewURLActivity
M8 MASVS-PLATFORM
platform.webview
`void owasp.sat.agoat.InputValidationsWebViewURLActivity.onCreate$lambda$0(WebView, EditText, View)` calls `WebSettings.setAllowContentAccess(true)` (or `WebView.setAllowContentAccess(true)`). Permits the WebView to load `content://` URIs from ContentProviders the app has access to. Less dangerous than the file-URL flags but still a privilege escalation if the WebView loads attacker-controlled HTML.
low
Auto-backup is enabled
M9 MASVS-STORAGE
manifest.security_attributes
`android:allowBackup="true"` lets `adb backup` extract the app's private data on a debug-bridged device, and (on Android <12) lets Auto Backup ship the same data to the user's Google Drive — tokens and credentials in `shared_prefs/` / `databases/` ride along. `android:fullBackupContent and dataExtractionRules` are not declared, so that backup path is unscoped and captures everything by default.
low
No anti-debug / signature-check signal found
M7 MASVS-RESILIENCE
resilience.tamper_detection
No reference to `Debug.isDebuggerConnected`, `PackageManager.checkSignatures`, or other classic tamper-detection APIs. For apps handling sensitive data MASVS-RESILIENCE expects at least one active-debugger check + a signature self-check.
low
No obfuscation detected (477 app classes inspected, 0% short-named)
M7 MASVS-RESILIENCE
resilience.obfuscation_estimate
Of 477 app-owned classes (excluding framework / AndroidX / Kotlin / Google Play / OkHttp / Retrofit / RxJava / similar curated-out packages), only 0% carry single-character simple names — the share R8 / ProGuard typically produces. Class, method, and field names are intact, which gives a reverse engineer a free map of your business logic and accelerates RE of any custom anti-tamper / crypto / licensing code shipped with the app.
Findings 9
Findings that need human review — the scanner can't confirm exploitability on its own. Severity varies: some are low-signal, others are real weaknesses worth confirming.
Sev Title OWASP / MASVS Plugin Description
M4 MASVS-CODE
code.sql_injection
3 instances — click to expand
medium
SQLiteDatabase.rawQuery called in owasp.sat.agoat.SQLinjectionActivity
M4 MASVS-CODE
code.sql_injection
`void owasp.sat.agoat.SQLinjectionActivity.onCreate$lambda$1(EditText, SQLinjectionActivity, AlertDialog.Builder, View)` calls `SQLiteDatabase.rawQuery`. SQL injection arises when the query string is built by concatenating untrusted input — the canonical case on Android being a ContentProvider override that pipes its `selection` argument directly into `rawQuery`. Confirm the runtime-built SQL operates on trusted input or uses parameter binding (`?` placeholders + `selectionArgs`).
low
Client-side gate compares user input to a hardcoded value in owasp.sat.agoat.HardCodeActivity
M8 MASVS-CODE
auth.instance_field_constants
`void owasp.sat.agoat.HardCodeActivity.onCreate$lambda$1(EditText, HardCodeActivity, TextView, AlertDialog.Builder, View)` compares user-supplied input (`getText()`) against the hardcoded field `promoCode` (= `NEW2019`) using a string-equality check. Any secret enforced this way — a promo/discount code, an unlock/debug password, a licence key — ships inside the APK and is trivially extractable and bypassable, so the gate provides no real protection (CWE-602: client-side enforcement of server-side security). The full value is shown so you can confirm it and rotate it if it is meant to be secret.
low
Credential-shaped EditText without suggestion-disabling inputType (1)
M9 MASVS-STORAGE
storage.keyboard_cache
1 `EditText` field(s) carry a credential-shaped hint or id (`password`, `pin`, `otp`, `cvv`, `ssn`, …) but their `android:inputType` doesn't include `textPassword` / `numberPassword` / `textNoSuggestions`. The IME caches typed text in its predictive dictionary and may surface those entries as auto-suggest in other apps. The fix is a one-attribute change per field.
low
Custom-scheme deep-link entry point on activity owasp.sat.agoat.AccessControl1ViewActivity: androgoat://vulnapp
M8 MASVS-PLATFORM
platform.deep_links
`owasp.sat.agoat.AccessControl1ViewActivity` declares an intent-filter for the custom scheme deep link(s) `androgoat://vulnapp`. Custom schemes are the normal way apps expose deep links, so this is not inherently a vulnerability — but each one is an externally-reachable entry point that any other app (or a web page, when the filter is BROWSABLE) can invoke with attacker-chosen parameters. Reported as attack-surface enumeration so the reviewer can confirm the component validates whatever URL / extras the deep link carries.
low
Hardcoded AWS access key ID in owasp.sat.agoat.CloudServicesActivity
M1 MASVS-AUTH
auth.instance_field_constants
The field `aws_access_key_id` in `owasp.sat.agoat.CloudServicesActivity` is initialised in the constructor with a hardcoded AWS access key ID `AKIAX56QKKOLPQ7G7ABC`. The key ID is an identifier, not a secret, so on its own it is not directly usable — but shipping it in the APK confirms an AWS integration and, paired with a leaked secret access key, completes a usable credential pair. Review whether the matching secret is also embedded or reachable.
info
WebView used but no session-data cleanup found
M8 MASVS-PLATFORM
platform.webview
This app uses a WebView (`addJavascriptInterface`, `setJavaScriptEnabled`, or `WebView.loadUrl`) but the bytecode contains no call to any WebView session-cleanup API: `WebView.clearCache`, `WebView.clearHistory`, `CookieManager.removeAllCookies`, or `WebStorage.deleteAllData`. Without explicit cleanup, the WebView's cache, browsing history, cookies, and DOM storage can persist across logout / account switch — a local attacker or a subsequent user of the device may recover session tokens or rendered sensitive content. This is a coarse, app-level absence signal: the cleanup logic may live in a helper or a third-party library this static check can't see, so verify manually.
Security posture
3 present · 5 absent · 0 partialTransport
Screen capture
Anti-tampering
Build
App inventory
What the app is — declared permissions, bundled SDKs, signing, build config. Reference, not findings.
| Permission | Risk | Status | Note |
|---|---|---|---|
| CAMERA | medium | used | an API this permission gates is referenced in code |
| READ_EXTERNAL_STORAGE | info | used | an API this permission gates is referenced in code |
| WRITE_EXTERNAL_STORAGE | info | used | an API this permission gates is referenced in code |
| Component | Kind | Version | Category | PII |
|---|---|---|---|---|
| OkHttp | library | — | — | — |
Signing
- Schemes
- v1, v2
- Key
- —
- Subject
- Android Debug
- Validity
- —
- Issues
- Signed with Android SDK debug key (CN="Android Debug")
App profile
- minSdk/target
- 19 / 33
- Minification
- none (0.0)
- Network config
- present
- Legacy storage
- —
- Native libs
- extracted: yes
- StrictMode
- yes
Other inventory (18)
- Framework: Native Android (confidence: low) code.framework_detection
- java.util.Random instantiated in kotlin.random.FallbackThreadLocalRandom.implStorage.1 crypto.insecure_random
- java.util.Random instantiated in kotlin.random.KotlinRandom crypto.insecure_random
- 2 java.lang.Math.random() calls in void androidx.transition.Explode.calculateOut(View, Rect, int[]) crypto.insecure_random
- java.util.Random instantiated in okhttp3.OkHttpClient crypto.insecure_random
- java.util.Random instantiated in androidx.profileinstaller.ProfileInstallerInitializer crypto.insecure_random
- java.util.Random instantiated in com.google.android.material.color.utilities.QuantizerWsmeans crypto.insecure_random
- Cleartext (http://) URL literals in DEX strings (1) network.cleartext_urls
- WebView.setJavaScriptEnabled(true) in owasp.sat.agoat.XSSActivity platform.webview
- WebView.setJavaScriptEnabled(true) in owasp.sat.agoat.InputValidationsWebViewURLActivity platform.webview
- WebView.setJavaScriptEnabled(true) in owasp.sat.agoat.QRCodeXSSActivity platform.webview
- External-storage API used: Environment.getExternalStorageDirectory in androidx.core.content.FileProvider storage.external_storage_apis
- External-storage state query: Environment.getExternalStorageState in androidx.core.os.EnvironmentCompat.Api21Impl storage.external_storage_apis
- External-storage state query: Environment.getExternalStorageState in owasp.sat.agoat.InsecureStorageSDCardActivity storage.external_storage_apis
- App-scoped external-storage API used: Context.getExternalFilesDirs in androidx.core.content.ContextCompat.Api19Impl storage.external_storage_apis
- App-scoped external-storage API used: Context.getExternalCacheDirs in androidx.core.content.ContextCompat.Api19Impl storage.external_storage_apis
- App-scoped external-storage API used: Context.getExternalMediaDirs in androidx.core.content.FileProvider.Api21Impl storage.external_storage_apis
- Clipboard write in owasp.sat.agoat.ClipboardActivity platform.clipboard