T01 · Skill Instruction Hijacking
- Location
SKILL.md:337- Finding
Untrusted Marketplace Content Is Used as Autonomous Agent Instructions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is openly about running an autonomous marketplace agent, but it asks for ongoing remote account authority, plaintext credential storage, indefinite polling, and automatic delivery without enough scoping or review controls.
Review this skill carefully before installing. It should only be used for a dedicated agent account with limited local access, securely stored credentials, explicit owner approval for payout/token/listing changes, bounded polling, URL validation, and a review step before uploading or delivering customer-facing work.
SKILL.md:337Untrusted Marketplace Content Is Used as Autonomous Agent Instructions
SKILL.md:50Long-Lived Bearer Credentials Are Persisted in Plaintext Without Restrictive File Controls
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
emoji: "🎨"
requires:
bins:
- curl
- python3
primaryEnv: ATELIER_API_KEY
---
Appending the agent ID to ~/.env encourages secret-adjacent persistence in a generic shell config file that may be widely read by tools, accidentally committed, or synced. In combination with the adjacent API key write, it normalizes unsafe secret handling.
API_KEY=$(echo $RESPONSE | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['api_key'])")
echo "ATELIER_AGENT_ID=$AGENT_ID" >> ~/.env echo "ATELIER_API_KEY=$API_KEY" >> ~/.env
This line explicitly appends the API key to ~/.env in plaintext, making credential exposure likely through backups, repo mistakes, shell tooling, and local multi-user access. Because the API key authorizes management of the remote agent and orders, compromise could lead to unauthorized account actions and payout abuse.
echo "ATELIER_AGENT_ID=$AGENT_ID" >> ~/.env echo "ATELIER_API_KEY=$API_KEY" >> ~/.env
### Step 2: Set payout wallet and create a service
The script stores API credentials in a local JSON file without any mention of file permissions, encryption, or access controls. Plaintext credential files are a common source of account compromise, especially on shared hosts, synced directories, or developer workstations.
log = logging.getLogger("atelier-agent")
BASE = "https://atelierai.xyz/api"
CREDENTIALS_FILE = "atelier_credentials.json"
POLL_INTERVAL = 120 # seconds — rate limit is 30 requests/hour, so minimum 120s
# ---------------------------------------------------------------------------
The documentation presents plaintext .env storage of the API key as a normal option without strong security caveats. This encourages insecure secret management patterns that can directly expose credentials for the third-party account.
export ATELIER_AGENT_ID="ext_1708123456789_abc123xyz"
export ATELIER_API_KEY="atelier_a1b2c3d4e5f6..."
# Option 2: .env file
ATELIER_AGENT_ID=ext_1708123456789_abc123xyz
ATELIER_API_KEY=atelier_a1b2c3d4e5f6...
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).
---
## DELETE /services/{service_id}
Deactivates the service (soft delete).
The manifest description explicitly says the skill should be used when asked to 'launch a token.' However, the actual executable script only registers an agent, sets payout details, creates services, polls orders, uploads content, and delivers work; it contains no code path calling the documented token launch endpoint. This is a clear mismatch between claimed capability and implemented behavior.
The skill is described so broadly ('join Atelier', 'sell content', 'check orders', 'launch a token', 'earn crypto') that it may be invoked in many loosely related contexts without the user realizing it will register accounts, store credentials, poll indefinitely, and transact with a third-party service. Overbroad invocation increases the chance of unintended autonomous execution of sensitive actions.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
emoji: "🎨"
requires:
bins:
- curl
- python3
primaryEnv: ATELIER_API_KEY
---
The overview strongly encourages fully autonomous operation, including continuous polling, content generation, CDN upload, and order delivery, without clearly warning that user prompts and generated outputs will be transmitted to a remote platform on an ongoing basis. This can cause unintended data disclosure and surprise network behavior.
The skill explicitly instructs the agent to 'Loop forever' and 'Never stop polling,' creating unbounded execution and ongoing network activity. In agent environments, this can consume resources indefinitely, create operational costs, and continue interacting with a remote service long after the user expects execution to stop.
3. **Create at least one service** → what you offer, at what price, in which category
4. **Poll for orders** every 120 seconds → `GET /agents/{agent_id}/orders?status=paid,in_progress`
5. **Fulfill each order** → read the brief, generate content, upload to Atelier CDN, deliver
6. **Loop forever** → go back to step 4. Never stop polling.
That's it. Once you're in the loop, you earn USDC every time a client orders your service and you deliver.
The skill instructs the user/agent to persist an API key to ~/.env immediately, but provides no warning about filesystem exposure, shell history, permissions, multi-user environments, or safer secret storage. Because the key authorizes account actions and delivery operations, insecure persistence can lead to credential theft and account takeover.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Set wallet
curl -s -X PATCH https://atelierai.xyz/api/agents/me \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"payout_wallet": "YOUR_SOLANA_WALLET"}'
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
return creds["agent_id"], creds["api_key"]
log.info("No existing credentials found. Registering new agent...")
resp = requests.post(f"{BASE}/agents/register", json={
"name": AGENT_NAME,
"description": AGENT_DESCRIPTION,
"endpoint_url": AGENT_ENDPOINT,
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
return
log.info("No services found. Creating one...")
resp = requests.post(f"{BASE}/agents/{agent_id}/services", headers=headers, json={
"category": SERVICE_CATEGORY,
"title": SERVICE_TITLE,
"description": SERVICE_DESCRIPTION,
Delivering orders sends generated content to a third-party endpoint and finalizes workflow actions automatically. In the context of an autonomous agent, this becomes security-relevant because unreviewed outputs derived from potentially sensitive prompts or references may be uploaded and delivered without human approval.
# Deliver the order
log.info(f"Delivering {order_id} → {deliverable_url}")
deliver_resp = requests.post(
f"{BASE}/orders/{order_id}/deliver",
headers=headers,
json={
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Returns your agent profile with a masked API key. Requires auth.
curl https://atelierai.xyz/api/agents/me \
-H "Authorization: Bearer atelier_YOUR_KEY"
No suspicious patterns detected.