Skip to content

OWASP mapping

Every check Mobile Security runs is tagged with one OWASP Mobile Top 10 (2024) category, M1 through M10. The OWASP coverage strip on the Scan screen rolls findings up per category — each category takes the worst status of its checks (FAIL beats REVIEW beats PASS), and “X/Y categories passing” counts the ones where every applicable check passed.

There are 30 checks across the ten categories. Here’s the full map.

Secrets that ship inside the app or get committed to source control.

CheckSeverityWhat it looks for
Hardcoded secrets in Dart sourceHighAPI keys, tokens, private keys, password/secret literals in lib/ (values redacted).
Secret files committed to gitHighkey.properties, .env, keystores (.jks/.keystore/.p12/.mobileprovision) tracked in git.
Google/Maps API key must be restrictedLowA store-issued AIza… key that ships by design — confirm it’s restricted by package + SHA-1 + API.

Vulnerable or unaudited dependencies. Also see the SBOM and OSV/CVE lookup in Features.

CheckSeverityWhat it looks for
Outdated / vulnerable dependenciesMediumRuns dart pub audit and reports known advisories.

M3 · Insecure Authentication/Authorization

Section titled “M3 · Insecure Authentication/Authorization”

Auth flows that can be intercepted or spoofed at the OS link layer.

CheckSeverityWhat it looks for
Deep-link / App Link not verifiedLowhttps deep links without android:autoVerify="true", or custom-scheme links that can be hijacked.

M4 · Insufficient Input/Output Validation

Section titled “M4 · Insufficient Input/Output Validation”

Untrusted input reaching WebViews, local SQL, biometrics, or the touch layer.

CheckSeverityWhat it looks for
WebView JavaScript / file access misconfigMediumUnrestricted JS, a JavascriptChannel, or file access on a WebView.
SQL injection in local database queryMediumInterpolated strings in sqflite rawQuery/rawInsert/… instead of ? placeholders.
Weak biometric / local-auth configurationMediumlocal_auth without biometricOnly + stickyAuth, or biometric success trusted with no server binding.
No tapjacking / overlay protectionLowSensitive screens without filterTouchesWhenObscured overlay guards.

Traffic that can be read or rewritten on the network.

CheckSeverityWhat it looks for
Cleartext (HTTP) traffic allowedMediumusesCleartextTraffic="true" or unset in the Android manifest.
iOS App Transport Security disabledMediumNSAllowsArbitraryLoads=true in Info.plist.
No SSL/certificate pinningMediumAn HTTP client with no pinning (defense-in-depth gap).
Network Security Config permits cleartext / user CAsMediumcleartextTrafficPermitted="true" or trusting user-installed CAs.
TLS certificate validation disabledHighA badCertificateCallback/onBadCertificate that returns true.

PII leaking through logs, replay SDKs, the keyboard, or over-broad permissions.

CheckSeverityWhat it looks for
Session-replay SDK without field maskingMediumA replay SDK (Clarity/Sentry/Smartlook/FullStory) capturing card/CVV/password fields unmasked.
Sensitive data written to logsMediumprint/log of a token, password, secret, or API key.
Sensitive fields leak via keyboard cache / suggestionsLowPassword/CVV/OTP fields without enableSuggestions:false + autocorrect:false.
Excessive dangerous permissionsLowFour or more dangerous permissions (SMS, contacts, location, storage, camera…).
No screenshot / screen-recording blockLowNo FLAG_SECURE on sensitive screens.

Missing runtime and reverse-engineering defenses.

CheckSeverityWhat it looks for
No root / jailbreak detectionMediumNo jailbreak/root package wired at boot.
No anti-debuggingLowNo native anti-debug bridge (TracerPid / P_TRACED checks).
No code obfuscation / shrinkingLowNo minifyEnabled/ProGuard and no Dart --obfuscate.

Release builds and components shipped with insecure defaults.

CheckSeverityWhat it looks for
Release signed with debug certificateInfoRelease not wired to a key.properties signing config.
Release build debuggableMediumdebuggable true in the release build type.
Exported Android components without permissionMediumExported activities/services/receivers with no android:permission guard.

Sensitive data left readable at rest.

CheckSeverityWhat it looks for
Session token / PII stored unencryptedHighTokens/PII written to GetStorage/SharedPreferences instead of secure storage.
Android allowBackup enabledMediumallowBackup true or unset — data extractable via adb backup.
Sensitive value copied to the clipboardLowClipboard.setData with a password, OTP, token, or card value.

Broken ciphers and predictable randomness.

CheckSeverityWhat it looks for
Weak / broken cryptographyMediumMD5, SHA1, DES, RC4, or AES-ECB usage.
Insecure randomness for tokens / OTPLowPlain Random() near tokens/OTP/nonces/salts (should be Random.secure()).