Is TwiHD - вернет качество 1080p на Twitch safe?

Medium risk

TwiHD Twitch 1080p routes browser traffic through remotely-configured proxy servers and transmits device identifiers and IP addresses to its backend.

The extension fetches PAC script URLs and proxy credentials from a remote registry hosted on Google Cloud Storage or Yandex Cloud, then applies them to redirect all browser traffic. On each proxy connection, it sends a persistent device ID and server-assigned user ID along with the device IP address to its API. It also sends usage events to Google Analytics and full request/response error details to a self-hosted Sentry server at sentry-sel-4.vpnn.loan.

TwiHDv1.0.5Chrome Web Store
55Risk
Who publishes it

Ստարրոկետս ՍՊԸ - no other listings under this identity, 2 shared hostnames

What this publisher told the store about itself, and the other listings that told it the same thing.

Publisher
TwiHD
Declared legal entity
Ստարրոկետս ՍՊԸ
Registered contact
TwiHD

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.

cuknrz.top
Also called by 1 other listing: VPN Наружу для YouTube. Обход блокировки YouTube бесплатно
naruzhu.click
Also called by 4 other listings

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

Publishers can request a review.

Findings

User ID, device ID and IP address sent to proxy backend on every connection

Connecting the proxy sends your account ID, a persistent device ID, and your current IP to the developer's backend.

Together these can track which IPs you've used and correlate your device across networks.

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

You click Connect in the extension popup.

The proxy connection flow begins immediately on user interaction.

The extension did this

The extension POSTs your user ID, device ID, and current IP address to the developer's proxy API.

The same identifiers are also sent on every subscription status check (api/v2/premium/update-and-get-subscription) and premium proxy requests.

Fields transmitted to the proxy backend on each connection request
  • User ID
    usr_8f2a1c94b7e34d0f

    A server-assigned account identifier that ties your subscription and usage history to your account.

  • Device ID
    a3b7c2d1-4e8f-4a9b-b1c2-d3e4f5a6b7c8

    A UUID from first install, stored permanently, letting the backend recognize your device across sessions even after logout.

  • Device IP address
    185.220.101.42

    Your network's public IP at the time of connection. Transmitted as 'device_ip' in the request body.

  • Product name
    twihd

    Fixed string 'twihd' identifying this extension as the requesting client.

The code that does this

fetchProxyData, connection request body (service_worker.js ~line 893)

Readable version
return await httpClient.post(`https://${apiBaseUrl}/api/v2/get-proxy`, {  json: {    product: 'twihd',    device_id: deviceId,    device_ip: deviceIp ?? 'unknown',    on_fail: onFail,    with_auth: featureFlags[FeatureKey.ProxyAuth]  }}).json();
Backend hosts receiving connection data
    • uubb.website

    Primary proxy API backend, receives userId, deviceId, and device IP on every connection and subscription check.

    • vrbl.space

    Alternate proxy API domain, same data as uubb.website, used when the primary is unreachable.

Persistent tracking ID sent to Google Analytics on every proxy action

Connecting, disconnecting, or using the popup sends a permanent device fingerprint to Google Analytics with the action name.

Created on install, stored permanently, never rotates, letting the developer correlate your usage indefinitely.

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

You click Connect, disconnect the proxy, or the extension installs or updates.

Any lifecycle action fires a tracked event.

The extension did this

The extension sends your permanent client ID and current session ID to Google Analytics with the action name.

The same client ID accompanies every event for the lifetime of the browser profile, actions can be chained together to build a long-term usage history.

Fields sent to Google Analytics on each tracked event
  • Permanent client ID
    3f8a2c1d-9b47-4e2a-a831-7f2c9d0e1b34

    A random UUID from first install that never changes, linking all your actions across weeks and months.

  • Session ID
    1717689234821

    A shorter-lived session token, refreshed every 30 minutes of inactivity. Ties events within a single browser session together.

  • Event name
    proxy_connect

    The user action that triggered the event (e.g. 'proxy_connect', 'install', 'user_created', 'video_redirect').

The code that does this

Persistent client ID creation and event dispatch (service_worker.js lines 2350-2440)

Readable version

getOrCreateClientId — permanent UUID

background/service_worker.js
getOrCreateClientId() {  return (async () => {    let clientId = (await chrome.storage.local.get('clientId')).clientId;    if (!clientId) {      clientId = self.crypto.randomUUID();      await chrome.storage.local.set({ clientId });    }    return clientId;  })();}

sendEvent — POSTs to hardcoded GA endpoint with embedded API secret

background/service_worker.js
const response = await fetch(  'https://www.google-analytics.com/mp/collect' +  '?measurement_id=G-XCPV2XK66M&api_secret=<redacted>',  { method: 'POST', body: JSON.stringify(payload) });
Analytics recipient
    • www.google-analytics.com

    Google Analytics Measurement Protocol, receives usage telemetry including the permanent client ID, session ID, and event names for all proxy actions.

Proxy server and PAC script URL controlled by remotely-fetched registry

