Product · SAST

Reads every line.
Before it ships.

Static analysis for Swift, Objective-C, Kotlin, Java, React Native, and Flutter, or straight from the compiled IPA and APK. It finds secrets, unsafe storage, weak crypto, and risky config, without running a thing.

<key>CFBundleName</key> <string>Acme Wallet</string> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> <key>UIFileSharingEnabled</key> <true/> <key>CFBundleURLTypes</key> <array> <string>acmewallet</string> </array> Plain HTTP, allowed everywhere. Documents folder, open to Finder. FIX · INFO.PLIST HIGH - NSAllowsArbitraryLoads: true + NSAllowsArbitraryLoads: false

What it reads

The things a reviewer
would circle.

  • Secrets

    Keys and tokens in the bundle

    API keys, credentials, and private URLs in code, resources, and config files.

  • Storage

    Sensitive data at rest

    Tokens and personal data in UserDefaults, SharedPreferences, SQLite, and plain files.

  • Crypto

    Crypto that only looks safe

    ECB mode, static IVs, hard-coded keys, and fast hashes used for passwords.

  • Platform config

    Settings that open doors

    ATS exceptions, exported components, debuggable builds, and backup flags.

  • WebViews and links

    Untrusted input, trusted code

    JavaScript bridges, file access, and deep links that load whatever they're handed.

  • Logging

    Things logs shouldn't know

    Tokens, emails, and health data written to the console or crash reports.

Every finding maps to OWASP MASVSSTORAGECRYPTOAUTHNETWORKPLATFORMCODEPRIVACY

Example finding

A WebView that trusts any link.

HighSASTMASVS-PLATFORM-2 · CWE-749ui/PromoActivity.kt:28

JavaScript bridge on a WebView that loads untrusted URLs

The activity loads whatever URL arrives in its intent, with a JavaScript interface attached. Any page it's pointed at can call into your wallet code.

Before
26  webView.settings.javaScriptEnabled = true
27  webView.addJavascriptInterface(WalletBridge(), "wallet")
28  webView.loadUrl(intent.getStringExtra("url")!!)

Whoever sends the link gets the bridge.

Suggested fix
26  val url = intent.getStringExtra("url")?.toUri()
27  if (url?.scheme != "https" || url.host !in TRUSTED_HOSTS) return finish()
28  webView.settings.javaScriptEnabled = true
29  webView.addJavascriptInterface(WalletBridge(), "wallet")
30  webView.loadUrl(url.toString())

Only your own pages get the bridge.

Where SAST fits

  1. 01ConnectUpload a build or link CI
  2. 02 · This pageReadSAST, DAST, and SCA
  3. 03TriageFalse positives out, ranked
  4. 04 · Early accessAttack pathsRed Agent chains findings
  5. 05FixGreen Agent writes it
  6. 06 · EnterpriseReviewPeople sign off

Fair questions.

Do you need our source code?

No. SAST can read the compiled IPA or APK. With source, findings point to exact lines and Green Agent can write the fix in place.

How noisy is it?

Every result goes through AI Triage before you see it. False positives are removed and the rest are ranked by how exploitable they are.

How long does a scan take?

Most apps finish in under 15 minutes. Very large codebases can take up to an hour. You get a notification when results are ready.

See what your code says about you.

Scan your app