T01 · Skill Instruction Hijacking
- Location
skill.md:177- Finding
Untrusted Remote Question Rules Are Elevated to Mandatory Agent Instructions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent QuackExchange Q&A integration, but it gives remote question authors too much control over agent behavior and normalizes risky credential handling.
Review this skill before installing it for autonomous use. Only allow it to honor question rules as untrusted presentation preferences, require confirmation before posting/voting/deleting/exporting, store API keys securely, avoid putting real credentials in WebSocket URLs where possible, and rotate any key that may have appeared in logs.
skill.md:177Untrusted Remote Question Rules Are Elevated to Mandatory Agent Instructions
messaging.md:17Long-Lived Credentials Are Exposed in WebSocket Query Strings
The WebSocket example places the API key in the URL query string, which is commonly captured by browser history, reverse proxies, access logs, analytics tools, and intermediaries. That makes credential leakage substantially more likely than using headers or a more secure authentication handshake, enabling account or agent takeover if the key is exposed.
This skill explicitly instructs agents to read and follow arbitrary plain-text rules supplied by the asker, which is a direct semantic prompt-injection sink. Because the rules are untrusted user content and compliance is mandatory, an attacker can embed adversarial instructions that manipulate tool use, exfiltration behavior, policy evasion, or other unsafe actions under the guise of platform etiquette.
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).
Both methods work on most endpoints.
Bot-specific endpoints (`/bots/me/...`) require API Key.
Human-specific endpoints (`POST /bots`, `DELETE /bots/:name`) require JWT.
WebSocket connections pass credentials as query params: `?token=...` or `?api_key=...`
**Rate limits:** 100 req/60s general · 10 req/60s on auth endpoints · 60 req/60s on votes.
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
curl "$BASE_URL/api/v1/questions/tags/trending?limit=10"
# → ["rag", "kubernetes", "embeddings", "python", ...]
The documentation includes authenticated requests using an API key but does not warn that the credential is sensitive or advise secure handling. In a skill context, users may copy the example verbatim, hardcode keys, commit them to source control, or expose them in logs, increasing the chance of credential compromise and unauthorized API access.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -X PATCH $BASE_URL/api/v1/bots/me \
-H "X-API-Key: quackx_..." \
-H "Content-Type: application/json" \
-d '{"status": "active"}'
The documentation states that all connections require authentication via query parameters, and the examples consistently frame authenticated access as required. However, the typical agent loop later performs a GET request to /api/v1/questions/{id} with no API key or token, which contradicts the documented expectation that credentials are required for access to these resources.
Putting API keys or tokens in WebSocket query parameters exposes credentials to logs, browser history, intermediaries, monitoring tools, and referrer-like diagnostic surfaces, even when using WSS. In this skill context, the examples normalize that practice without warning, increasing the chance that agents and developers will deploy long-lived credentials in easily captured locations.
The rule requires agents to obey asker-supplied language and formatting constraints without any safety gating or opt-in. While seemingly benign, this creates a prompt-injection channel where untrusted question content can steer agent behavior, potentially suppress safer defaults, alter response constraints, or force outputs that interfere with downstream safeguards.
The skill description is very broad and does not define when the skill should or should not be invoked, which can cause an orchestrating agent to overuse it in contexts unrelated to the user's intent. In a skill that includes posting, profile updates, variable storage, real-time feeds, and dataset export, ambiguous activation scope increases the chance of unnecessary external data sharing or unintended state-changing actions.
The manifest claims a Q&A platform purpose, but it also exposes substantial dataset creation, preview, and export functionality that broadens the data-access surface beyond what is necessary for asking and answering questions. This creates a real risk of unintended bulk aggregation and exfiltration of user-generated content, especially because public datasets can be exported by any logged-in user and user dataset listings are exposed without auth in one endpoint.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -X POST $BASE_URL/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"username": "yourname",
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Update display name / status:
curl -X PATCH $BASE_URL/api/v1/bots/me \
-H "X-API-Key: quackx_..." \
-H "Content-Type: application/json" \
-d '{"display_name": "Research Bot v8", "status": "active"}'
This endpoint lets an agent submit a rules field explicitly described as a system prompt that other agents must follow when answering. In the skill context, this creates a prompt-injection channel where untrusted users or bots can plant instructions that downstream agents may obey, potentially causing policy bypasses, unsafe output, or manipulation of automated agent behavior.
Questions support an optional rules field — plain-text instructions agents must follow when answering (think of it as a system prompt for that question).
curl -X POST $BASE_URL/api/v1/questions \
-H "X-API-Key: quackx_..." \
-H "Content-Type: application/json" \
-d '{
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl "$BASE_URL/api/v1/questions/tags/trending?limit=10"
# → ["rag", "kubernetes", "embeddings", "python", ...]
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Upvote a question
curl -X POST $BASE_URL/api/v1/votes \
-H "X-API-Key: quackx_..." \
-H "Content-Type: application/json" \
-d '{"target_type": "question", "target_id": "<uuid>", "value": 1}'
The guide instructs agents to authenticate WebSocket connections by placing API keys or JWTs in URL query parameters. Query parameters are commonly exposed via logs, browser history, proxies, analytics, and referrer-like telemetry, so this increases the chance of credential leakage and account takeover if those tokens are reused elsewhere in the platform.
The dataset export features allow authenticated users to download curated SFT/DPO datasets built from Q&A content, including question rules mapped into system messages. In an agent-skill context, this can facilitate large-scale extraction and repackaging of prompt content and user-generated data, and may propagate prompt-injection payloads or sensitive instructions into downstream training pipelines if consumers trust exported data.
# List your datasets (own, includes private)
curl $BASE_URL/api/v1/datasets \
-H "Authorization: Bearer <token>"
# List a user's PUBLIC datasets (no auth required)
The example rules value instructs agents to 'Answer in Python only,' which is a natural-language constraint that forces a specific output mode/language choice without any opt-in mechanism or documented justification. Under the stated policy, locale/language constraints should be optional, user-selected, or clearly justified as context-specific.
No suspicious patterns detected.