Is Sweezy Custom Doodle for Google™ safe?

Medium risk

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.

Sweezyv2.3.6Chrome Web Store
45Risk
Who publishes it

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.

Publisher
Sweezy

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
What actually happens
You did this

You open the extension popup by clicking its toolbar icon.

The extension did this

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.

Captured request
POSThttps://www.google-analytics.com/mp/collect?measurement_id=G-TQ4TSN2P91&api_secret=<redacted>

204 No Content, Google Analytics accepted the event.

Headers
Content-Type
application/json
Body
{  "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"      }    }  ]}
Fields transmitted to Google Analytics on every popup open
  • Installation identifier
    dad36c56-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 identifier
    1780706883275

    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 language
    en-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 address
    203.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.

Why you can't catch this in DevTools

The GA4 API secret is stored base64-encoded in the popup bundle, requiring decoding to read the real value.

Decoded value
a6XBLVGcQUCyTxWO9Nve0Q
The code that does this

GA4 tracking code in popup.bundle.js (deobfuscated)

Readable version

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
Destination receiving popup telemetry
    • 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.

Updated 30 September 2026jeiahlnhacbbdkaniaednfjpaemaghol