Back to skill

Security audit

Clawsite

Security checks for vulnerabilities and agentic risk

Overview

The hosting skill is mostly coherent, but the package includes live production infrastructure instructions and an overridable API endpoint that could expose the site API key if misconfigured.

Review before installing if the agent environment can be influenced or has AWS/cloud credentials. Use only the documented ClawSite API hosts, avoid putting secrets or private data in deployed static files, require explicit confirmation before publishing public content or deleting a site, and do not let an agent run the CLAUDE.md production Terraform or Lambda commands unless you intend to operate the backend service.

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
SKILL.md:67
Finding

Bearer credential may be transmitted to an unrestricted API origin

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 67-70; the unrestricted CLAWSITE_API_URL configuration is documented at line 35
Vulnerability Type: Unvalidated destination for authenticated requests
Risk Level: Medium

bash
curl -X POST "$CLAWSITE_API_URL/v1/sites/$CLAWSITE_SITE_ID/deploy" \
  -H "Authorization: Bearer $CLAWSITE_API_KEY" \
  -H "Content-Type: application/zip" \
  --data-binary "@site.zip"

Technical Analysis

The deployment instructions construct the request destination directly from the environment-controlled CLAWSITE_API_URL and attach the secret CLAWSITE_API_KEY as a bearer token. The instructions do not require validation of the URL scheme or hostname before the authorization header and website archive are transmitted.

Although overriding the API URL can legitimately support development environments, accepting an arbitrary origin creates a credential-disclosure risk. An attacker who can influence the agent's environment, execution wrapper, or copied command can redirect the authenticated request to an attacker-controlled endpoint.

Attack Path

  1. An attacker or compromised environment sets CLAWSITE_API_URL to an attacker-controlled HTTPS endpoint.
  2. The agent follows the documented deployment workflow without validating the destination.
  3. curl sends both the Authorization: Bearer header and the ZIP archive to the malicious endpoint.
  4. The attacker extracts the API key and site contents.
  5. The attacker reuses the key against the legitimate ClawSite API to inspect account metadata, replace the hosted site, purge its cache, or invoke site deletion where permitted.

Impact Assessment

Exploitation exposes the ClawSite bearer credential and the complete uploaded static-site archive. Within the permissions granted to that API key, an attacker may replace public content, enumerate associated sites, purge caches, and potentially permanently delete the ...[truncated 269 chars]

Remediation
View remediation

Remediation Suggestions

  • Resolve the API endpoint once before constructing authenticated requests.
  • Require an https scheme.
  • Allow only explicitly trusted hosts, such as api.clawsite.ai and api.dev.clawsite.ai.
  • Reject URLs containing embedded credentials, unexpected ports, fragments, or unapproved redirect destinations.
  • Configure curl to fail safely and avoid forwarding authentication headers across redirects. Prefer disabling redirects unless they are strictly required.
  • Do not add the bearer header until endpoint validation succeeds.
  • Clearly separate production and development configuration rather than documenting arbitrary API origins.
  • Rotate the API key immediately if a deployment request may have been sent to an untrusted destination.

T08 · Insecure Dependencies

Note
Location
package.json:13
Finding

Mutable dependency versions are used without a committed lockfile

Content
View full analysis

Vulnerability Details

File Location: package.json, lines 13-29
Vulnerability Type: Non-reproducible and mutable dependency resolution
Risk Level: Low

json
"dependencies": {
  "@aws-sdk/client-cloudfront": "^3.1007.0",
  "@aws-sdk/client-dynamodb": "^3.1007.0",
  "@aws-sdk/client-s3": "^3.1007.0",
  "@aws-sdk/lib-dynamodb": "^3.1007.0",
  "ulid": "^3.0.2",
  "yauzl": "^3.2.0"
},
"devDependencies": {
  "@types/aws-lambda": "^8.10.161",
  "@types/node": "^25.4.0",
  "@types/yauzl": "^2.10.3",
  "@types/yazl": "^3.3.1",
  "esbuild": "^0.27.3",
  "typescript": "^5.9.3",
  "vitest": "^4.0.18",
  "yazl": "^3.3.1"
}

Technical Analysis

Every declared package uses a caret range, allowing future compatible releases to be selected during installation. The audited project contains no package lockfile, so dependency versions and transitive dependency integrity are not fixed to the versions reviewed.

