Is Sweezy Custom Doodle for Google™ safe?
Sweezy is medium risk. Each popup open triggers a POST to Google Analytics with a persistent device UUID, set at install and never rotated, plus browser language. This lets the developer track popup opens. Not linked to your account, but stored indefinitely.
Who publishes itSweezy - 2 other listings from the same operator, 1 of them carrying a finding
Sweezy - 2 other listings from the same operator, 1 of them carrying a finding
What this publisher told the store about itself, and the other listings that told it the same thing.
Same store account
2 other listings published from this account, 130k+ users between them. 1 of them carries a finding.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Popup transmits persistent UUID and browser language to Google Analytics
Each popup open triggers a POST to Google Analytics with a persistent device UUID, set at install and never rotated, plus browser language.
This lets the developer track popup opens.
Not linked to your account, but stored indefinitely.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Dynamic sandbox
You open the extension popup by clicking its toolbar icon.
The popup immediately reads a persistent UUID from storage and POSTs a page_view event to Google Analytics.
The POST carries your UUID (client_id), a session identifier, your browser's language (navigator.language), and the popup pathname, before you interact with anything.
204 No Content, Google Analytics accepted the event.
- Content-Type
- application/json
{ "client_id": "dad36c56-7c62-4a53-b48f-23e823ce6811", "events": [ { "name": "page_view", "params": { "session_id": "1780706883275", "engagement_time_msec": 100, "page_location": "/popup.html", "language": "en-GB" } } ]}- Installation identifierdad36c56-7c62-4a53-b48f-23e823ce6811
A UUID generated at install and stored permanently in chrome.storage.local. It changes only if you uninstall and reinstall.
- Session identifier1780706883275
A timestamp-based ID that resets every 30 days. With the UUID, it lets the developer count popup opens per installation within a session.
- Browser languageen-GB
Your browser's configured language and region (e.g. en-GB, fr-FR). This helps infer your geographic location.
- Page location/popup.html
The path of the popup within the extension (always /popup.html). Included as standard GA4 page tracking metadata.
- IP address203.0.113.42
Your public IP address is visible to Google's servers when the POST is made, even though it is not included in the JSON body.
The GA4 API secret is stored base64-encoded in the popup bundle, requiring decoding to read the real value.
a6XBLVGcQUCyTxWO9Nve0QGA4 tracking code in popup.bundle.js (deobfuscated)
Decoded api_secret
popup.bundle.js// Base64 decode of the obfuscated constant:// atob('YTZYQkxWR2NRVUN5VHhXTzlOdmUwUQ==') === 'a6XBLVGcQUCyTxWO9Nve0Q'const GA4_API_SECRET = 'a6XBLVGcQUCyTxWO9Nve0Q';Readable equivalent of the popup-load GA4 tracker
popup.bundle.js (deobfuscated)// Fires immediately when the popup HTML is loaded — before any user interaction.async function trackPageView() { // Read the persistent UUID stored at install time in chrome.storage.local const { configuration } = await chrome.storage.local.get('configuration'); const clientId = configuration.clientId; // never rotated // Resolve or refresh a 30-day session ID let sessionData = await getSessionData(); const now = Date.now(); const SESSION_WINDOW_MS = 43200 * 60 * 1000; // 30 days if (!sessionData || (now - Number(sessionData.timestamp)) > SESSION_WINDOW_MS) { sessionData = { session_id: now.toString(), timestamp: now.toString() }; await setSessionData(sessionData); } // Build the GA4 Measurement Protocol payload const event = { name: 'page_view', params: { session_id: sessionData.session_id, engagement_time_msec: 100, page_location: location.pathname, // always '/popup.html' language: navigator.language, // e.g. 'en-GB' page_title: document.title } }; // POST to GA4 Measurement Protocol (api_secret base64-obfuscated in source) await fetch( `https://www.google-analytics.com/mp/collect?measurement_id=G-TQ4TSN2P91&api_secret=<redacted>`, { method: 'POST', body: JSON.stringify({ client_id: clientId, events: [event] }) } );}trackPageView(); // called on every popup open- www.google-analytics.com
GA4 Measurement Protocol (property G-TQ4TSN2P91). Receives per-popup-open events with the persistent UUID, session ID, and browser language, owned by the developer's GA account.