Traffic routes through a proxy whose address comes from a remote config on Google Cloud Storage or Yandex Cloud.

The operator can change the PAC URL or proxy address anytime, no extension update needed.

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

You connect the proxy.

The extension begins the connection flow.

The extension did this

Downloads a remote PAC registry, fetches the PAC script it names, decompresses it, and applies it as the system-wide proxy config.

The operator can update the registry at any time to change the PAC script URL or content, redirecting all matched traffic through a different proxy server without any user action or extension update.

The code that does this

PAC registry fetch and fallback logic (service_worker.js lines 1892-1928)

Readable version

Registry URL selection with Yandex fallback

background/service_worker.js
const { configsBaseUrl } = await getState(StateKey.ConfigsBaseUrl);const registryUrl = configsBaseUrl === 'https://storage.yandexcloud.net/vpnn-web-configs/'  ? new URL('twihd/pca-scripts-registry-yandex.json', configsBaseUrl)  : new URL('twihd/pca-scripts-registry-google.json', 'https://storage.googleapis.com/');const registry = await httpClient.get(registryUrl.toString()).json();

PAC script fetched from URL specified in registry, then applied

background/service_worker.js
const pacUrl = (isLitePAC && registry.premiumLite) ? registry.premiumLite : registry.premium;const pacData = await fetchAndDecompress(pacUrl);// ...chrome.proxy.settings.set({  value: { mode: 'pac_script', pacScript: { data: buildPacScript({ host, port, pacString: pacData }) } },  scope: 'regular'});

On googleapis failure, switch to Yandex Cloud for all future fetches

background/service_worker.js
if (!configsBaseUrl || configsBaseUrl === 'https://storage.googleapis.com/') {  await setState({ [StateKey.ConfigsBaseUrl]: 'https://storage.yandexcloud.net/vpnn-web-configs/' });}
Remote config hosts
    • storage.googleapis.com

    Primary host for the PAC script registry (twihd/pca-scripts-registry-google.json) and PAC script content. Operator-controlled GCS bucket.

    • storage.yandexcloud.net

    Fallback host for PAC registry and scripts when googleapis.com is unreachable (bucket vpnn-web-configs, path twihd/).

+2 more findings not shown

What it can do

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

  • Read and change your data on vrbl.space

    https://vrbl.space/* and 1 more

  • Read and change your data on uubb.website

    https://uubb.website/* and 1 more

  • Read and change your data on cukubst.top

    https://cukubst.top/* and 1 more

  • Read and change your data on cuknrz.top

    https://cuknrz.top/* and 1 more

  • Read and change your data on cukvrub.top

    https://cukvrub.top/* and 1 more

  • Read and change your data on cukptk.website

    https://cukptk.website/*

  • Read and change your data on youtube.com

    https://*.youtube.com/*

  • Read and change your data on witch.tv

    https://*.witch.tv/*

  • Read and change your data on test.uubb.website

    https://test.uubb.website/*

  • Read and change your data on ptkdfjnflmpalkfpkehjgopmjldhjhgb.click

    https://ptkdfjnflmpalkfpkehjgopmjldhjhgb.click/*

  • Read and change your data on sentry-sel-4.vpnn.loan

    *://sentry-sel-4.vpnn.loan/*

  • Read and change your data on nrz.homes

    *://*.nrz.homes/*

  • Read and change your data on youtu.be

    *://*.youtu.be/*

  • Read and change your data on googlevideo.com

    *://*.googlevideo.com/*

  • Read and change your data on play.google.com

    *://*.play.google.com/*

  • Read and change your data on ytimg.com

    *://*.ytimg.com/*

  • Read and change your data on vpnn.loan

    *://*.vpnn.loan/*

  • Read and change your data on yandexcloud.net

    *://*.yandexcloud.net/*

  • Read and change your data on twhd.online

    *://*.twhd.online/*

  • Read and change your data on twhd.site

    *://*.twhd.site/*

  • Route all of your browsing through a server of its choosing

    proxy

  • Store data in your browser

    storage

  • Watch every request your browser makes

    webRequest

  • Act on the current tab, but only after you click the extension

    activeTab

  • See the address and title of every tab you have open

    tabs

  • Schedule its own background tasks

    alarms

  • See, disable and uninstall your other extensions, including your security ones

    management

  • Read and change cookies, including the ones that keep you signed in

    cookies

webRequestAuthProvider

Where it sends data

Destinations our analysis observed TwiHD 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.

  • www.google-analytics.comwidely used

    TwiHD sends data to www.google-analytics.com. A widely used service: 346 other extensions we have analysed send data here.

  • storage.googleapis.com

    TwiHD sends data to storage.googleapis.com. 7 other extensions we have analysed send data here.

  • sentry-sel-4.vpnn.loan

    TwiHD sends data to sentry-sel-4.vpnn.loan. No other extension we have analysed sends data here.

  • uubb.website

    TwiHD sends data to uubb.website. No other extension we have analysed sends data here.

Updated 30 September 2026ahbepdkgicljkjjjnogljplljdocjjmo