Consequently, two installations performed at different times may execute different package code. This expands the supply-chain attack surface because a compromised or otherwise unsafe release permitted by a declared range can be selected automatically.

No currently declared package was established as malicious during this audit. The vulnerability is the absence of deterministic resolution and integrity controls, not evidence that a listed dependency is already compromised.

Attack Path

  1. A dependency publisher account or package distribution channel is compromised.
  2. The attacker publishes a malicious version that satisfies one of the declared caret ranges.
  3. A developer or CI job performs a fresh package installation without a lockfile.
  4. The package manager resolves the newly published version.
  5. Malicious package code executes through an installation lifecycle hook, imported build dependency, test process, or bundled runtime path.

Impact Assessment

The obtainab ...[truncated 533 chars]

Remediation
View remediation

Remediation Suggestions

  • Generate and commit a package lockfile using the approved package manager.
  • Use npm ci in CI and release workflows so installations fail when the manifest and lockfile differ.
  • Pin security-critical build and deployment dependencies where operationally practical.
  • Review and deliberately approve lockfile changes during dependency updates.
  • Enable automated vulnerability, provenance, and package-integrity scanning.
  • Restrict or disable dependency lifecycle scripts in sensitive environments when they are unnecessary.
  • Use isolated, least-privileged CI workers and avoid exposing deployment credentials to dependency installation steps.
  • Periodically update dependencies through controlled pull requests rather than resolving new versions implicitly during production builds.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (24)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
80% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · SKILL.md (reported line 241)May include surrounding context.

md
**Idempotency note:** `/v1/register` is idempotent on MBID identity. Re-calling it with the same MBID-verified email (or partner-mode `mbidUserId`) returns the existing `accountId`, the same `apiKey` that was issued on first register, and the existing `sites`. There is no rotation API.

**⚠️ DANGER — only delete a site if the user *explicitly* asked to delete it:** if you genuinely need a fresh slug (rare — the user said "give me a new URL"), `DELETE /v1/sites/{siteId}` then re-register. This is **destructive and irreversible**: the deleted slug is permanently tombstoned (anti URL-takeover) and can never be re-used. The user loses any URL they previously shared. **Never** do this as a side-effect of error handling — only when the user has explicitly told you to delete the existing site.

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.

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.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The file provides copy-pastable commands that perform live Terraform applies, read a partner secret from AWS, and push code directly to production Lambda functions, but it does not prominently warn an agent or operator about production impact, rollback needs, or change-control expectations. In an agent-skill context, operational instructions like these are riskier because an autonomous or semi-autonomous agent could execute destructive or sensitive actions against live infrastructure with insufficient human confirmation.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
85% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · CLAUDE.md (reported line 112)May include surrounding context.

md
## Branching

- `main` — what's deployed to prod (auto-deploy is manual via `terraform apply` on prod workspace)
- `develop` — staging-equivalent; merges back to `main` after smoke tests
- Bug fixes / features land via `fix/*` or `feat/*` branches → develop → main

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README explicitly markets 'zero human interaction' deployment of publicly hosted websites but does not warn that deployments become internet-accessible production assets under a real domain. In an agent context, this increases the chance that an autonomous system publishes sensitive, unreviewed, misleading, or policy-violating content directly to the public without operator awareness.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 74)May include surrounding context.

text
3. POST the zip:

curl -X POST "$CLAWSITE_API_URL/v1/sites/$CLAWSITE_SITE_ID/deploy"
-H "Authorization: Bearer $CLAWSITE_API_KEY"
-H "Content-Type: application/zip"
--data-binary "@site.zip"

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 14)May include surrounding context.

json
"typecheck": "tsc --noEmit"
  },
  "dependencies": {
    "@aws-sdk/client-cloudfront": "^3.1007.0",
    "@aws-sdk/client-dynamodb": "^3.1007.0",
    "@aws-sdk/client-s3": "^3.1007.0",
    "@aws-sdk/lib-dynamodb": "^3.1007.0",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 15)May include surrounding context.

json
},
  "dependencies": {
    "@aws-sdk/client-cloudfront": "^3.1007.0",
    "@aws-sdk/client-dynamodb": "^3.1007.0",
    "@aws-sdk/client-s3": "^3.1007.0",
    "@aws-sdk/lib-dynamodb": "^3.1007.0",
    "ulid": "^3.0.2",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 16)May include surrounding context.

