security: sanitize DOM content in LLM prompts to mitigate indirect prompt injection#2063
security: sanitize DOM content in LLM prompts to mitigate indirect prompt injection#2063johnpippett wants to merge 1 commit intobrowserbase:mainfrom
Conversation
…injection Adds sanitizeDomForPrompt() to wrap raw DOM/webpage content in clear start/end boundaries and escape any boundary-breaking sequences inside the content. This addresses the critical finding of unsanitized DOM content being injected directly into LLM prompts. Affected paths: - buildExtractUserPrompt (extract inference) - buildObserveUserMessage (observe / act inference) - ariaTree tool toModelOutput (agent tool output) Audit ref: 31.08 AI Tooling Security Audit Findings — browserbase/stagehand Critical: DOM prompt injection via unsanitized DOM content.
|
|
This PR is from an external contributor and must be approved by a stagehand team member with write access before CI can run. |
There was a problem hiding this comment.
No issues found across 3 files
Confidence score: 5/5
- Automated review surfaced no issues in the provided summaries.
- No files require special attention.
Architecture diagram
sequenceDiagram
participant Agent as Agent / Orchestrator
participant Browser as Browser Instance
participant PromptLib as Prompt Library
participant AriaTool as AriaTree Tool
participant LLM as LLM Provider
Note over Agent,LLM: DOM Extraction & Sanitization Flow
rect rgb(240, 248, 255)
Note right of Agent: Extraction / Observation Flow
Agent->>Browser: Get Page DOM / Accessibility Tree
Browser-->>Agent: Raw DOM String
Agent->>PromptLib: buildExtractUserPrompt(instruction, rawDom)
PromptLib->>PromptLib: NEW: sanitizeDomForPrompt(rawDom)
Note right of PromptLib: Escapes end-markers &<br/>wraps in <<<<STAGEHAND_DOM_BEGIN>>>>
PromptLib-->>Agent: ChatMessage (Sanitized)
Agent->>LLM: POST /chat/completions
end
rect rgb(255, 240, 245)
Note right of Agent: Tool Execution Flow (ariaTree)
LLM-->>Agent: Tool Call: ariaTree()
Agent->>AriaTool: execute()
AriaTool->>Browser: Capture Accessibility Tree
Browser-->>AriaTool: Tree Content
AriaTool->>PromptLib: NEW: sanitizeDomForPrompt(content)
PromptLib-->>AriaTool: Sanitized Content
AriaTool-->>Agent: Tool Output (Sanitized)
Agent->>LLM: Submit Tool Results
end
Note over PromptLib: Security Detail: sanitizeDomForPrompt()<br/>1. Replace "<<<<STAGEHAND_DOM_END>>>>" with escaped version<br/>2. Wrap content in STAGEHAND_DOM boundaries
Summary
Fixes a Critical security finding: indirect prompt injection via unsanitized DOM content being fed directly into LLM prompts.
Changes
sanitizeDomForPrompt()helper inpackages/core/lib/prompt.tsthat wraps raw DOM/webpage content in clear<<<<STAGEHAND_DOM_BEGIN>>>>/<<<<STAGEHAND_DOM_END>>>>boundaries and escapes any embedded end-marker sequences to prevent boundary breakout.buildExtractUserPrompt(extract inference)buildObserveUserMessage(observe / act inference)ariaTreetooltoModelOutput(agent tool output)Test Results
prompt-sanitize-dom.test.ts)prompt-observe-variables,snapshot-a11y-tree-utils,snapshot-capture-orchestration,agent-execution-model,llm-middleware)Audit Reference
31.08 AI Tooling Security Audit Findings—browserbase/stagehand[Critical / Trivial / Single-user]— Indirect prompt injection via unsanitized DOM content (packages/core/lib/prompt.ts,packages/core/lib/v3/agent/tools/ariaTree.ts,packages/core/lib/v3/handlers/actHandler.ts)Files Changed
packages/core/lib/prompt.tspackages/core/lib/v3/agent/tools/ariaTree.tspackages/core/tests/unit/prompt-sanitize-dom.test.tsSummary by cubic
Fixes a critical security issue: sanitizes DOM content before it enters LLM prompts to prevent indirect prompt injection. Adds clear start/end boundaries and escapes embedded markers; applied across extract, observe, and
ariaTreetool flows.sanitizeDomForPrompt()inpackages/core/lib/prompt.tsto wrap DOM with<<<<STAGEHAND_DOM_BEGIN>>>>/<<<<STAGEHAND_DOM_END>>>>and escape nested end markers.buildExtractUserPrompt,buildObserveUserMessage, andpackages/core/lib/v3/agent/tools/ariaTree.tsoutput.Written for commit 26a5b7d. Summary will update on new commits. Review in cubic