Is Flow for Chrome™ safe?

High risk

Flow is high risk. On every Google search, Flow for Chrome sends your exact query to uru56.com with the runtime ID, version, affiliate ID 3100, a random session token, and a stored identifier. Credentialed, so cookies go too. Automatic, undisclosed.…

FlowTeamv1.0.3Chrome Web Store
75Risk

AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.

Publishers can request a review.

Findings

Search Queries Transmitted to uru56.com on Every Google Search

On every Google search, Flow for Chrome sends your exact query to uru56.com with the runtime ID, version, affiliate ID 3100, a random session token, and a stored identifier.

Credentialed, so cookies go too.

Automatic, undisclosed.

Severity
High unwanted
Type
Unexpected
CWE
CWE-200
Source
Dynamic sandbox
What actually happens
You did this

You search for anything on Google.

The extension did this

The extension sends your search query and identifying metadata to uru56.com.

This happens on every Google search page load, including every Google country domain, before any results from uru56.com are displayed.

Captured request
GEThttps://uru56.com/script/t.php?format=json&nohtml=1&tr=d3k8rn2&a=3100&e=alnghhandkkjecnmeaejaonhllbopoej&u=1-0-3&keyword=<planted-marker>&by=Flow+for+Chrome%E2%84%A2&crt=org

JSON response containing ad results, CSS styling rules, SearchID, SourceTag, and beacon URLs. Body ~44 KB.

What the extension sends to uru56.com on every Google search
  • Your search query
    best password manager 2026

    The exact words you typed into Google's search box.

  • Extension runtime ID
    alnghhandkkjecnmeaejaonhllbopoej

    A stable identifier for your installed copy of the extension. Links all your searches together across sessions.

  • Affiliate / publisher ID
    3100

    A hardcoded code (3100) that identifies this extension as the traffic source for monetisation purposes.

  • Extension version
    1-0-3

    Which version you have installed.

  • Session token
    d3k8rn2

    A random per-page-load token used to correlate the search request with subsequent ad clicks.

  • Stored org tag (crt)
    org

    A value read from local extension storage. Defaults to 'org'; may be updated by the server to segment users.

The code that does this

The request assembly code from content.js

Readable version

Search parameter assembly — readable form

// On every Google search page, build and fire a tracking request to uru56.com.// 'aid' is hardcoded to '3100' at the top of content.js.this.sessionToken = generateShuffledTimestamp(); // random per-page tokenthis.searchQuery = getQueryParam('q'); // raw Google search termif (this.searchQuery.length > 2) { chrome.storage.local.get({ we: 'org' }, (stored) => { const params = new URLSearchParams({ format: 'json', nohtml: '1', tr: this.sessionToken, a: '3100', // hardcoded affiliate ID e: chrome.runtime.id, // extension's stable CRX ID u: manifest.version.replace(/\./g, '-'), // e.g. '1-0-3' keyword: this.searchQuery, // the user's search term by: manifest.name, // 'Flow for Chrome™' crt: stored.we, // stored org tag, default 'org' }); this.fetchResults('https://uru56.com/script/t.php?' + params); });}

XHR with credentials — readable form

// withCredentials=true means any uru56.com cookies are included in the request.fetchResults(url) { const xhr = new XMLHttpRequest(); xhr.withCredentials = true; // sends uru56.com cookies alongside the request xhr.onreadystatechange = () => { if (xhr.readyState === 4 && xhr.responseText.length > 0) { const json = JSON.parse(xhr.responseText); displayResults(json.data); // renders ads + may inject CSS + fires Yahoo beacon } }; xhr.open('GET', url, true); xhr.send();}
Where your search data goes
    • uru56.com

    Receives every Google search query along with the extension runtime ID and affiliate metadata. Returns sponsored ad results, server-controlled CSS, and Yahoo beacon parameters.

Yahoo Beacons Receive Your Full Google Search URL on Ad Impressions

On sponsored Google results, Flow for Chrome pixels Yahoo (search.yahoo.com, xmlp.search.yahoo.com) with your search URL and referring page.

Params ysid/traffic_source, from uru56.com, link the beacon to that session.

Confirmed live.

Severity
Medium unwanted
Type
Unexpected
CWE
CWE-359
Source
Dynamic sandbox
What actually happens
You did this

You search on Google and the page displays sponsored results.

The extension did this

The extension fires tracking pixels to Yahoo's beacon servers containing your full Google search URL and referrer.

This occurs when uru56.com's response includes a SearchID and SourceTag, both confirmed present in our test session for ad-bearing queries.

Captured request
GEThttps://search.yahoo.com/beacon/geop/p?s=1197808038&c_int1=0&c_str1=&c_str2=https%3A%2F%2Fwww.google.com%2Fsearch%3Fq%3D<planted-marker>&ysid=44GDQVLKTTKBN&traffic_source=flowsurf_enhan_xmlb_1790_flow&c_int2=2

1×1 tracking pixel (transparent GIF). No meaningful body.

What Yahoo's beacon receives for each ad impression
  • Your full Google search URL
    https://www.google.com/search?q=best+password+manager+2026

    The complete URL of the Google search results page, including your search term.

  • Referrer URL
    https://www.google.com/

    The page you were on before navigating to Google search.

  • Yahoo Search Session ID (ysid)
    44GDQVLKTTKBN

    A session identifier returned by uru56.com that links this beacon to your search session on their server.

  • Traffic source tag
    flowsurf_enhan_xmlb_1790_flow

    Identifies this extension as the referral source in Yahoo's ad attribution system.

  • Frame context flag
    0

    Whether the page is inside a frame (0=top-level, 1=framed). Indicates browsing context.

The code that does this

The beacon code from content.js:504-505

Readable version

Beacon firing logic — readable form

// Fires after uru56.com returns SearchID and SourceTag in its JSON response.const ysid = data.SearchID; // session ID from uru56.comconst source = data.SourceTag; // attribution tag from uru56.comif (ysid && source) { const inFrame = window.frames.length !== parent.frames.length; const referrer = document.referrer ? encodeURIComponent(document.referrer) : ''; const pageUrl = encodeURIComponent(window.location.href); // full Google search URL // Two endpoints, differing only in c_int2 const endpoints = { 'search.yahoo.com': { c_int2: 2 }, 'xmlp.search.yahoo.com': { c_int2: 1 }, }; const baseParams = { s: '1197808038', // hardcoded Yahoo publisher/site ID c_int1: inFrame ? 1 : 0, c_str1: referrer, // URL-encoded referrer c_str2: pageUrl, // URL-encoded current Google search URL ysid: ysid, // session ID from uru56.com response traffic_source: source, // e.g. 'flowsurf_enhan_xmlb_1790_flow' }; for (const host of Object.keys(endpoints)) { const params = { ...baseParams, ...endpoints[host] }; const url = 'https://' + host + '/beacon/geop/p?' + new URLSearchParams(params); const img = document.createElement('img'); img.height = '1'; img.width = '1'; img.src = url; // fires the tracking pixel document.body.appendChild(img); }}
Yahoo beacon endpoints that receive your search URL
    • search.yahoo.com

    Primary Yahoo beacon endpoint. Receives the full Google search URL, referrer, and uru56.com session ID for ad attribution.

    • xmlp.search.yahoo.com

    Secondary Yahoo beacon endpoint. Receives the same payload with a different context flag (c_int2=1).

What it can do

Permissions this extension asks for, as declared in version 1.0.3. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.

  • Store data in your browser

    storage

Updated 30 September 2026ijofkokfiblogfpahfhbikjibklejlnf