Back to skill

Security audit

LYGO Champion: scenar paradox

Security checks for vulnerabilities and agentic risk

Overview

This is a small persona-helper skill with disclosed local reference files and no automatic harmful actions, though its manual successor install command should be reviewed before use.

Installing the skill itself appears low risk, but treat the npx clawhub@latest successor command as remote code execution: pin or review the installer and successor package first if you operate in a sensitive environment. Do not rely on the bundled self-check as cryptographic proof of authenticity; verify the persona pack hash independently if integrity matters.

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

Error
Location
SKILL.md:8
Finding
Unpinned Remote Package Execution Through Mutable Latest Release<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:8` **Vulnerability Type**: Unpinned third-party executable dependency **Risk Level**: High ### Vulnerable Code Snippet ```markdown > **Consolidated (Δ9 v2):** New installs → `lygo-champion-council`. This slug is legacy retention only. > `npx clawhub@latest install deepseekoracle/lygo-champion-council` ``` ### Technical Analysis The documented installation command uses `npx` to download and execute the mutable `latest` release of the `clawhub` package. Neither the executable package nor the successor Skill is pinned to a reviewed immutable version or cryptographic digest. Because the `latest` tag can be reassigned after this project has been audited, the code executed by users may differ from the code that was originally reviewed. Compromise of the package registry, publisher account, package maintainership, or successor Skill could turn the installation instruction into a supply-chain execution path. The command is presented as a manual installation instruction rather than being automatically invoked by the bundled Python scripts. Exploitation therefore requires a user or agent to follow the documented command. ### Attack Path 1. An attacker compromises the `clawhub` package, its publisher account, its dependency chain, or the referenced successor Skill. 2. The attacker publishes a malicious release and assigns it to the mutable `latest` tag, or changes the content subsequently retrieved by the installer. 3. A user follows the installation command in `SKILL.md`. 4. `npx` retrieves and executes the attacker-controlled package. 5. The malicious package runs with the operating-system privileges and environment access of the invoking user. 6. Depending on those privileges, it could access project files, environment variables, user-readable credentials, or install additional malicious content. ### Impact Assessment Successful exploitation could result in arbitrary code execution with the priv ...[truncated 444 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Replace `clawhub@latest` with an explicitly reviewed version. - Pin the package using an immutable version and, where supported, verify its registry integrity digest. - Pin the successor Skill to a specific reviewed release or content hash. - Document the expected package digest and verify it before execution. - Avoid executing remote packages directly through `npx` in security-sensitive environments. - Prefer installing into an isolated environment, reviewing the resolved dependency tree, and then invoking the verified local executable. - Establish an upgrade process that requires explicit review before changing pinned versions or hashes. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/self_check.py:23
Finding
Self-Check Does Not Cryptographically Verify Persona Pack Integrity<![CDATA[ ## Vulnerability Details **File Location**: `scripts/self_check.py:23-36`; related behavior in `scripts/show_hash.py:4-6` **Vulnerability Type**: Ineffective integrity verification **Risk Level**: Medium ### Vulnerable Code Snippets `scripts/self_check.py`: ```python canon = json.loads((ROOT / "references" / "canon.json").read_text(encoding="utf-8")) champion = canon.get("champion") if not champion or not isinstance(champion, str): print("BAD_CANON: champion missing") raise SystemExit(2) vu = (ROOT / "references" / "verifier_usage.md").read_text(encoding="utf-8", errors="replace") if "lygo-mint-verifier" not in vu.lower() and "clawhub" not in vu.lower(): print("BAD_REF: verifier link missing") raise SystemExit(2) h = canon.get("lygo_mint_sha256") if h is not None and (not isinstance(h, str) or len(h) != 64): print("BAD_CANON: lygo_mint_sha256 invalid") raise SystemExit(2) ``` `scripts/show_hash.py`: ```python canon_path = Path(__file__).resolve().parents[1] / "references" / "canon.json" canon = json.loads(canon_path.read_text(encoding="utf-8")) print(canon.get("lygo_mint_sha256") or "MISSING_HASH") ``` ### Technical Analysis The project claims that the persona pack is represented by a LYGO-MINT SHA-256 value, but the bundled self-check does not calculate a digest from `references/persona_pack.md`. It only checks that the value from `references/canon.json` is a string of 64 characters. The validation does not ensure that every character is hexadecimal and, more importantly, does not compare the stored value with a digest derived from the actual persona-pack content. The hash-display script likewise prints the value stored in `canon.json` without independently validating it. Consequently, the scripts verify metadata shape rather than content integrity. A modified persona pack can pass the self-check as long as `canon.json` contains any 64-character string. An attacker able to alter project files could also modify both ...[truncated 1294 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Define and document the exact deterministic canonicalization algorithm used before hashing. - Read and canonicalize `references/persona_pack.md` during the self-check. - Calculate its SHA-256 digest locally with a standard cryptographic library. - Require `lygo_mint_sha256` to match the regular expression `^[0-9a-fA-F]{64}$`. - Compare the calculated digest with the expected digest and terminate with a nonzero status on mismatch. - Make `show_hash.py` display both the declared and calculated digests and clearly report whether they match. - If the hash is intended to authenticate content rather than only detect accidental changes, verify a digital signature from a trusted publisher in addition to checking SHA-256. - Add tests covering modified pack content, malformed hashes, mismatched hashes, canonicalization differences, and missing files. ]]>
Vulnerability Patterns
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (9)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The deprecated/redirect-like description does not disclose that the skill reads a local file and outputs a hash value from 'references/canon.json'. Hidden operational behavior, even if low-risk by itself, undermines review and consent and may expose internal metadata or create a misleading security posture for a supposedly passive alias.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The deprecated/redirect-like description does not disclose that the skill reads a local file and outputs a hash value from 'references/canon.json'. Hidden operational behavior, even if low-risk by itself, undermines review and consent and may expose internal metadata or create a misleading security posture for a supposedly passive alias.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Lp3

Medium
Category
MCP Least Privilege
Confidence
74% confidence
Finding
The skill references reading local files such as 'references/canon.json' but does not declare an explicit tool scope or allowed tools. This can create a trust gap where consumers believe the skill is only a deprecated persona/redirect while it still relies on filesystem access, increasing the chance of over-broad execution or unnoticed data access in permissive runtimes.

Rp1

Medium
Category
MCP Rug Pull
Confidence
88% confidence
Finding
The install command uses 'npx clawhub@latest', which pulls an unpinned, mutable version at execution time. If the upstream package is compromised or behavior changes unexpectedly, users following the skill's instructions could execute attacker-controlled or unreviewed code.

Ae4

Medium
Category
analysis-evasion
Confidence
93% confidence
Finding
The JSON contains mixed-script and visually confusable Unicode characters such as Greek letters in identifiers and display strings (for example, "ΣCENΔR"). Even though this appears to be branding or canon metadata rather than executable code, mixed-script text can enable spoofing, operator confusion, and mismatches between displayed and compared values if these strings are later used in lookups, access control, or filename generation.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Static analysis

No suspicious patterns detected.