A security scan on every build you upload
Pro and Team (Free sees the counts; the full report, export and history are Team)
Most leaked keys and forgotten debug settings are found by someone else first: a curious tester, a client's security team, or a stranger with a decompiler. A test build is a zip file anyone with the link can download and unpack, so the moment you share it is a good moment to look inside.
AppForShare reads every .apk and .ipa at upload, in the same step as the store readiness check, and lists what it finds: a key that should never ship, app data that leaves the phone in backups, a component other apps can start, an App Transport Security exception nobody remembers adding. Each finding says where it is, why it matters and how to fix it. Nothing runs inside your app and nothing is added to it.
Example
Shop 3.2.0 (88), Android
- Summary1 to fix, 3 warnings, 2 notes
- MASVS-STORAGEStripe live secret key in assets/config.json: sk_l...9Qx2
- MASVS-STORAGEApp data is backed up (allowBackup on)
- MASVS-PLATFORM2 exported components without a permission
- MASVS-RESILIENCECode does not look shrunk or obfuscated (a hint)
- MASVS-CODEOkHttp 4.9.0 has a known vulnerability (CVE-2021-0341)
Made for
- Small teams and solo developers who have no security engineer but do not want to ship an AWS key to a client
- Agencies that hand builds to clients and want a short report to send with them
- Teams that want a check in CI that fails the pipeline when a build has something to fix
What it ends
- A Stripe or AWS key compiled into a test build and sent to 40 testers
- Running a decompiler by hand once a year, if someone remembers
- An exported debug activity or a staging ATS exception that survives into the release
- A client's security questionnaire with no record of what was checked in which build
How it works
Step 1
Upload as usual
From the dashboard, the CLI, the GitHub Action, fastlane, Gradle, Connect Expo or Connect Codemagic. The scan runs at upload; there is nothing to turn on.
Step 2
Read the Security scan card
Under the store readiness check on the build page: counts such as "1 to fix, 3 warnings, 2 notes", then each finding with its file, its MASVS category and the fix.
Step 3
Ask for a fix plan
One AI action turns the findings into ordered steps. Secrets go to the AI only as their kind and file, never the value.
Step 4
Gate the pipeline
appforshare security <build> --fail-on block exits with code 2 when something has to be fixed. The build stays uploaded.
What it looks for
Hardcoded secrets, on high confidence patterns only: AWS access key ids, Stripe live secret and restricted keys, PEM private keys, Google service account JSON, Slack tokens and webhook addresses, GitHub tokens and legacy Firebase Cloud Messaging server keys. It reads dex code, resources, assets, React Native bundles (index.android.bundle, main.jsbundle), Info.plist, the iOS main binary and Flutter compiled code. Google API keys are a note, not an error: they are meant to ship, and the fix is to restrict them to your app. Sample values such as keys with EXAMPLE in them are skipped.
Android: app data backed up without rules (allowBackup on or not set, with no dataExtractionRules or fullBackupContent), activities, services, receivers and providers exported without a permission (the launcher activity is left out), user added certificates trusted outside debug-overrides, a debuggable build, plain HTTP for every server, WebView debugging referenced in the code, a minimum API below 24, and a hint when class names in classes.dex look unshrunk, which usually means R8 did not run.
iOS: App Transport Security turned off for every domain, each exception domain with what it loosens, insecure loads allowed in web views, local symbols left in the binary, and get-task-allow in a build that is not development signed.
Libraries: a short dated table of versions with a public advisory (OkHttp, Play Core, OpenSSL, zlib and AFNetworking, checked November 8, 2026). A version is matched only when the build states it; it is never guessed.
Integrity checks: whether the app ships root, jailbreak, tamper or attestation checks such as RootBeer, freeRASP, Play Integrity, Firebase App Check, App Attest or IOSSecuritySuite. This is a note either way, because most apps do not need one.
Plain counts, not a score
Every finding has a level (to fix, warning or note) and an OWASP MASVS category: storage, cryptography, network, platform, code or resilience. The result is a count such as "1 to fix, 3 warnings". There is no percentage and no grade, because a single leaked key matters more than ten notes.
Pro and Team, and what Free sees
Free shows the counts on every build, so you know when there is something to look at. Pro and Team show every finding with where it is and how to fix it, the AI fix plan, the CLI command and the MCP tool get_security_scan for your AI coding assistant.
Team adds the full report grouped by MASVS category, an export as JSON or a printable page to send to a client or keep in an audit folder, and the history of findings across the builds of one app, with what is new and what was fixed since the build before.
In CI, the CLI and AI tools
appforshare security <build> prints the findings. Add --fail-on block to fail the job when something has to be fixed, or --fail-on warn to fail on warnings too; both exit with code 2 and leave the build uploaded. On Team, --format json or html saves the full report as a file. The CI build answer carries the counts as security on every plan, and GET /api/ci/builds/{ref}/security returns the findings.
A light check on every upload, not a full security test
Dedicated mobile application security testing tools go further: they run the app, watch its traffic, trace data through the code and, in some products, add obfuscation and runtime protection when the app is built. They are usually bought by security teams and priced per app. If you handle payments, health data or banking, you likely need one, plus a manual test.
The AppForShare scan is the other end: a static read of the file you already upload, on every build, included in the plan you have. It catches the common, costly mistakes early and gives you a record per build. It does not replace a penetration test.
Good to know
- It reads the file only. It never runs the app, so it cannot see what happens at runtime or on your server.
- It adds nothing to the app: no obfuscation, no code hardening and no runtime protection. It only reports what it finds.
- Findings and hints, not a penetration test, not a certification and not a compliance statement.
- Secrets are matched on high confidence patterns only. A key in a format it does not know is not found, and third party iOS frameworks are not scanned for secrets.
- Caps keep uploads fast: about 400 MB read per build, 256 MB per file, 800 files and 25 seconds. When a cap stops it, the report says part of the build was not read.
- Builds uploaded before November 8, 2026 show "Not scanned" until they are uploaded again. The scan is shown on the build page, so it needs an account; guest uploads do not show it.
Questions
- Do you keep the secrets you find?
- Only the kind, the file and a masked value with the first 4 and last 4 characters. The full value is never stored, logged or sent to the AI.
- Does it need an SDK or a change to my app?
- No. It reads the uploaded .ipa or .apk. An .aab is scanned as the APK made from it.
- Will it make my app pass a security review?
- No tool can promise that. It finds common mistakes early so a reviewer or a pentest spends time on the harder questions.
- Which plan do I need?
- Free shows the counts. Pro and Team show the findings, the AI fix plan, the CLI and the MCP tool. Team adds the full report, export and history.
- Does it work with Flutter and React Native builds?
- Yes. It reads React Native JavaScript bundles and Flutter compiled code for secrets. The R8 hint is for native Kotlin and Java apps only.
Read next
Try it on your own app
Free account in a minute. Pro starts with a 7 day free trial.
More features
- Builds on GitHub Actions
- Flutter builds on GitHub Actions
- Flutter facts and checks
- Connect Expo (EAS builds)
- Connect Codemagic
- Send store builds to TestFlight and Google Play
- TestFlight groups and beta review on send
- TestFlight feedback in your inbox
- iOS device registration
- Hands free device setup
- Store listing editor
- App Store submission
- Google Play releases
- TestFlight tester sync
- Tester app with notifications
- Tester groups and status
- Join links for testers
- Beta and Live channels
- Build history page
- Tasks and activity feed
- Feedback to Linear and Jira
- Release checklist, approvals and blockers
- Release page per version
- Install link controls
- Several links per build
- Retire a test build
- TestFlight and APK in one link
- Install page in 13 languages
- In-app update check
- .aab uploads
- MCP server for AI tools
- Tester feedback with screenshots
- In-app feedback link
- AI test plan for each build
- Diawi compatible upload API
- Remember my iPhone
- Install help and why it failed
- Email the install link
- Custom channel address
- Verified publisher
- Daily install email
- Zipped .app upload
- Manage link for guest uploads
- Test accounts on the install page
- Telegram notifications
- Permissions in plain words
- Reply to testers and star ratings