T09 · Insecure Skill Coding Practices
- Location
clawprint-challenge.sh:98- Finding
Untrusted Values Are Interpolated Directly into JSON Request Bodies
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is transparent about using a remote verification service, but it recommends using a weak AI-vs-human challenge as a gate for sensitive credentials and sends a reusable secret to a configurable server URL.
Install only if you will use it as a non-authoritative capability signal, not as proof of identity or permission to receive secrets. Do not let it automatically release API keys, credentials, or protected resources; keep CLAWPRINT_SERVER_URL pinned to a trusted HTTPS service you control, protect and rotate CLAWPRINT_SECRET_KEY if exposed, and require a separate authenticated authorization decision before any sensitive action.
clawprint-challenge.sh:98Untrusted Values Are Interpolated Directly into JSON Request Bodies
SKILL.md:21Reverse-CAPTCHA Completion Is Incorrectly Used as Authorization for Sensitive Resources
clawprint-challenge.sh:132Reusable Secret Key Can Be Exfiltrated Through a Configurable Server URL
The core design of the skill is to exclude humans and grant access only to entities that can solve machine-oriented challenges, with no user choice or policy justification. This is dangerous because it operationalizes discriminatory access control and encourages sharing sensitive resources based on an unreliable and easily gameable 'AI verification' concept.
The workflow explicitly recommends denying access to humans as a routine step before sharing secrets or granting service access. In context, this makes the skill more dangerous because it couples exclusionary gating with sensitive actions like releasing API keys, creating a path to unsafe disclosure based on a bogus verification signal.
The skill invokes shell commands (curl, jq) and depends on sensitive environment variables, but it does not declare an explicit tool scope such as permissions or allowed-tools. This weakens least-privilege controls and can allow unintended shell/network execution if the skill is invoked in environments that rely on manifest scoping for enforcement.
The skill is built around transmitting data to an external server and requires both site and secret keys to do so. External transmission is especially sensitive here because the skill encourages use in conversations involving access control and secrets, increasing the chance that metadata, challenge results, or operational details are sent to a third-party service without adequate review.
emoji: "\U0001F43E"
requires:
bins:
- curl
- jq
env:
- CLAWPRINT_SERVER_URL
The activation guidance is broad enough that the skill may trigger whenever a conversation mentions verification or proving identity, even outside appropriate security workflows. That can lead to unnecessary external requests and inappropriate gating decisions based on a flawed AI-vs-human test.
The sample trigger phrases are vague and generic, increasing the chance of accidental invocation from ordinary conversation. In this skill, accidental activation is more dangerous because it can initiate external transmission and enforce discriminatory access control based on whether the other party appears to be human.
The verify step sends challenge identifiers and answers to an external service. Although this is expected for the feature, it is still a true security concern because the skill may be invoked broadly and used in sensitive workflows, causing external disclosure of interaction data and creating dependency on an untrusted remote verifier.
Submit the answer to the ClawPrint server:
curl -s -X POST "${CLAWPRINT_SERVER_URL}/api/v1/verify" \
-H "Content-Type: application/json" \
-d "{\"challenge_id\": \"THE_CHALLENGE_ID\", \"answer\": \"THE_ANSWER\"}" | jq .
The validate step transmits the CLAWPRINT_SECRET_KEY to an external server in the request body. Even if intended, this is high risk because it normalizes sending a long-lived secret off-box to a third-party endpoint, increasing exposure through logs, debugging, interception points, or service compromise.
For additional security, validate with your secret key:
curl -s -X POST "${CLAWPRINT_SERVER_URL}/api/v1/validate" \
-H "Content-Type: application/json" \
-d "{\"challenge_id\": \"THE_CHALLENGE_ID\", \"secret_key\": \"${CLAWPRINT_SECRET_KEY}\"}" | jq .
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
check_env "issue"
local response
response=$(curl -sf -X POST "${CLAWPRINT_SERVER_URL}/api/v1/challenge" \
-H "Content-Type: application/json" \
-d "{\"site_key\": \"${CLAWPRINT_SITE_KEY}\"}")
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
check_env "verify"
local response
response=$(curl -sf -X POST "${CLAWPRINT_SERVER_URL}/api/v1/verify" \
-H "Content-Type: application/json" \
-d "{\"challenge_id\": \"${challenge_id}\", \"answer\": \"${answer}\"}")
This request sends the private CLAWPRINT_SECRET_KEY in the POST body to a configurable external URL. Because CLAWPRINT_SERVER_URL is fully environment-controlled and not constrained, a misconfiguration or maliciously supplied endpoint could capture the secret key and allow unauthorized validation actions or broader compromise of the ClawPrint integration.
check_env "validate"
local response
response=$(curl -sf -X POST "${CLAWPRINT_SERVER_URL}/api/v1/validate" \
-H "Content-Type: application/json" \
-d "{\"challenge_id\": \"${challenge_id}\", \"secret_key\": \"${CLAWPRINT_SECRET_KEY}\"}")
No suspicious patterns detected.