Back to skill

Security audit

dca-decision-calculator

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed finance calculator skill with broad activation terms, but it does not run code, access accounts, persist data, or hide unrelated behavior.

Before installing, understand that this skill can produce concrete buy/add-position/exchange-style calculations from numbers you provide. Treat outputs as decision support, not financial advice, and be aware the broad Chinese trigger words may invoke it during general finance discussion.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T08 · Insecure Dependencies

Warning
Location
.github/workflows/clawhub-publish.yml:16
Finding

Unpinned ClawHub CLI Dependency in Publishing Workflow

Content
View full analysis

Vulnerability Details

File Location: .github/workflows/clawhub-publish.yml, lines 16–18
Vulnerability Type: Supply-chain risk caused by a mutable npm dependency
Risk Level: Medium

Vulnerable Code

yaml
- name: Install ClawHub CLI
  run: npm install -g clawhub@latest

Technical Analysis

The publishing workflow installs clawhub@latest at runtime. The latest npm tag is mutable, so the workflow may execute a package version that was never reviewed by the repository maintainers. npm installation can also run package lifecycle scripts, giving the resolved package and its dependency chain an opportunity to execute code on the GitHub Actions runner.

If the clawhub package, its maintainer account, its release process, or a transitive dependency is compromised, a malicious version can execute during installation. Because the installation and publication steps share the same job and runner, malicious installation code could modify the checked-out Skill, replace installed tooling, tamper with files under the runner's home directory, or establish a process or hook that affects the later publication step.

Although CLAWHUB_TOKEN is only explicitly supplied to the subsequent publication step, this separation does not fully isolate it from earlier runner compromise. Malicious code that persists within the job could replace the clawhub executable or otherwise intercept the publication command when the token becomes available.

Attack Path

  1. An attacker compromises the clawhub npm package, a relevant maintainer account, or a transitive dependency.
  2. The attacker publishes a malicious release and causes the mutable latest tag to resolve to it.
  3. A push to main or a manual workflow dispatch starts the publishing job.
  4. npm install -g clawhub@latest downloads the attacker-controlled release.
  5. Malicious package lifecycle code executes on the GitHub Actions runner, or the installed CLI itself is replaced with malicious b ...[truncated 1077 chars]
Remediation
View remediation

Remediation Suggestions

  1. Replace the mutable latest tag with a reviewed, exact package version:

    yaml
    - name: Install ClawHub CLI
      run: npm install --global --ignore-scripts clawhub@X.Y.Z
    

    Use --ignore-scripts only if the verified CLI does not require lifecycle scripts.

  2. Prefer installing the CLI as a repository development dependency using an npm lockfile. Use npm ci so dependency versions and integrity hashes are enforced, then invoke it with npx --no-install clawhub.

  3. Update the pinned version only through reviewed dependency-update pull requests. Validate release provenance, package ownership, changelog, integrity metadata, and dependency changes before merging.

  4. Separate dependency installation and publication into isolated jobs or environments where practical. Pass only a verified artifact into the credential-bearing publication job.

  5. Protect CLAWHUB_TOKEN with least privilege, restrict its publication scope to the intended owner or package, rotate it after suspected workflow compromise, and apply protected GitHub environments with required approval for publishing.

  6. Pin GitHub Actions to audited commit SHAs rather than mutable major-version tags to further reduce workflow supply-chain exposure.

Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (21)

