# Dependency Scanning

> Scanning mobile app dependencies for known vulnerabilities — Gradle Versions, Snyk, Dependabot, CocoaPods Audit, and npm audit. Use to keep the dependency surface patched.

- Skill: `almasumdev/dependency-scanning` (Agent Skill)
- Install (CLI): `npx skillmds@latest add almasumdev/dependency-scanning`
- Raw SKILL.md: https://api.skillmd.com/api/skills/almasumdev/dependency-scanning/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Security
- Author: almasumdev (https://skillmd.com/u/almasumdev)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/almasumdev/dependency-scanning

---


# Dependency Scanning on Mobile

## Instructions

Most reported mobile CVEs live in dependencies — third-party SDKs, networking libs, image loaders, JSON parsers. A weekly cadence beats a one-off audit.

### 1. Inventory First

You can't scan what you can't see. Produce an SBOM per build:

- Android: CycloneDX Gradle plugin (`org.cyclonedx.bom`) produces `bom.json`.
- iOS: `cyclonedx-cocoapods` / `cyclonedx-swift` for SwiftPM.
- Flutter: `cyclonedx_dart` or parse `pubspec.lock`.
- React Native: `@cyclonedx/cdxgen` handles npm + native.

Archive the SBOM with the release artifact. You will want it the day a new CVE drops.

### 2. Gradle / Android

`gradle-versions-plugin` flags outdated direct dependencies:

```kotlin
// build.gradle.kts
plugins { id("com.github.ben-manes.versions") version "0.51.0" }

// Run: ./gradlew dependencyUpdates -Drevision=release
```

For CVEs, **OWASP Dependency-Check** or **Snyk**:

```kotlin
plugins { id("org.owasp.dependencycheck") version "11.1.0" }
dependencyCheck {
    failBuildOnCVSS = 7.0f // fail on high / critical
    suppressionFile = "config/owasp-suppressions.xml"
}
```

### 3. CocoaPods / SwiftPM

- `pod outdated` for CocoaPods outdated check.
- `bundler-audit` / custom script hitting the GitHub Security Advisory DB for CVEs.
- SwiftPM: Xcode 14+ shows a "Package Dependencies" pane; integrate Snyk / Socket for deeper checks.
- Carthage: dying, migrate.

### 4. Flutter / pub.dev

- `dart pub outdated` on every PR.
- Monitor `pubspec.lock` in review — large transitive changes often hide breaking updates.
- `pana` scores each package on health / maintenance; good signal for low-maintenance abandons.

### 5. React Native / npm

- `npm audit` / `pnpm audit` / `yarn npm audit` on every install.
- Pin via a lockfile (`package-lock.json` / `pnpm-lock.yaml`). Never `"^"`-float sensitive deps in production.
- Watch for **postinstall scripts** from dependencies — supply-chain attacks increasingly target these.
- `socket.dev` or `snyk` provides behavioral analysis (network access, file writes from a JS package).

### 6. GitHub Dependabot

Enable across platforms:

```yaml
# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: gradle
    directory: "/"
    schedule: { interval: weekly }
    groups:
      non-major: { update-types: [minor, patch] }
  - package-ecosystem: cocoapods
    directory: "/ios"
    schedule: { interval: weekly }
  - package-ecosystem: pub
    directory: "/"
    schedule: { interval: weekly }
  - package-ecosystem: npm
    directory: "/"
    schedule: { interval: weekly }
  - package-ecosystem: github-actions
    directory: "/"
    schedule: { interval: weekly }
```

Group non-major updates so you get one PR a week, not fifty.

### 7. Triage Policy

Not every HIGH CVE is exploitable in your app. Have a documented triage policy:

- **CVSS ≥ 9** or actively exploited in the wild → patch within 7 days, release out-of-band if needed.
- **CVSS 7–9** → patch within 30 days.
- **CVSS < 7** → next scheduled release.
- **Not applicable** (e.g., CVE in a code path you don't use) → document suppression with link to reasoning, review quarterly.

### 8. Transitive Dependency Attacks

The 2021–2024 wave of typosquat / account-takeover attacks on npm, PyPI, and RubyGems applies to mobile too. Defenses:

- Lockfile + integrity hashes (`--frozen-lockfile`, `pod install --deployment`).
- Block CI from installing from non-registry sources unless whitelisted.
- Review diffs on major dep bumps — not just semver; read the changelog.

### 9. Native Libraries (AAR / .framework / .xcframework)

Binary SDKs are a black box. Mitigations:

- Prefer SDKs that publish source.
- Pin versions by checksum (`sha256` in lockfile where supported).
- On major vendor upgrades, run the APK / IPA through MobSF to check for new permissions / classes.

### 10. Kotlin / Swift Version Churn

Bumping Kotlin or Swift often cascades into every dependency. Plan for this in the Gradle / Xcode upgrade issues — not every PR.

## Checklist

- [ ] An SBOM is generated per release build and archived with the artifact.
- [ ] OWASP Dependency-Check (or Snyk) fails the build on unsuppressed high/critical CVEs.
- [ ] `gradle-versions` / `pod outdated` / `dart pub outdated` / `npm audit` run on every PR.
- [ ] Dependabot is enabled for every ecosystem in the repo.
- [ ] Lockfiles are committed and CI uses `--frozen-lockfile` or equivalent.
- [ ] A triage policy with SLAs by CVSS is documented and followed.
- [ ] Binary SDKs are pinned by checksum where supported and re-scanned on upgrade.
- [ ] Suppression entries link to a rationale and have a review date.

