Skip to content

fix: validate Origin header on WebSocket /run_live endpoint#4951

Closed
YouFoxGirl wants to merge 2 commits intogoogle:mainfrom
YouFoxGirl:fix-4947-websocket-origin
Closed

fix: validate Origin header on WebSocket /run_live endpoint#4951
YouFoxGirl wants to merge 2 commits intogoogle:mainfrom
YouFoxGirl:fix-4947-websocket-origin

Conversation

@YouFoxGirl
Copy link
Copy Markdown

Fixes #4947

Summary

WebSocket upgrades are not protected by FastAPI's CORS middleware, so any webpage could establish a WebSocket connection to the local ADK dev server and chain it with /builder/save to achieve RCE.

The fix adds explicit Origin validation to the /run_live WebSocket handler:

  • When allow_origins is configured: accept only origins in the list or matching a regex pattern (consistent with CORS middleware behavior)
  • When allow_origins is not configured: accept only same-origin or no-Origin-header requests (non-browser clients), rejecting cross-origin

Changes

  • adk_web_server.py: Parse and store allow_origins at app creation time for WebSocket reuse
  • /run_live WebSocket handler: validate Origin header before accepting the connection, close with code 1008 if rejected

Security Impact

Prevents CSRF-to-RCE attack chain where a malicious webpage could: upload a malicious agent.py via /builder/save, create a session, and trigger code execution via WebSocket.

Added 4 unit tests covering same-origin, cross-origin, configured origins, and unlisted origins.

FoxClaw Bot added 2 commits March 22, 2026 10:30
Use except Exception: instead of bare except: in the live agent API
sample.
WebSocket upgrades are not protected by CORS middleware, so any webpage
could establish a WebSocket connection to the local ADK dev server and
chain it with /builder/save to achieve RCE.

The fix adds explicit Origin validation to the /run_live WebSocket handler:
- When allow_origins is configured: accept only origins in the list or
  matching a regex pattern (consistent with CORS middleware behavior)
- When allow_origins is not configured: accept only same-origin or
  no-Origin-header requests (non-browser clients), rejecting cross-origin

Fixes google#4947
@google-cla
Copy link
Copy Markdown

google-cla bot commented Mar 22, 2026

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@rohityan rohityan self-assigned this Mar 23, 2026
@rohityan rohityan added live [Component] This issue is related to live, voice and video chat request clarification [Status] The maintainer need clarification or more information from the author labels Mar 23, 2026
@rohityan
Copy link
Copy Markdown
Collaborator

Hi @YouFoxGirl , Thank you for your contribution! It appears you haven't yet signed the Contributor License Agreement (CLA). Please visit https://cla.developers.google.com/ to complete the signing process. Once the CLA is signed, we'll be able to proceed with the review of your PR. Thank you!

@sasha-gitg sasha-gitg closed this Mar 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

live [Component] This issue is related to live, voice and video chat request clarification [Status] The maintainer need clarification or more information from the author

Projects

None yet

Development

Successfully merging this pull request may close these issues.

WebSocket /run_live endpoint lacks Origin validation, enabling CSRF-to-RCE

3 participants