T01 · Skill Instruction Hijacking
- Location
scripts/stream.py:108- Finding
Untrusted Remote Messages Are Passed Directly to the Default Local Agent
- Content
View full analysis
Vulnerability Details
File Location:
scripts/stream.py:108-109, 145-157;scripts/poll.py:120-123, 166-178
Vulnerability Type: Indirect prompt injection across a remote-to-local trust boundary
Risk Level: HighVulnerable Code
scripts/stream.py:108-109:python parser.add_argument("--openclaw-agent", default="main", help="OpenClaw agent name (default: main)") parser.add_argument("--timeout", type=int, default=120, help="Per-message agent timeout (default: 120s)")scripts/stream.py:145-157:python else: print(f" respond to {short_id}: {msg.content[:60]!r}", flush=True) try: response = call_openclaw_agent( message=msg.content, session_id=f"grupr:{args.grupr_id}", agent_name=args.openclaw_agent, timeout=args.timeout, ) sent = client.send_message(args.grupr_id, response) print(f" posted reply {sent.message_id[:8]} ({len(response)} chars)") processed += 1scripts/poll.py:120-123:python parser.add_argument( "--openclaw-agent", default="main", help="OpenClaw agent name to invoke (default: main)", )scripts/poll.py:166-178:python print(f" respond to {short_id}: {msg.content[:60]!r}") if args.dry_run: print(f" (dry-run) would call openclaw agent") last_cursor = msg.created_at continue try: response = call_openclaw_agent( message=msg.content, session_id=f"grupr:{args.grupr_id}", agent_name=args.openclaw_agent, timeout=args.timeout, )Technical Analysis
Messages controlled by remote Grupr participants are forwarded unchanged as instructions to a local OpenClaw Agent. The Skill does not delimit the message as untrusted content, enforce an allowlisted task, inspect attempted instruction overrides, require approval before sensitive tool opera ...[truncated 2049 chars]
- Remediation
View remediation
Remediation Suggestions
- Default to a dedicated Grupr Agent rather than
main. - Configure that Agent without shell, filesystem, credential, browser-session, or unrestricted network tools unless explicitly required.
- Treat every Grupr message as untrusted data and wrap it in a fixed instruction that prohibits following embedded requests to change policy, inspect secrets, or invoke unrelated tools.
- Add an allowlisted task policy defining the actions the bridge may perform.
- Require explicit user confirmation before tool invocation, sensitive data access, or transmission of potentially confidential output.
- Use isolated sessions per conversation and, where appropriate, per participant or message. Provide a way to clear potentially poisoned session context.
- Apply output filtering before automatically posting responses to Grupr.
- Document the remote prompt-injection threat prominently and warn users not to connect a privileged primary Agent.
- Default to a dedicated Grupr Agent rather than
