Back to skill

Security audit

LYRA Coin Launch Manager

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated coin-receipt workflow, but it needs review because some scripts can write outside the advertised local folders when given crafted symbols or paths.

Install only in a dedicated workspace, pin or verify the ClawHub CLI instead of using @latest, and do not run the scripts on untrusted receipt JSON or arbitrary symbols until path validation is added. Do not paste wallet private keys or GitHub credentials into this skill; the reviewed package does not need them.

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)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/normalize_starcore_family.py:91
Finding
Unvalidated Symbols Permit Filesystem Path Traversal<![CDATA[ ## Vulnerability Details **File Location**: `scripts/normalize_starcore_family.py:91-105, 126-129`; `scripts/bookmark_starcore_family.py:42-49, 66` **Vulnerability Type**: Path traversal through attacker-controlled filename components **Risk Level**: Medium ### Vulnerable Code In `scripts/normalize_starcore_family.py`, symbols obtained from local receipt data are used as dictionary keys and subsequently interpolated into filenames: ```python family_file = state / "starcorex_starcorecoin_clawnch_receipts.json" found: dict[str, dict[str, Any]] = {} for p in pref_files: if p.is_file(): try: j = json.loads(p.read_text(encoding="utf-8")) norm = normalize_starcore(j) if norm.get("symbol"): found[str(norm["symbol"]).upper()] = norm break except (OSError, json.JSONDecodeError): pass if family_file.is_file(): try: j = json.loads(family_file.read_text(encoding="utf-8")) for sym, rec in (j.get("receipts") or {}).items(): found[str(sym).upper()] = normalize_starcore(rec) except (OSError, json.JSONDecodeError): pass ``` The unvalidated key is used directly in the output path: ```python for sym, rec in found.items(): (state / f"{sym}_clawnch_receipt.json").write_text( json.dumps(rec, indent=2, ensure_ascii=False), encoding="utf-8" ) ``` The bookmark generator has a similar issue with command-line symbols: ```python workspace = Path(args.workspace).resolve() symbols = [s.strip().upper() for s in args.symbols.split(",") if s.strip()] recs = load_receipts(workspace, symbols, Path(args.receipts) if args.receipts else None) if not recs: print("No receipts found to bookmark") return 2 out = workspace / args.bookmark_dir out.mkdir(parents=True, exist_ok=True) ``` The symbol is then used directly as a filename: ```python (out / f"{sym}_links.md").write_text("".join(lines[-6:]), encoding="utf-8") ` ...[truncated 2315 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Enforce a strict token-symbol allowlist before using any symbol: ```python import re SYMBOL_RE = re.compile(r"^[A-Z0-9_-]{1,32}$") def validate_symbol(value: str) -> str: symbol = value.strip().upper() if not SYMBOL_RE.fullmatch(symbol): raise ValueError(f"Invalid token symbol: {value!r}") return symbol ``` 2. Apply validation consistently to: - `--symbols` command-line input. - Symbols returned by the Clawnch API. - Keys loaded from receipt and summary JSON files. - Symbols embedded inside individual receipt records. 3. Add a resolved-path containment check immediately before every write: ```python root = state.resolve() destination = (root / f"{symbol}_clawnch_receipt.json").resolve() if root not in destination.parents: raise ValueError("Output path escapes the state directory") ``` 4. Apply the same containment check to bookmark output paths and reject absolute `--bookmark-dir` values if writes are required to remain under the workspace. 5. Reject conflicting symbol values between a receipt object's key and its internal `symbol` field. 6. Add regression tests using values such as `../TARGET`, `A/B`, `A\B`, absolute paths, empty strings, and excessively long symbols. ]]>

T08 · Insecure Dependencies

Warning
Location
SKILL.md:60
Finding
Installation Command Executes a Mutable Third-Party Package Version<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:60` **Vulnerability Type**: Unpinned executable installation dependency **Risk Level**: Medium ### Vulnerable Code ```bash npx clawhub@latest install deepseekoracle/lyra-coin-launch-manager ``` ### Technical Analysis The documented installation procedure invokes `npx` with the mutable `latest` tag. This causes the package manager to retrieve and execute whatever version of `clawhub` is designated as latest at installation time. Consequently, the effective executable is not fixed to the version reviewed during this audit. A future upstream release, compromised publisher account, registry compromise, or malicious dependency update could change the code executed by the command without any modification to this Skill package. The reviewed Python scripts do not themselves retrieve or execute remote code. The risk arises specifically from the user-facing installation instruction and its mutable executable dependency. ### Attack Path 1. The `clawhub` package, its publisher account, or its dependency chain is compromised, or an unsafe future release is assigned to the `latest` tag. 2. A user follows the installation command documented in `SKILL.md`. 3. `npx` downloads the current mutable release from the package registry. 4. Package installation or execution hooks run with the permissions of the invoking user. 5. The compromised package can perform actions beyond the declared receipt-management functionality. ### Impact Assessment A malicious package executed through `npx` could obtain arbitrary code execution with the invoking user's privileges. Depending on the user's environment, this could expose local files, credentials, network access, and project data. No evidence indicates that the current `clawhub` package or this repository is malicious. This finding concerns the absence of version and integrity pinning in the documented supply-chain path. ]]>
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the mutable tag with a specifically audited version: ```bash npx clawhub@<audited-version> install deepseekoracle/lyra-coin-launch-manager ``` 2. Where supported, pin the package by registry integrity hash or use a lockfile that records the resolved version and integrity metadata. 3. Document the expected publisher, package version, and checksum so operators can verify the artifact before execution. 4. Prefer installing the trusted CLI separately through a controlled dependency-management process, then invoke the already verified local binary. 5. Review new CLI versions and their transitive dependencies before updating the pinned version. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description centers on a Clawnch-focused workflow: pulling launch data from clawn.ch, generating receipt JSON/MD, optional Blockscout/Dexscreener verification, and local bookmarking. The supplied code does not implement that described workflow directly. Instead, it is a wrapper script that orchestrates three STARCORE-specific local modules (`normalize_starcore_family`, `verify_starcore_family`, `bookmark_starcore_family`) over a list of STARCORE symbols, then appends success/failure lines to `daily_health.md` or another chosen log. There is no visible logic for accessing clawn.ch, handling Clawnch launches, writing receipt JSON/Markdown itself, or performing Blockscout/Dexscreener checks in this chunk. While bookmarking and verification are vaguely related themes, the concrete subject matter and primary purpose are materially different, so this should be flagged as a mismatch.

Description-Behavior Mismatch

High
Confidence
97% confidence
Finding
The script’s behavior is materially outside the stated skill scope: instead of managing generic coin-launch receipts, it orchestrates STARCORE-specific normalize/verify/bookmark modules and rewrites process-global state via sys.argv and sys.path. In an agent skill, this kind of undeclared, hard-coded workflow is dangerous because it can trigger hidden side effects, operate on unintended targets, and evade user or platform expectations about what the skill is supposed to do.

Rp1

Medium
Category
MCP Rug Pull
Confidence
83% confidence
Finding
The README instructs users to run `npx clawhub@latest publish`, which fetches and executes the latest package version at runtime instead of a reviewed, pinned release. If the upstream package is compromised or a breaking/malicious version is published, users of this skill could execute attacker-controlled code during publish operations.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The install command uses `npx clawhub@latest`, which resolves and executes the newest package version at runtime rather than a reviewed, fixed version. This creates a supply-chain risk: if the package is compromised or a breaking/malicious update is published, users of the skill may execute untrusted code during installation.

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Rp1

Medium
Category
MCP Rug Pull
Confidence
84% confidence
Finding
Installing via `npx clawhub@latest` introduces a supply-chain risk because the fetched package version can change over time and may execute different code than what was originally reviewed. Even though this is only an install instruction in documentation, users following it could pull a compromised or incompatible release without noticing.

Intent-Code Divergence

Medium
Confidence
84% confidence
Finding
The docstring presents the file as a generic in-process "normalize → verify → local bookmark chain" component. In practice, the code is hardwired to import and execute STARCORE-family modules, construct STARCORE-specific receipt paths, and append monitor health entries, so the documentation understates and mischaracterizes the actual purpose of the file.

External Transmission

Medium
Category
Data Exfiltration
Content
def check_dexscreener(addr: str) -> dict[str, Any]:
    code, j = http_json(f"https://api.dexscreener.com/latest/dex/search/?q={addr}")
    if code != 200 or not isinstance(j, dict):
        return {"status": "error", "code": code}
    pairs = j.get("pairs") or []
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
def check_dexscreener(addr: str) -> dict[str, Any]:
    code, j = http_json(f"https://api.dexscreener.com/latest/dex/search/?q={addr}")
    if code != 200 or not isinstance(j, dict):
        return {"status": "error", "code": code}
    pairs = j.get("pairs") or []
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Description-Behavior Mismatch

Low
Confidence
86% confidence
Finding
The README states that scripts only call the public Clawnch API and read/write local JSON under `state/`, implying a narrowly local/network scope. However, nearby documented commands include `python scripts/push_github_auto.py` and `npx clawhub@latest publish`, which indicate remote repository/package publishing capabilities beyond that description.

Intent-Code Divergence

Low
Confidence
83% confidence
Finding
The wording 'Scripts only call the public Clawnch API and read/write local JSON under `state/`' actively suggests there are no other networked side effects in this repo. That conflicts with the explicitly documented `push_github_auto.py` and `clawhub ... publish` commands, which perform additional remote operations.

Static analysis

No suspicious patterns detected.