From 13d952dc9d2e1a1bae27413e6771a6e3480c7fa6 Mon Sep 17 00:00:00 2001 From: Simon <10131203+gaomeng1900@users.noreply.github.com> Date: Thu, 2 Apr 2026 18:53:59 +0800 Subject: [PATCH] fix(ext): guard postMessage listeners against iframe sources Add `e.source !== window` check to both content script and main-world script message handlers, preventing iframes from injecting or intercepting extension bridge messages. --- packages/extension/src/entrypoints/content.ts | 2 ++ packages/extension/src/entrypoints/main-world.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/extension/src/entrypoints/content.ts b/packages/extension/src/entrypoints/content.ts index 1bcfc8a..e7913bb 100644 --- a/packages/extension/src/entrypoints/content.ts +++ b/packages/extension/src/entrypoints/content.ts @@ -46,6 +46,8 @@ async function exposeAgentToPage() { let multiPageAgent: InstanceType | null = null window.addEventListener('message', async (e) => { + if (e.source !== window) return + const data = e.data if (typeof data !== 'object' || data === null) return if (data.channel !== 'PAGE_AGENT_EXT_REQUEST') return diff --git a/packages/extension/src/entrypoints/main-world.ts b/packages/extension/src/entrypoints/main-world.ts index b401beb..61973e9 100644 --- a/packages/extension/src/entrypoints/main-world.ts +++ b/packages/extension/src/entrypoints/main-world.ts @@ -45,6 +45,8 @@ export default defineUnlistedScript(() => { const promise = new Promise((resolve, reject) => { function handleMessage(e: MessageEvent) { + if (e.source !== window) return + const data = e.data if (typeof data !== 'object' || data === null) return if (data.channel !== 'PAGE_AGENT_EXT_RESPONSE') return