json
"dependencies": {
    "@aws-sdk/client-cloudfront": "^3.1007.0",
    "@aws-sdk/client-dynamodb": "^3.1007.0",
    "@aws-sdk/client-s3": "^3.1007.0",
    "@aws-sdk/lib-dynamodb": "^3.1007.0",
    "ulid": "^3.0.2",
    "yauzl": "^3.2.0"

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 17)May include surrounding context.

json
"@aws-sdk/client-cloudfront": "^3.1007.0",
    "@aws-sdk/client-dynamodb": "^3.1007.0",
    "@aws-sdk/client-s3": "^3.1007.0",
    "@aws-sdk/lib-dynamodb": "^3.1007.0",
    "ulid": "^3.0.2",
    "yauzl": "^3.2.0"
  },

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 18)May include surrounding context.

json
"@aws-sdk/client-dynamodb": "^3.1007.0",
    "@aws-sdk/client-s3": "^3.1007.0",
    "@aws-sdk/lib-dynamodb": "^3.1007.0",
    "ulid": "^3.0.2",
    "yauzl": "^3.2.0"
  },
  "devDependencies": {

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 19)May include surrounding context.

json
"@aws-sdk/client-s3": "^3.1007.0",
    "@aws-sdk/lib-dynamodb": "^3.1007.0",
    "ulid": "^3.0.2",
    "yauzl": "^3.2.0"
  },
  "devDependencies": {
    "@types/aws-lambda": "^8.10.161",

Unverifiable Dependency: yauzl has 1 known advisory(ies) (CVE-2026-31988 (yauzl contains an off-by-one error)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 22)May include surrounding context.

json
"yauzl": "^3.2.0"
  },
  "devDependencies": {
    "@types/aws-lambda": "^8.10.161",
    "@types/node": "^25.4.0",
    "@types/yauzl": "^2.10.3",
    "@types/yazl": "^3.3.1",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 23)May include surrounding context.

json
},
  "devDependencies": {
    "@types/aws-lambda": "^8.10.161",
    "@types/node": "^25.4.0",
    "@types/yauzl": "^2.10.3",
    "@types/yazl": "^3.3.1",
    "esbuild": "^0.27.3",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 24)May include surrounding context.

json
"devDependencies": {
    "@types/aws-lambda": "^8.10.161",
    "@types/node": "^25.4.0",
    "@types/yauzl": "^2.10.3",
    "@types/yazl": "^3.3.1",
    "esbuild": "^0.27.3",
    "typescript": "^5.9.3",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 25)May include surrounding context.

json
"@types/aws-lambda": "^8.10.161",
    "@types/node": "^25.4.0",
    "@types/yauzl": "^2.10.3",
    "@types/yazl": "^3.3.1",
    "esbuild": "^0.27.3",
    "typescript": "^5.9.3",
    "vitest": "^4.0.18",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 26)May include surrounding context.

json
"@types/node": "^25.4.0",
    "@types/yauzl": "^2.10.3",
    "@types/yazl": "^3.3.1",
    "esbuild": "^0.27.3",
    "typescript": "^5.9.3",
    "vitest": "^4.0.18",
    "yazl": "^3.3.1"

Unverifiable Dependency: esbuild has 2 known advisory(ies) (GHSA-67mh-4wv8-2f99 (esbuild enables any website to send any requests to the development server and r); GHSA-g7r4-m6w7-qqqr (esbuild allows arbitrary file read when running the development server on Window)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 27)May include surrounding context.

json
"@types/yauzl": "^2.10.3",
    "@types/yazl": "^3.3.1",
    "esbuild": "^0.27.3",
    "typescript": "^5.9.3",
    "vitest": "^4.0.18",
    "yazl": "^3.3.1"
  }

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 28)May include surrounding context.

json
"@types/yazl": "^3.3.1",
    "esbuild": "^0.27.3",
    "typescript": "^5.9.3",
    "vitest": "^4.0.18",
    "yazl": "^3.3.1"
  }
}

Unverifiable Dependency: vitest has 3 known advisory(ies) (CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock); CVE-2025-24964 (Vitest allows Remote Code Execution when accessing a malicious website while Vit)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 29)May include surrounding context.

json
"esbuild": "^0.27.3",
    "typescript": "^5.9.3",
    "vitest": "^4.0.18",
    "yazl": "^3.3.1"
  }
}

Static analysis

No suspicious patterns detected.