Back to skill

Security audit

Audit App Store Readiness

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent local App Store readiness audit skill with no hidden exfiltration or persistence, though users should be careful with optional commands that write files or download tooling.

Install only if you are comfortable with a local audit script reading repository metadata and filenames. Use the default read-only command first, keep --json to a simple repo-local filename such as audit.json, and avoid the optional npx Expo commands unless you trust the package source or run a pinned/local version.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T08 · Insecure Dependencies

Warning
Location
references/expo.md:28
Finding

Unpinned npx Commands May Download and Execute Untrusted Package Code

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/audit.mjs:930
Finding

Unrestricted JSON Output Path Permits Overwriting Files Outside the Repository

Content
View full analysis
Remediation
View remediation
/audit-reports/`. - If external output is intentionally supported, require explicit confirmation and document that it can replace an existing file. - Update the Skill documentation to distinguish the default read-only audit from the optional report-file write. ]]>
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (60)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 58)May include surrounding context.

md
Prefer scripted detection (`audit.mjs`). If doing manually:

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 134)May include surrounding context.

md
Prefer scripted detection (`audit.mjs`). If doing manually:

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/audit.mjs (reported line 527)May include surrounding context.

js
status: "FAIL",
      title: "Potential secret/signing artifacts tracked in repo",
      evidence: [...secrets.bad, ...secrets.sshKeys].slice(0, 50).join("\n"),
      remediation: "Remove these files from the repo history and rotate any compromised credentials. Use keychain/CI secrets instead.",
    });
  } else if (secrets.envFiles.length) {
    checks.push({

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/audit.mjs (reported line 529)May include surrounding context.

js
evidence: [...secrets.bad, ...secrets.sshKeys].slice(0, 50).join("\n"),
      remediation: "Remove these files from the repo history and rotate any compromised credentials. Use keychain/CI secrets instead.",
    });
  } else if (secrets.envFiles.length) {
    checks.push({
      id: "secrets-env",
      status: "WARN",

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/audit.mjs (reported line 534)May include surrounding context.

js
evidence: [...secrets.bad, ...secrets.sshKeys].slice(0, 50).join("\n"),
      remediation: "Remove these files from the repo history and rotate any compromised credentials. Use keychain/CI secrets instead.",
    });
  } else if (secrets.envFiles.length) {
    checks.push({
      id: "secrets-env",
      status: "WARN",

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/audit.mjs (reported line 533)May include surrounding context.

js
checks.push({
      id: "secrets-env",
      status: "WARN",
      title: "Possible .env files tracked in repo",
      evidence: secrets.envFiles.slice(0, 50).join("\n"),
      remediation: "Ensure .env files contain no secrets, or remove from git and document a template (.env.example).",
    });

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/audit.mjs (reported line 535)May include surrounding context.

js
checks.push({
      id: "secrets-env",
      status: "WARN",
      title: "Possible .env files tracked in repo",
      evidence: secrets.envFiles.slice(0, 50).join("\n"),
      remediation: "Ensure .env files contain no secrets, or remove from git and document a template (.env.example).",
    });

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/audit.mjs (reported line 542)May include surrounding context.

js
checks.push({
      id: "secrets-env",
      status: "WARN",
      title: "Possible .env files tracked in repo",
      evidence: secrets.envFiles.slice(0, 50).join("\n"),
      remediation: "Ensure .env files contain no secrets, or remove from git and document a template (.env.example).",
    });

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
82% confidence
Finding

The skill invokes executable commands (node ..., xcodebuild ...) and contemplates file modification via apply_patch, but the manifest does not declare an explicit tool scope such as permissions or allowed-tools. That creates an authorization ambiguity where an agent may have broader-than-intended access to execution or environment capabilities, increasing the chance of unsafe command use or privilege creep.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/expo.md (reported line 17)May include surrounding context.

md
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 145)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 152)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 173)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 233)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 321)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 455)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 456)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 457)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 458)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 548)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 549)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 552)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 553)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 556)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/audit.mjs (reported line 567)May include surrounding context.

js
## Common compliance pitfalls
- Missing permission strings when using Expo modules:
  - Expo modules often require you to set usage strings via config plugins or `expo.ios.infoPlist`.
- Tracking:
  - If using tracking/ad SDKs or `expo-tracking-transparency`, ensure `NSUserTrackingUsageDescription` and ATT flow.
- Native modules / prebuild:

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/audit.mjs:95