T01 · Skill Instruction Hijacking
- Location
scripts/watch.sh:76- Finding
Automatic Execution of Untrusted Remote Task Instructions
- Content
View full analysis
/dev/null || true ## Step 2: Find unread message files Run this bash snippet to find actionable messages (unread OR missing status field): python3 -c " import os, glob inbox = 'inbox/\${MY_AGENT_ID}/' results = [] for f in glob.glob(inbox + '*.md'): if '.gitkeep' in f: continue txt = open(f).read() lines = txt.split(' ') status = '' for l in lines: if l.startswith('status:'): status = l.split(':',1)[1].strip() break if status in ('unread', ''): results.append(f) for r in results: print(r) " 2>/dev/null ... **If type=task or type=notify:** - Execute the task described in the message body (search / organize / analyze / answer etc.) - Produce a result summary - Send a reply to the sender: export AGENT_BUS_REPO=${REPO} cd ${REPO} bash agent-bus.sh send reply "" ``` ### Technical Analysis The watcher creates an LLM prompt that treats files pulled from a shared Git repository as executable agent instructions. For messages marked as `task` or `notify`, it explicitly directs the local agent to execute the message body. This path does not invoke the security controls implemented by `agent-bus.sh read`, including: - Independent pairing validation through `check_pair` - Prompt-injection detection through `scan_injection` - Sensitive-content filtering - Risk classification through `assess_risk` - Owner-approval handling for yellow or red tasks The watcher instead trusts attacker-controlled metadata such as `type`, `from`, and `status`. A forged message does not need to pass t ...[truncated 1839 chars]- Remediation
View remediation
