Security Alert: Confirmed Malware
Search Copilot AI Assistant for Chrome
ID: bbdnohkpnbkdkmnkddobeafboooinpla
Supported Languages
Extension Info & Metadata
Publisher Contextual Analysis
- Author
- ai.techprosperityView Profile
- Privacy
- Privacy Policy
- MX records exist
- Yes
- Domain exists
- Yes
- Is disposable
- No
- Is role-based
- No
- Mailbox exists
- Yes
Display answers from Search Copilot AI Assistant directly next to Google results
Display answers from Search Copilot AI Assistant directly next to Google results. Copilot, the new LLM from Microsoft, enhances your search experience effortlessly. This extension provides a convenient way to access AI-generated summaries of your search queries while allowing you to deepen your search by following Google links as usual. Main Features: ✔ Enhance Your Search: Upgrade your familiar search engine with smart AI integration. ✔ Ask Any Question: Search Copilot AI will browse the web and deliver intelligent answers. ✔ Compatible with Major Search Engines: Works seamlessly with Google, Bing, DuckDuckGo, Ecosia, and Brave Search. ✔ Dark Mode Adaptation: Enjoy a visually comfortable experience with light or dark mode. Customizability: ✔ Instant or On-Demand Answers: Choose to generate answers instantly when you search or trigger them as needed. ✔ Conversation Styles: Select from "Balanced", "Precise", and "Creative" styles powered by GPT-4. Premium Features: ☆ Continue Conversations with Copilot: Maintain dialogue directly within the Google results page. ☆ Save and Revisit Conversations: Save your conversations and return to them later on the Copilot web page. ☆ Disable Internal Searches: Turn off internal searches by Copilot to save time. Search Copilot AI Assistant for Chrome is your ultimate companion for a smarter, more efficient search experience. Whether you seek quick answers or in-depth information, Copilot enhances your online search journey.
declarativeNetRequest rule overrides User-Agent, Sec-CH-UA, Sec-CH-UA-Arch, Sec-CH-UA-Bitness, Sec-CH-UA-Full-Version-List and a base64 origin-trial token to impersonate Microsoft Edge 112 on every bing.com main_frame navigation. This is browser/client-fingerprint spoofing performed silently against the user's outbound traffic to evade Bing's browser-gated Copilot access controls.
[ { "id": 1, "priority": 1, "action": { "type": "modifyHeaders", "requestHeaders": [ { "header": "User-Agent", "operation": "set", "value": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48" }, { "header": "Useragentreductionoptout", "operation": "set", "value": "A7kgTC5xdZ2WIVGZEfb1hUoNuvjzOZX3VIV/BA6C18kQOOF50Q0D3oWoAm49k3BQImkujKILc7JmPysWk3CSjwUAAACMeyJvcmlnaW4iOiJodHRwczovL3d3dy5iaW5nLmNvbTo0NDMiLCJmZWF0dXJlIjoiU2VuZEZ1bGxVc2VyQWdlbnRBZnRlclJlZHVjdGlvbiIsImV4cGlyeSI6MTY4NDg4NjM5OSwiaXNTdWJkb21haW4iOnRydWUsImlzVGhpcmRQYXJ0eSI6dHJ1ZX0=" }, { "header": "Sec-CH-UA", "operation": "set", "value": "\"Chromium\";v=\"112\", \"Microsoft Edge\";v=\"112\", \"Not:A-Brand\";v=\"99\"" } ] }, "condition": { "regexFilter": ".*bing\\.com.*", "resourceTypes": [ "main_frame" ] } }]The background service worker exposes an unauthenticated `fetch` proxy: any content script (injected on every https://*/* page) can post `{action:'fetch', url, params}` and the SW will issue an arbitrary cross-origin request with the extension's `<all_urls>` privileges, returning the body to the page. This is a CORS/origin-bypass primitive that any compromised or malicious page-side code can abuse for SSRF, credentialed scraping, and exfiltration.
async function handleActionFetch(action) { const response = await fetch(action.url, action.params && JSON.parse(action.params)) .catch(e => ({ errorInBackgroundScript: true, error: e.toString() })); if (response.type === "opaqueredirect") { return { status: 302 }; } if (!response.ok) return { status: response.status, ...(response.text && { body: response.text() }) }; const contentType = response.headers.get('content-type') ?? ''; if (contentType.startsWith("application/json")) { const text = await response.text(); try { return JSON.parse(text); } catch (e) { return text; }; } if (contentType.startsWith("text/event-stream")) { eventStreams.push(response.body.getReader()); return { eventStream: true, id: eventStreams.length - 1 }; } return response.text();}The service worker uses webRequest with the `extraHeaders` opt-in to capture the full outgoing request headers for bing.com (including Cookie, Authorization and other normally-redacted values) and persists them verbatim into chrome.storage.local under `bing_head_rq`. Storing a user's authenticated Bing session headers on disk is sensitive data collection that goes beyond what the chat UX needs and exposes the credentials to any other code running in the extension's storage scope.
chrome.webRequest.onBeforeSendHeaders.addListener( function(e) { chrome.storage.local.set({ bing_head_rq: JSON.stringify(e.requestHeaders) }) .then(() => {}); }, { urls: ["https://bing.com/"] }, ["requestHeaders", "extraHeaders"]);Generic WebSocket proxy: any caller can request `{action:'websocket', url, toSend}` and the background opens an arbitrary WebSocket to any URL, then streams data back. Combined with the `<all_urls>` content script and the fetch-proxy, this gives the extension (or anything that can talk to it) a fully bidirectional, origin-less network channel — a strong remote command-and-control / data-exfiltration primitive.
async function handleActionWebsocket(action, tryTimes = 3) { const { socketID, url, toSend } = action; if (socketID == null) { let ws = null; try { ws = new WebSocket(url); } catch (error) { if (tryTimes <= 0) return { error: error.toString() }; await new Promise(resolve => setTimeout(resolve, 500)); return handleActionWebsocket(action, tryTimes - 1); } ws.stream = new Stream(); websockets.push(ws); ws.onopen = () => { if (toSend) ws.send(toSend); } ws.onmessage = ({ data }) => { ws.stream.write(data); } ws.onclose = ({ wasClean }) => { ws.stream.write(`{wasClean:${wasClean}}`); }; return { socketID: websockets.length - 1 }; } const ws = websockets[socketID]; if (!ws) return { error: `Error: websocket ${socketID} not available` }; if (toSend) { ws.send(toSend); return { status: 'Success' }; } return ws.stream.read().then((packet) => ({ readyState: ws.readyState, packet }));}This content script is registered to run at document_start inside an iframe pointed at a specific bing.com favicon URL, and accepts a list of script URLs from postMessage and inserts them as `<script src=...>` tags into the bing.com document. This is dynamic script injection executing inside bing.com's web origin — a remote-code-loading pattern that is normally forbidden in MV3, deliberately constructed to bypass that restriction by trampolining through bing.com.
(() => { window.parent.postMessage('iframe-script-ready', '*'); window.addEventListener('message', onReceiveMessageFromParent); function onReceiveMessageFromParent(event) { if (event.origin !== new URL(chrome.runtime.getURL("")) .origin) return; const data = event.data; if (!('scripts' in data)) return; data.scripts.forEach(insertScript); acknowledge(data.messageId, data.scriptElementId); window.removeEventListener('message', onReceiveMessageFromParent); } function insertScript(src) { const scriptElement = document.createElement('script'); scriptElement.type = 'text/javascript'; scriptElement.src = src; document.body.appendChild(scriptElement); }})();The offscreen document loads an iframe to a bing.com URL specifically chosen because the manifest registers a content script on it; that content script then injects extension JS into the bing.com origin. This trampoline executes extension code inside the bing.com web origin so it can issue cookie-bearing fetches and WebSockets to sydney.bing.com — effectively privilege escalation that lets the extension act as the logged-in user on Bing.
const strings = { scripts: ["src/background/websocket_utils.js", "src/chat/offscreen/bing_socket.js"], iframeSrc: "https://www.bing.com/sa/simg/favicon-trans-bg-blue-mg.ico?bing-chat-gpt-4-in-google",}setupIframe(strings.scripts.map((src) => chrome.runtime.getURL(src)));function setupIframe(scripts) { const iframe = createIframe(strings.iframeSrc); window.addEventListener('message', ({ data }) => { switch (data) { case 'iframe-script-ready': injectScriptToIframe(iframe, scripts); break; case 'socket-script-ready': socketScriptReady.val = true; break; } }); chrome.runtime.onMessage.addListener(onReceiveMessageFromExtension);}function createIframe(src) { const iframe = document.createElement('iframe'); iframe.src = src; document.firstElementChild.appendChild(iframe); return iframe;}Code injected into the bing.com origin issues a `credentials:"include"` request to bing.com's Sydney conversation endpoint and reads back the X-Sydney-Conversationsignature and X-Sydney-Encryptedconversationsignature headers, then returns those auth tokens to the extension. This silently lifts authenticated Bing Copilot session tokens out of the user's browser session and propagates them to other extension components.
async function handleMessage(message) { switch (message.action) { case 'session': const response = await fetch(`https://www.bing.com/turing/conversation/create`, { credentials: "include", }); const ret = await response.json(); if (response.headers.has('X-Sydney-Conversationsignature')) { ret['conversationSignature'] = response.headers.get('X-Sydney-Conversationsignature'); } if (response.headers.has('X-Sydney-Encryptedconversationsignature')) { ret['sec_access_token'] = response.headers.get('X-Sydney-Encryptedconversationsignature'); } return ret;A second fetch primitive that takes any `api` or `link` string from a content-script message and returns the raw body. Together with the broad `https://*/*` content script match it lets page-side code arbitrarily scrape any URL through the extension and receive the raw response text — useful for bulk content harvesting and reflecting third-party content into pages.
async function handleActionFetchResult(action) { let url = String(action.api || action.link); if (url.startsWith('http://')) url = 'https' + url.slice(4); const response = await fetch(url, { credentials: 'omit' }) .catch(e => ({ error: e.toString() })); return [action, await response.text()]}Content scripts are injected into every HTTPS site (`https://*/*`) at document_end, far beyond the search-engine surface area the extension actually advertises. Combined with `<all_urls>` host permissions and the background fetch/websocket proxies, this means the extension's content code (and anything it later loads) runs on banking, email, SaaS, intranet etc. with the ability to read DOM and exfiltrate via the SW.
{ "content_scripts": [ { "matches": [ "https://www.bing.com/sa/simg/favicon-trans-bg-blue-mg.ico?bing-chat-gpt-4-in-google" ], "all_frames": true, "run_at": "document_start", "js": [ "src/chat/offscreen/iframe_script.js" ] }, { "matches": [ "https://*/*" ], "run_at": "document_end", "js": [ "src/libs/math.min.js", "src/libs/highlight.min.js", "src/libs/tex-svg.js", "src/libs/drawdown.js", "src/utils.js", "src/constants.js", "src/settings.js", "src/chat/message.js", "src/chat/chat_session.js", "src/chat/bingchat_session.js", "src/context.js", "src/engine-specifics.js", "src/chat/init.js", "src/run.js" ] } ]}By severity
Versions scanned
Showing 1 of 2 scanned versions with more than one unique finding. Counts are unique findings that include each version.
| Extension Version | Code Review Findings |
|---|---|
| 1.0.0 | 9 |
Files with findings
7 distinct paths — top paths by unique finding count:
- src/background/background.js3
- manifest.json1
- src/background/websocket_utils.js1
- src/chat/offscreen/bing_socket.js1
- src/chat/offscreen/iframe_script.js1
- src/chat/offscreen/offscreen.js1
- src/rule_resources/rules.json1
URLs
View the external URLs this extension communicates with to understand its network activity and data interactions.
Gain full insight into all external connections.
Upgrade for full visibility.
Gain full insight into all external connections.
Upgrade for full visibility.
Code Diff
Compare extension code between any two versions.
No comparable text files found between these versions.
Browse and explore files within this extension package
Gain full insight into all external connections.
Upgrade for full visibility.