Is Video Ad Block Youtube safe?

Medium risk

Video Ad Block Youtube is medium risk. When a page finishes loading, Video Ad Block Youtube sends the page URL and referrer to ytadskip.com, along with a persistent browser ID that lets repeated browsing events be linked to the same installation over time.…

emredenizademv3.7.1Chrome Web Store
49Risk
Who publishes it

emredenizadem - 1 other listing from the same operator, none carrying a finding

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

Publisher
emredenizadem

Same store account

1 other listing published from this account, 6k+ users between them, none of them carrying a finding.

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

Publishers can request a review.

Findings

Every page URL is sent to ytadskip.com on navigation

When a page finishes loading, Video Ad Block Youtube sends the page URL and referrer to ytadskip.com, along with a persistent browser ID that lets repeated browsing events be linked to the same installation over time.

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

You load or navigate to a top-level web page.

The content script also watches same-tab navigation changes in single-page apps.

The extension did this

The extension sends the page URL, referrer, and persistent browser ID to ytadskip.com.

The captured traffic included a Gmail URL, showing the behavior is not limited to YouTube pages.

Fields sent in the pageview request
  • Current page URL
    https://mail.google.com/mail/u/0/#inbox

    Shows the exact page you had open when the extension reported the pageview.

  • Browser ID
    9a9a9897-4b66-41ce-9a8a-a51f38a0f4aa

    Lets repeated pageviews be tied back to the same browser installation over time.

  • Referrer URL
    https://mail.google.com/mail/u/0/

    Shows where the navigation came from when the browser or extension has that context.

Captured request
POSThttps://ytadskip.com/dynamic/rules/get

Dynamic analysis confirmed the request for a non-YouTube URL.

Headers
Content-Type
application/json
Body
{  "uri": "https://mail.google.com/mail/u/0/#inbox",  "uid": "9a9a9897-4b66-41ce-9a8a-a51f38a0f4aa",  "dr": "https://mail.google.com/mail/u/0/"}
The code that does this

Content script pageview message and service-worker POST

Readable version

content.js pageview sender

content.js
(() => {  if (window.top !== window.self) return;  if (!/^https?:$/.test(location.protocol)) return;  let e = "",    t = 0;  const r = (r, d) => {      const o = Date.now();      r === e && o - t < 5e3 || (e = r, t = o, chrome.runtime.sendMessage({        message: "pageview",        uri: r,        docref: d || ""      }).catch((() => {})))    },    d = () => r(location.href, document.referrer);  "loading" === document.readyState ? document.addEventListener("DOMContentLoaded", d, {    once: !0  }) : d(), window.addEventListener("pageshow", (t => {    t.persisted && location.href !== e && r(location.href, document.referrer)  }));  let o = location.href;  const n = () => {    const e = location.href;    if (e === o) return;    const t = o;    o = e, r(e, t)  };  document.addEventListener("__yt_adskip_spa_nav__", n), window.addEventListener("popstate", n)})()

background.js service-worker sender

background.js
postData = async (t, e = {}) => {  try {    const a = await fetch(t, {      method: "POST",      credentials: "include",      headers: {        "Content-Type": "application/json"      },      body: JSON.stringify(e)    });    return await a.json()  } catch (t) {}};chrome.runtime.onMessage.addListener((async (t, e) => {  if ("pageview" !== t.message);  else {    if (handleRuntimeError(), e?.tab?.incognito) return;    const a = e?.tab?.id,      s = t.uri;    let r = t.docref || "";    if (!isValidPage(s)) return;    if (!r && null != a) {      const t = await getFromSessionStorage("tab_initiators") || {};      t[a] && (r = t[a], delete t[a], await setToSessionStorage("tab_initiators", t))    }    if (null != a) {      const t = await getFromSessionStorage("tab_urls") || {};      t[a] = s, await setToSessionStorage("tab_urls", t)    }    const o = await getFromStorage("uid");    await postData(`${BURL}/dynamic/rules/get`, {      uri: s,      uid: o,      dr: r    })  }}))
Network destination receiving pageview data
    • ytadskip.com

    Receives pageview POST requests containing the current URL, referrer, and persistent browser ID.

Referrer chain and cross-tab opener URLs sent to ytadskip.com on navigation

DA captured 12 POSTs to ytadskip.com/dynamic/rules/get; 4 carried a referrer, e.g. dr='accounts.google.com'.

The script sends document.referrer each load.

A new-tab link uses the opener's last URL. v3.4 tracked same-tab moves only.

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

You navigate to any page or follow a link into a new tab.

This fires on initial page load, back/forward navigation, and every SPA URL change.

The extension did this

The extension sends the destination URL, your persistent user ID, and the referring URL to ytadskip.com.

For new-tab links, the referrer field contains the opener tab's last-visited URL rather than the HTTP Referer header.

Captured request
POSThttps://ytadskip.com/dynamic/rules/get

Returns ad-blocking rule configuration. dynamic analysis ID 621 captured 12 requests; 4 had non-empty dr values.

Headers
Content-Type
application/json
Body
{  "uri": "https://myaccount.google.com/personal-info",  "uid": "3f7a2c1b-9e04-4f8d-b1a0-2c5e6d7f8a9b",  "dr": "https://accounts.google.com/"}
Fields transmitted in every pageview POST
  • Page URL
    https://myaccount.google.com/personal-info

    The full URL of the page you just loaded, including path and query string.

  • Persistent user ID
    3f7a2c1b-9e04-4f8d-b1a0-2c5e6d7f8a9b

    A UUID generated on install and stored permanently. Links every request to the same browser profile across all sites and sessions.

  • Referring URL
    https://accounts.google.com/

    The page you came from. For new-tab links, this is the opener tab's last URL, not a browser-supplied referrer header.

The code that does this

v3.4 vs v3.5 background: referrer and cross-tab initiator tracking added

Readable version

v3.5 content.js — sends document.referrer

content.js (v3.5, lines 52-60)
const r = (r, d) => {  const o = Date.now();  r === e && o - t < 5e3 || (e = r, t = o, chrome.runtime.sendMessage({    message: "pageview",    uri: r,    docref: d || ""  }).catch((() => {})))},d = () => r(location.href, document.referrer);

v3.5 background.js — uses initiator as fallback referrer

background.js (v3.5, lines 41-56)
let r = t.docref || "";if (!r && null != a) {  const t = await getFromSessionStorage("tab_initiators") || {};  t[a] && (r = t[a], delete t[a], await setToSessionStorage("tab_initiators", t))}await postData(`${BURL}/dynamic/rules/get`, { uri: s, uid: o, dr: r })
Data destination
    • ytadskip.com

    Receives {uri, uid, dr} on every navigation. Run by the developer; also serves dynamic ad-blocking rules. No privacy policy URL disclosed in the store listing.

Updated 15 October 2026okepkpmjhegbhmnnondmminfgfbjddpb