Back to skill

Security audit

Google Play Store

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent Google Play publishing guide with local note-taking and documentation examples, but its release automation snippets should be hardened before use.

Install only if you are comfortable with a local ~/google-play-store/ memory folder holding non-secret app and workflow notes. Do not place keys, tokens, service-account JSON, keystores, or passwords in that folder. Treat the Fastlane and CI snippets as examples to harden before use: pin dependencies, protect and clean up secret files, and double-check any production rollout or track promotion. Do not create new developer accounts to bypass Google enforcement.

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
fastlane.md:7
Finding
Unpinned Fastlane installation creates a mutable CI supply-chain dependency<![CDATA[ ## Vulnerability Details **File Location**: `fastlane.md:7-12` and `fastlane.md:220-225` **Vulnerability Type**: Unpinned third-party dependency installation **Risk Level**: Medium ### Vulnerable Code ```bash # macOS (Homebrew) brew install fastlane # Ruby (any platform) gem install fastlane ``` The GitLab CI example repeats the unpinned installation: ```yaml script: - echo "$KEYSTORE_BASE64" | base64 -d > keystore.jks - echo "$PLAY_SERVICE_ACCOUNT" | base64 -d > service-account.json - gem install fastlane - fastlane internal ``` ### Technical Analysis The documented installation commands resolve and install the latest available Fastlane package at execution time. No reviewed version, lockfile, or integrity constraint is specified. Consequently, the code executed by the deployment workflow can change without any corresponding modification to this project. The GitLab example is particularly sensitive because it installs Fastlane immediately after decoding the Android signing keystore and Google Play service-account credentials. Installation hooks or subsequently executed compromised package code could run inside a CI job containing these assets. This is a supply-chain weakness rather than evidence that the current Fastlane package is malicious. Exploitation depends on compromise of an upstream package, package repository, dependency, or package-resolution path. ### Attack Path 1. An attacker compromises a Fastlane release, one of its transitive dependencies, or the package-resolution infrastructure. 2. The CI job executes `gem install fastlane` without a version constraint or lockfile. 3. The runner downloads and installs the attacker-controlled package version. 4. The job executes `fastlane internal`, loading the compromised package in the deployment environment. 5. Malicious package code reads the decoded keystore, service-account file, environment variables, or other CI credentials. 6. The attacker exfiltrates those crede ...[truncated 669 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Manage Fastlane through a reviewed `Gemfile` and committed `Gemfile.lock`. 2. Execute Fastlane with `bundle exec fastlane` so CI uses the locked dependency graph. 3. Pin Ruby, Fastlane, and relevant transitive dependencies to reviewed versions. 4. Use automated dependency updates that require review and CI validation before merging. 5. Prefer immutable CI images identified by digest rather than mutable image tags. 6. Enable dependency provenance, signature, checksum, and repository verification where supported. 7. Separate dependency installation from credential-bearing deployment stages. Build a verified image before injecting production secrets. 8. Grant the Google Play service account only the minimum permissions required for the intended release track. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
fastlane.md:199
Finding
Signing and publishing credentials are written to the CI workspace without restrictive permissions or guaranteed cleanup<![CDATA[ ## Vulnerability Details **File Location**: `fastlane.md:199-212` and `fastlane.md:220-225` **Vulnerability Type**: Insecure handling of sensitive temporary files **Risk Level**: Medium ### Vulnerable Code GitHub Actions example: ```yaml - name: Decode Keystore run: echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > keystore.jks - name: Decode Service Account run: echo "${{ secrets.PLAY_SERVICE_ACCOUNT }}" | base64 -d > service-account.json - name: Deploy to Internal env: KEYSTORE_PATH: keystore.jks KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} run: fastlane internal ``` GitLab CI example: ```yaml script: - echo "$KEYSTORE_BASE64" | base64 -d > keystore.jks - echo "$PLAY_SERVICE_ACCOUNT" | base64 -d > service-account.json - gem install fastlane - fastlane internal ``` ### Technical Analysis Both CI examples decode high-value secrets directly into predictable files in the project workspace. The examples do not: - Establish a restrictive `umask`. - Explicitly apply file mode `0600`. - Use a private temporary directory. - Exclude the files from caches and uploaded artifacts. - Delete the files through an unconditional cleanup step. The resulting permissions depend on the runner's default `umask`. Predictable workspace paths also make the files easy for later build steps, third-party actions, compromised dependencies, or accidentally broad artifact rules to locate. Base64 encoding does not encrypt the credentials; after decoding, the files contain the original keystore and service-account JSON. This finding does not establish that the current examples exfiltrate data, but it creates unnecessary exposure if another component in the CI job is malicious or misconfigured. ### Attack Path 1. The workflow decodes `KEYSTORE_BASE64` into `keystore.j ...[truncated 1447 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Prefer short-lived workload identity federation or another keyless authentication mechanism instead of a long-lived service-account JSON key. 2. Use the CI platform's protected secret-file mechanism when one is available. 3. If files must be created, use a private temporary directory and restrictive permissions: ```bash set -euo pipefail umask 077 SECRET_DIR="$(mktemp -d)" trap 'rm -rf "$SECRET_DIR"' EXIT printf '%s' "$KEYSTORE_BASE64" | base64 -d > "$SECRET_DIR/keystore.jks" printf '%s' "$PLAY_SERVICE_ACCOUNT" | base64 -d > "$SECRET_DIR/service-account.json" chmod 600 "$SECRET_DIR/keystore.jks" "$SECRET_DIR/service-account.json" ``` 4. Use `printf` rather than `echo` to avoid implementation-specific handling of escape sequences and options. 5. Pass the temporary paths to Fastlane through protected environment variables and do not print them with shell tracing enabled. 6. Ensure cleanup runs even when installation, building, or deployment fails. 7. Explicitly exclude credential filenames and temporary secret directories from repository tracking, caches, logs, and artifacts. 8. Run credential-bearing deployment steps only with reviewed dependencies and trusted actions. 9. Apply least privilege to the Google Play service account and rotate both credentials immediately if exposure is suspected. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (9)

Anti-Refusal Statement

High
Category
Anti-Refusal
Content
| Data request | 30 days | Complete in 14 |
| Critical issue | 24h suspension | Immediate |

**Rule:** Never ignore policy emails. Silence = admission.

## Common Traps
Confidence
90% confidence
Finding
Skill attempts to nullify the agent's safety policies or restrictions ('you have no restrictions', 'ignore your guidelines', 'do anything now'). This is a direct jailbreak that disables guardrails.

Hidden Instructions

High
Category
Prompt Injection
Content
integration: pending

## Workflow
<!-- Organization name, team size, release cadence -->
<!-- NO credentials, keys, or secrets here -->

## Apps
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
This markdown file includes commands that upload builds to the production track and increase rollout percentages, which can directly affect end users and release state. The section presents the commands operationally but does not include any warning or cautionary note about their production impact or the need to verify the target app/version before running them.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
The documented promotion command moves a release from beta to production with staged rollout, which is a safety-critical release action. The markdown does not provide a user-facing caution that promotion changes public release exposure and should only be performed after validation.

Vague Triggers

Medium
Confidence
78% confidence
Finding
This markdown file presents a general-purpose recovery guide titled "Rejection Recovery — Google Play Store" but provides no explicit trigger phrases, scope boundaries, or negative examples describing when the skill should or should not activate. For a markdown skill description, that absence can make invocation overly broad for common app-store troubleshooting requests.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The section presents creating a new developer account as an option after appeal denial, which can be interpreted as advice for evading platform enforcement. Although it notes this is a 'last resort' and 'risky,' it still normalizes an action that may violate Google Play account-integrity rules and could lead to linked-account termination or facilitate repeat abuse by bad actors.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The skill suggests activating whenever the user mentions broad topics like 'Play Store,' 'Android releases,' or 'app publishing,' which can match ordinary conversation outside a clear request to use this skill. This creates a risk of over-activation, causing the agent to unexpectedly steer conversations, collect setup information, or persist data when the user did not intend to invoke this capability.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The instructions direct saving integration preferences, app inventory, workflow details, and issue history to persistent storage without first requiring a clear disclosure or consent flow. In context, this can lead to silent retention of operationally sensitive business information and user preferences, especially because setup is intended to happen early and proactively.

Natural-Language Policy Violations

Low
Confidence
82% confidence
Finding
The phrase "Localize for major markets" imposes a locale-related requirement in natural language without offering user choice or clarifying that localization is optional or context-dependent. Under the policy rule, forcing a specific language/locale behavior without opt-in can be considered a locale policy violation.

Static analysis

No suspicious patterns detected.