Back to skill

Security audit

LYGO Site Card

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly does what it says, but its public-URL network boundary has a real SSRF weakness and its install instructions rely on a mutable npx package.

Install only if you are comfortable with a review bucket result. Prefer a pinned and verified installer instead of npx clawhub@latest, run it only against public sites you are authorized to inspect, and avoid using it as a hard SSRF boundary for adversarial URLs until DNS pinning or equivalent connection validation is fixed.

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)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/site_card.py:42
Finding

DNS Rebinding Can Bypass the Public-IP SSRF Restriction

Content
View full analysis
bool: try: infos = socket.getaddrinfo(host, 443, type=socket.SOCK_STREAM) except OSError: return False for info in infos: try: ip = ipaddress.ip_address(info[4][0]) except ValueError: return False if ip.is_private or ip.is_loopback or ip.is_link_local or ip.is_reserved or ip.is_multicast: return False return True def allowed_url(url: str) -> bool: if not https_only(url): return False host = (urlparse(url).hostname or "").lower() if host in {"localhost"}: return False return _public_host(host) class _AllowRedirect(urllib.request.HTTPRedirectHandler): def redirect_request(self, req, fp, code, msg, headers, newurl): if not allowed_url(newurl): raise urllib.error.HTTPError(newurl, code, "redirect blocked", headers, fp) return urllib.request.HTTPRedirectHandler.redirect_request( self, req, fp, code, msg, headers, newurl ) def get(url: str, timeout: int = 16) -> dict[str, Any]: if not allowed_url(url): return {"ok": False, "url": url, "error": "blocked_host", "status": None, "headers": {}, "body": b""} req = urllib.request.Request(url, headers={"User-Agent": UA, "Accept": "*/*"}) opener = urllib.request.build_opener(_AllowRedirect) try: with opener.open(req, timeout=timeout) as r: raw = r.read(MAX_BODY) headers = {k.lower(): v for k, v in r.headers.items()} return { "ok": True, "url": r.geturl() or url, "status": getattr(r, "status", 200), "headers": headers, "body": ...[truncated 2480 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:60
Finding

Installation Instructions Execute an Unpinned Third-Party npm Package

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
scripts/self_check.py:33
Finding

Self-Check Silently Overwrites a Fixed Local Fixture Path

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (7)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
86% confidence
Finding

Using npx clawhub@latest install ... executes the latest published package version at install time, which creates a supply-chain risk if a malicious or compromised release is published. Because this is an installation instruction in a skill file, users may run it directly and unknowingly execute unreviewed code.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill metadata and output fields strongly imply a read-only inspection tool, but the implementation allows writing JSON output to any caller-supplied local path when --write and --i-consent are used. In an agent setting, this capability expansion can be abused to overwrite or plant files on the host filesystem, especially if higher-level policy assumes the skill is non-writing based on its description.

Content

No source excerpt is available for this finding.

Scope Creep

Low
Category
Excessive Agency
Confidence
70% confidence
Finding

Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Content

Scanner excerpt · LICENSE (reported line 12)May include surrounding context.

text
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT.

ClawHub distribution uses MIT-0. Lattice policy in references/SECURITY.md is not waived.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This code creates a tests directory and writes fixture.html to disk, which is a file write operation covered by the missing-warning rule for code files. While the module docstring mentions no network use, there is no confirmation prompt, user-facing log, or comment near the write explaining that running the self-check will modify the local filesystem.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The top-level documentation frames the tool as a public-page identity card generator with 'HTTPS GET or local HTML. No subprocess.' While not false about subprocess use, this documentation is misleading in context because the program also writes arbitrary output files when invoked with --write, which conflicts with the otherwise read-only framing of the tool's purpose.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.