Back to skill

Security audit

Android Mobpush Integration

Security checks for vulnerabilities and agentic risk

Overview

This MobPush integration skill is purpose-related, but it needs Review because it handles secrets, writes them into project files/documentation, and can run Gradle after adding an unpinned external plugin.

Review carefully before installing. Use it only on a MobPush-specific Android integration, require explicit confirmation before every file change or Gradle command, pin and verify FlySDK instead of using '+', avoid --refresh-dependencies unless needed, and keep appSecret/vendor secrets out of README and version-controlled Gradle files.

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 (3)

T08 · Insecure Dependencies

Error
Location
SKILL.md:168
Finding

Unpinned Executable Gradle Plugin Loaded from an Additional Repository

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 168–190; repeated at lines 210–230 and 625–665
Vulnerability Type: Supply-chain risk through an unpinned executable dependency
Risk Level: High

Vulnerable Code

groovy
maven {
    url "https://mvn.zztfly.com/android"
}
groovy
buildscript {
    dependencies {
        // Add FlySDK plugin configuration
        classpath 'cn.fly.sdk:FlySDK:+'
        // Add Google Services plugin configuration for FCM
        classpath 'com.google.gms:google-services:4.3.14'
    }
}

The same unsafe dynamic FlySDK version is also recommended for older Gradle configurations:

groovy
buildscript {
    dependencies {
        classpath 'cn.fly.sdk:FlySDK:+'
    }
}

Technical Analysis

The Skill directs the agent to add an external Maven repository and resolve the FlySDK Gradle plugin using the dynamic version selector +. Unlike an ordinary library that may only become active at application runtime, a Gradle plugin executes code during build configuration and compilation.

The + selector allows the repository to determine which version will be downloaded during each build. Therefore, the effective executable dependency may change after this Skill has been reviewed. Builds are not reproducible, and users cannot reliably determine which plugin implementation will execute from the checked-in project configuration alone.

HTTPS protects the transport connection but does not protect against a compromised repository, compromised publisher account, malicious future release, or accidental publication of a defective artifact.

Attack Path

  1. An attacker compromises the package publisher, repository infrastructure, or credentials authorized to publish cn.fly.sdk:FlySDK.
  2. The attacker publishes a newer artifact version containing malicious Gradle plugin logic.
  3. A user follows the Skill and configures `classpath 'c ...[truncated 1096 chars]
Remediation
View remediation

Remediation Suggestions

  1. Replace the dynamic version with a specific, reviewed release:

    groovy
    classpath 'cn.fly.sdk:FlySDK:REVIEWED_EXACT_VERSION'
    
  2. Verify the selected version against authoritative MobTech documentation before recommending it.

  3. Enable Gradle dependency verification and commit trusted checksums or signatures in gradle/verification-metadata.xml.

  4. Use Gradle dependency locking where supported to preserve reproducible resolution.

  5. Apply repository content filtering so the additional repository can only provide the explicitly required group:

    groovy
    maven {
        url "https://mvn.zztfly.com/android"
        content {
            includeGroup "cn.fly.sdk"
        }
    }
    
  6. Document the plugin's provenance, expected version, and verification procedure.

  7. Require explicit user approval after displaying the exact repository, artifact version, and integrity information.

  8. Periodically review and deliberately update the pinned version rather than accepting new releases automatically.

T08 · Insecure Dependencies

Warning
Location
SKILL.md:357
Finding

Automatic Gradle Execution Immediately After Dependency Configuration

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 357–365
Vulnerability Type: Execution of newly retrieved build dependencies
Risk Level: Medium

Vulnerable Code

bash
cd {project_path}
./gradlew --refresh-dependencies

Technical Analysis

The Skill instructs the agent to invoke the project-controlled Gradle wrapper with --refresh-dependencies immediately after modifying repository and plugin configuration. This operation can download dependencies again and execute Gradle initialization scripts, settings scripts, build scripts, and plugins.

In the documented workflow, this behavior compounds the risk of the unpinned cn.fly.sdk:FlySDK:+ dependency. It converts an unsafe dependency declaration into an immediate code-execution path rather than leaving dependency resolution for a later, separately reviewed build.

The command also runs the target project's gradlew script. Although running a project's build wrapper is normal during integration, it should occur only after the relevant wrapper, build scripts, repositories, plugins, and resolved versions have been reviewed and approved.

Attack Path

  1. The Skill adds or updates the external repository and dynamic Gradle plugin configuration.
  2. A malicious or compromised artifact is available through the configured dependency source.
  3. The Skill invokes ./gradlew --refresh-dependencies.
  4. Gradle bypasses ordinary cache reuse where refresh behavior applies and resolves current dependency metadata.
  5. The malicious plugin or build component is downloaded and loaded.
  6. Attacker-controlled build logic executes under the developer or CI account.
  7. That logic can access or modify resources available to the Gradle process.

A malicious target project could similarly place attacker-controlled commands in gradlew or Gradle initialization and build files, which would execute when the Skill invokes the command.

Impact Assessment

...[truncated 570 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin and verify every executable Gradle plugin before invoking Gradle.
  2. Display the exact command and all repository and dependency changes to the user before execution.
  3. Require explicit approval immediately before running the Gradle wrapper.
  4. Review the target project's gradlew, gradle/wrapper/gradle-wrapper.properties, settings files, build scripts, and initialization hooks.
  5. Verify the Gradle distribution checksum by configuring distributionSha256Sum in the wrapper properties.
  6. Avoid --refresh-dependencies unless a refresh is specifically needed. Use an ordinary, narrowly scoped validation task after dependency verification.
  7. Run dependency resolution in a restricted or isolated build environment with only the minimum required secrets and filesystem access.
  8. Enable Gradle dependency verification and dependency locking before executing the build.

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:296
Finding

Plaintext SDK Secrets Stored and Duplicated in Project Files

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 296–307 and 572–576
Vulnerability Type: Plaintext sensitive-data exposure
Risk Level: Medium

Vulnerable Code

The Skill directs the agent to insert user-provided credentials directly into app/build.gradle:

groovy
// Add FlySDK configuration at the end of the file
FlySDK {
    appKey "{user-provided appKey}"
    appSecret "{user-provided appSecret}"

    MobPush {
        // Enabled vendor channel configuration
        {enabled vendor configuration block}
    }
}

It also directs the agent to duplicate those values in generated project documentation:

text
Operation: Generate MOBPUSH_README.md in the user's project root.

Include:
- Project path
- Integrated SDK configuration (appKey, appSecret)
- Privacy callback file and method
- Configured vendor channel list
- Official documentation links

Technical Analysis

The integration workflow obtains MobPush and vendor credentials from MobPush_Config.xlsx, writes the MobPush secret into app/build.gradle, and instructs the agent to include both appKey and appSecret in MOBPUSH_README.md.

Gradle configuration files and README files are commonly committed to source control, included in project archives, copied into support bundles, indexed by development tools, or shared with collaborators. The Excel file also remains as an additional plaintext credential store unless it is removed or excluded.

Duplicating a secret into documentation is unnecessary for SDK operation and increases the number of locations that must be protected, audited, and sanitized. Quoting the values as strings provides no confidentiality protection.

Vendor channel blocks described elsewhere in the Skill may expose additional values such as client secrets and master secrets through the same pattern.

Attack Path

  1. The user enters MobPush and vendor credentials into `MobPush_C ...[truncated 1559 chars]