Vague Triggers

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger list is very broad and consists largely of common investment terms, making accidental activation likely in ordinary financial conversations. In a finance skill, unintended activation is particularly risky because it can cause the agent to produce quasi-personalized buy/add-position/exchange guidance in contexts where the user did not explicitly request this workflow.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger list is broad and matches ordinary financial discussion terms such as 指数, 投资, 成本, 汇率, and 买入-like concepts, which makes accidental invocation likely in unrelated or only partially related conversations. In a finance-oriented skill, unintended activation is more dangerous because it can inject investment guidance into general discussion without clear user intent, increasing the risk of inappropriate or unsolicited financial recommendations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The entire skill specification is written to operate in Chinese, including trigger phrases, mode descriptions, and output templates, with no indication that the user may choose another language. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The mode-selection rules are ambiguous because they mix keyword presence with partial data availability and broad concepts like '现在该不该买'. This can route users into advisory-style outputs without a clear, deterministic gate, increasing the chance of inappropriate or premature financial guidance.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The natural-language instructions, feature list, and trigger section are presented exclusively in Chinese, which can amount to forcing a specific language without user opt-in. There is no accompanying note that the skill is intentionally Chinese-only or limited to a Chinese-speaking user base.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
91% confidence
Finding

The trigger '定投' is short and common in investment discussions, so it can activate the skill even when the user is discussing investing generally rather than requesting this calculator. In a finance context, even low-friction accidental activation can lead to unwanted action-oriented recommendations.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
89% confidence
Finding

The trigger '基金' is a generic noun that appears in many benign finance conversations. Matching on such a broad term increases accidental invocation and can push users into decision support they did not ask for.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
88% confidence
Finding

The trigger '指数' is overly generic and could match a wide range of market commentary unrelated to DCA calculations. This broad match surface raises the chance of unsolicited financial output.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
90% confidence
Finding

The trigger '加仓' is a common investment action term and may appear in exploratory discussion rather than a request for this calculator. Unintended activation in a finance skill can nudge the conversation toward concrete trading behavior.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
89% confidence
Finding

The trigger '换汇' is short and broad enough to match general foreign-exchange questions outside this skill's intended workflow. That can cause the agent to enter recommendation logic with insufficient user intent validation.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
88% confidence
Finding

The trigger '汇率' is extremely common in finance and travel contexts, so it risks firing on unrelated discussions. In combination with downstream exchange suggestions, this creates unnecessary exposure to accidental advisory behavior.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
87% confidence
Finding

The trigger '投资' is broad enough to match almost any investing conversation, making accidental invocation highly likely. Because the skill outputs operation parameters, generic activation can become safety-relevant even if no code execution is involved.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
70% confidence
Finding

Overly Broad Trigger: '贬买' is too short and may match unintended inputs

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
88% confidence
Finding

The trigger '买入' is a very common action word in financial discussion and can easily match informational or hypothetical questions. This increases the likelihood of the skill surfacing prescriptive outputs when the user did not clearly request them.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
88% confidence
Finding

The trigger '持仓' is generic and widely used in portfolio discussions beyond this skill's purpose. It expands the activation surface and can invoke portfolio-diagnostic behavior without clear authorization from the user.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
86% confidence
Finding

The trigger '成本' is too general and may appear in many unrelated contexts, including non-financial ones. Such ambiguity makes accidental skill routing more likely and weakens intent integrity.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
85% confidence
Finding

The trigger '跌了' is common conversational language and may be used casually in broad market discussion. Using it as a direct trigger can cause unsolicited strategy-mode behavior from normal chat.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
84% confidence
Finding

The trigger '涨了' is similarly broad and likely to appear in ordinary market commentary. This creates a large false-activation surface for a skill that can influence financial decisions.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
86% confidence
Finding

The trigger '跌幅' is generic analytical terminology and could match a wide variety of finance questions not intended for this skill. Broad keyword matching weakens assurance that the user actually wants this specific calculation workflow.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
82% confidence
Finding

The trigger '缩水' is colloquial and may occur in casual conversation about losses, not necessarily as a request for DCA analysis. It can therefore activate the skill unexpectedly in emotionally sensitive contexts.

Content

No source excerpt is available for this finding.

Overly Broad Trigger

Low
Category
Trigger Abuse
Confidence
86% confidence
Finding

The trigger '估值' is a generic finance term used in many educational and analytical contexts. On its own it is too broad for safely launching a workflow that may produce personalized-seeming investment guidance.

Content

No source excerpt is available for this finding.