Mobile security
SecureVibe — prevention-first security for AI-written code. Signed SKILL.md knowledge that makes AI coding assistants write secure code at generation time, plus a deterministic CI gate. Offline · keyless · Ed25519-signed. By ShieldNet360.
npx -y skills add ShieldNet-360/secure-vibe --skill mobile-securityAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Android and iOS hardening: exported components, ATS, keychain, certificate pinning, root/jailbreak detection
SKILL.md
7.0 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it
Mobile Application Security
Rules (for AI agents)
ALWAYS
- Android: every
<activity>,<service>,<receiver>,<provider>inAndroidManifest.xmleither hasandroid:exported="false"or explicitly declares an intent filter and is intentionally exported. As of Android 12 (API 31),android:exportedis required when an intent-filter is declared. - Android: store secrets in the Android Keystore (
KeyStore/ EncryptedSharedPreferences withMasterKey). Never in plainSharedPreferences, plain files, orBuildConfig. - iOS: store secrets in the Keychain with
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnlyor stricter. Don't store inUserDefaults, plist, or files. - iOS: keep App Transport Security (ATS) enabled in
Info.plist. If an exception is required, scope it to a specific host withNSExceptionDomains. - Validate the server's TLS certificate with certificate pinning (public
key pinning preferred) for backends you control. Use
OkHttp.CertificatePinneron Android,URLSessionDelegate didReceiveChallengeon iOS, or your framework's pinning module. - Obfuscate / shrink release builds (Android R8 / ProGuard with
proguard-rules.pro; iOS bitcode + Swift symbol stripping). Strip debug logs from release builds. - Detect rooted / jailbroken devices for high-risk apps (banking, payment,
enterprise) and reduce sensitivity (block payments, refuse to attach to
a managed profile). Use the Play Integrity API on Android and
DeviceCheck/AppAtteston iOS as the authoritative attestation.
NEVER
- Ship API keys, signing keys, or backend secrets in source / resources /
strings.xml/BuildConfig/Info.plist. Issue short-lived, device-scoped tokens from a backend instead. - Set
android:allowBackup="true"for apps that store credentials — the backed-up data is readable on developer machines. Useandroid:fullBackupContentto exclude sensitive paths. - Set
android:debuggable="true"in release builds, or<application android:networkSecurityConfig>that allows cleartext to arbitrary hosts. - Disable ATS app-wide on iOS (
NSAllowsArbitraryLoads=true). If you must weaken it, scope per-host. - Implement custom TLS / certificate handling that returns "trust all"
(
X509TrustManager.checkServerTrustedempty body,URLSessionDelegatealways-trust). This is the #1 Android security finding shipped to production. - Pass user input to
WebView.loadUrl/WKWebView.loadwithout scheme validation; never enableWebSettings.setAllowFileAccessFromFileURLs(true)orsetUniversalAccessFromFileURLs(true). - Implement biometric auth without
BiometricPrompt'ssetUserAuthenticationRequired(true)binding the key — biometric "true" alone proves nothing without a cryptographic challenge. - Log full request/response bodies including
Authorizationheaders — e.g. an OkHttpHttpLoggingInterceptorleft atLevel.BODY(orURLSession/ Alamofire debug logging) in a release build. The dump lands in Logcat / oslog, readable byadb logcaton any USB-debuggable device (no root) and by log aggregation. Gate body + header logging to debug builds and redactAuthorization/Cookie/ token / PII fields.
KNOWN FALSE POSITIVES
- Public read-only IDs (analytics public key, public DSN) embedded in the binary are not secrets; they're meant to be there.
- The default debuggable=true on debug variants is normal — the rule applies to release builds.
- Custom URL schemes (
myapp://) for OAuth callbacks are expected; ensure the corresponding intent filter is restricted and thestateparameter is verified.
Context (for humans)
Mobile security splits cleanly into what's in the binary (secrets, debug flags, exported components, pinning) and what happens at runtime (TLS trust, keychain access, biometric binding). OWASP MASVS v2 provides the authoritative testable controls; the MASTG is the procedural test guide.
AI assistants frequently generate Android code with allowBackup=true, no
ProGuard, hardcoded API keys in strings.xml, and iOS code that calls
SecCertificateCreateWithData with no verification. This skill is the
counterweight.
Verify & lock (triaging a finding)
A scanner/review hit is a candidate, not a confirmed bug. Confirm it, fix it, then lock it so it can't come back.
- Confirm it's real (probe the suspect input). For a hardcoded secret,
strings/grep -rthe built.apk/.ipa(andstrings.xml/BuildConfig/Info.plist) — real if a live API/signing/backend key is present (not a public DSN or analytics ID, which are FPs). For plaintext storage, pullSharedPreferences/files (Android) or readUserDefaults/plist/Keychain dump (iOS) on-device — real if the token/PII is readable in clear. For missing pinning / cleartext, MITM the app through a proxy — real if traffic decrypts despite an untrusted CA, orNSAllowsArbitraryLoads/cleartext-to-arbitrary-host is set. For an exported component / deep link, fire the intent (am start) or openmyapp://...from another app — real if it executes an action without the caller's permission orstate/scheme check. - Fix, then lock with a regression test (unit or integration — dev's call):
assert the secret is absent from the built bundle and that storage contains no
plaintext token (read it back, expect ciphertext/Keystore/Keychain); add a
config test asserting
NSAllowsArbitraryLoads/cleartext is disabled, pinning is configured, and the component isexported="false"(or its scheme/stateis validated). Include a benign case (a public ID is allowed; a legitimately exported activity with a guarded intent filter still passes). Commit it to CI so the guard can't be silently dropped in a later refactor.
References
checklists/android_manifest.yamlchecklists/ios_keychain_ats.yaml- OWASP MASVS v2.0.
- OWASP MASTG.
- CWE-919 — Weaknesses in Mobile Applications.
What ships with it: 3 files
7.7 KB alongside SKILL.md
checklists/
- android_manifest.yaml1.8 KB
- ios_keychain_ats.yaml1.9 KB
tests/
- corpus.json4.0 KB