Remediation
View remediation

Remediation Suggestions

  1. Never include secret values in MOBPUSH_README.md. Include only configuration locations and redacted identifiers.
  2. Store secrets outside version-controlled build files, using an approved secret manager, CI secret variables, environment variables, or an untracked local properties file.
  3. Reference external values from Gradle rather than embedding literals. Ensure the selected mechanism does not print secrets to build logs.
  4. Add sensitive local files to .gitignore, including the completed MobPush_Config.xlsx and any local secret properties file.
  5. Generate a sanitized example file containing placeholders rather than real credentials.
  6. Delete or securely relocate the completed spreadsheet after configuration has been transferred to an approved secret store.
  7. Mask secret values in all agent output, generated documentation, diagnostics, and command logs.
  8. Add automated secret scanning to pre-commit hooks and CI.
  9. If credentials have already been committed, rotate them and remove them from repository history using an appropriate history-rewriting procedure.
  10. Document the sensitivity and rotation procedure for MobPush and each enabled vendor-channel credential.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a user-facing interactive assistant for guiding Android MobPush integration across six steps. The supplied code does not implement an interactive guide at all; instead, it creates a static Excel configuration template using openpyxl and saves it locally. While the workbook content is related to MobPush configuration and privacy/vendor channels, the primary behavior is materially different from the declared purpose. Important declared capabilities such as Gradle configuration guidance, integration workflow control, push handling, and alias/tag management are absent. Therefore this is a clear description-behavior mismatch.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The trigger phrases include very generic requests such as configuring push notifications or adding push capability, which can cause this skill to activate for broad Android notification questions beyond MobPush-specific integration. In an agent ecosystem, overly broad routing can lead to unintended file modification guidance, dependency changes, or privacy/compliance steps being suggested in contexts where they are not appropriate.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill claims confirmation before every step, yet it includes file writes, config generation, README creation, and command execution flows that are not consistently gated by explicit consent. In an agent context, this can lead to unintended modification of a user's project or execution of build commands based on ambiguous user intent.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Broad trigger phrases increase the chance that the skill activates on loosely related Android or notification questions, causing the agent to propose or initiate project modifications unexpectedly. In a code-modifying skill, accidental invocation materially raises the risk of unauthorized changes and exposure of sensitive integration details.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The invocation examples include ambiguous phrases like adding push capability or quick/one-click integration, which may match requests where the user only wants advice rather than file operations. In an agentic environment, ambiguous activation can result in unrequested changes to build files, manifests, or code.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill handles highly sensitive credentials such as appKey, appSecret, vendor secrets, and potentially service account material, yet it does not clearly warn users that these values may be written into project files and documentation. This can lead to secret sprawl, accidental commits to source control, and exposure of production push infrastructure credentials.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill explicitly instructs generating a project README containing appKey, appSecret, configured vendor channels, and other integration details. Storing secrets in a documentation file greatly increases the likelihood of accidental source control commits, broader developer exposure, and downstream credential leakage.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

All user-facing natural-language instructions, triggers, and workflow descriptions are presented only in Chinese, which can amount to an implicit language constraint without documented user opt-in. There is no indication that the skill supports language choice or that the Chinese-only scope is a justified regional requirement.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill content, prompts, and workflow are presented entirely in Chinese, and it does not indicate that users may choose another language. This can violate language or locale choice expectations unless the locale restriction is explicitly documented and justified.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

The workflow section explicitly promises a '6 步交互式流程' and says each step requires confirmation. Later, the document continues through Step 6 and then adds '步骤 7:补充说明' at L568, which is a direct contradiction in the skill's own instructions rather than a mere omission.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The example prompts and section headings are entirely written in Chinese, which indicates a language-specific interaction model. There is no accompanying note that the skill supports other languages or that Chinese is an optional or region-specific mode, so this can conflict with a policy requiring user language choice.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.