Is Youtube Video Skip Ad Trigger safe?

Medium risk

Youtube Video Skip Ad Trigger sends each YouTube URL you visit to Google Analytics, tied to a persistent per-user UUID.

On every YouTube page load, the extension posts a Google Analytics hit containing the full page URL and a UUID stored in sync storage, linking your browsing activity to a stable identifier across sessions. When an ad-skip fires, an additional event with the same UUID and page URL is sent to the extension developer's GA property. The extension also fetches a remotely-controlled list of CSS selectors from Firebase and uses them to auto-click elements on YouTube pages, meaning the set of clicked targets can be changed by the developer at any time.

010pixelv2.4.8Chrome Web Store
45Risk

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

Publishers can request a review.

Findings

SeverityMEDIUM
ClassUNWANTED
TypeUnexpected
CWECWE-829
SourceAI SANDBOX

Firebase selector list controls YouTube auto-clicks

When you open YouTube, the extension fetches a selector list from rex-moji.firebaseio.com and adds the values to its click targets.

Dynamic analysis observed .ytp-skip-ad-button returned, passed to document.querySelector(...).click().

01EvidenceCAUSE EFFECT
What actually happens
You did this

You open a YouTube page while the extension is enabled.

The extension registers js/myapp.js as a content script on all youtube.com frames.

The extension did this

The page script fetches a Firebase selector list and clicks YouTube elements that match its combined selector list.

Dynamic analysis observed the Firebase request returning .ytp-skip-ad-button.

02EvidenceFIELD TABLE
Concrete values used by the auto-click path
FieldValueWhy it matters
Selector source
https://rex-moji.firebaseio.com/youtube-skip-ad-trigger-classes.jsonShows where the extension gets extra click targets before interacting with the YouTube page.
Returned selector
.ytp-skip-ad-buttonTells the extension which matching YouTube page element can be clicked.
Saved click targets
youtube_ad_skip_trigger_skip_btn_classes: [".ytp-skip-ad-button"]Lets the extension reuse server-returned selectors alongside its built-in YouTube selectors.
Clicked page element
button.ytp-skip-ad-buttonA matching YouTube element can be clicked for you according to the extension's timing setting.
03EvidenceNETWORK CAPTURE
Captured request
GEThttps://rex-moji.firebaseio.com/youtube-skip-ad-trigger-classes.json
Observed during dynamic analysis: the content-script request returned the JSON string .ytp-skip-ad-button.
04EvidenceSTORAGE DUMP
What's stored on your device

This stores the selector returned by Firebase so it can be added to the list of YouTube elements the extension may click.

Locationchrome.storage.sync key youtube_ad_skip_trigger_skip_btn_classes
Contents (JSON)
{
  "youtube_ad_skip_trigger_skip_btn_classes": [
    ".ytp-skip-ad-button"
  ]
}
05EvidenceCODE COMPARE
The code that does this

The shipped code fetches selectors, stores them, then clicks matches

What it actually does
Readable selector click loopjs/myapp.js
function u() {
  var e, t = [".videoAdUiSkipButton.videoAdUiAction.videoAdUiFixedPaddingSkipButton", ".ytp-ad-skip-button", ".ytp-skip-ad-button", ".ytp-ad-overlay-close-button", ".ytp-ad-skip-button-modern", ...s];
  for (e in t) ! function(_) {
    b("Its " + o), !1 !== h(_) && (b("Skipping Ad in 1 seconds for: " + _), setTimeout(function() {
      if (!1 !== h(_)) {
        var e = 1,
          e = ("skip_immediately" === p ? e = 300 : "skip_after_30_secs" === p ? e = 3e4 : "skip_after_60_secs" === p && (e = 6e4), b("Skipping in: " + e), setTimeout(function() {
            document.querySelector(_) && document.querySelector(_).click()
          }, e), e = ".ytp-ad-button-text", 0 != document.querySelectorAll(e).length && document.querySelector(e).innerText, e = _, {
            t: "event",
            ec: k + " " + (y.installType || "development"),
            ea: "Skip button clicked",
            el: "Skip button class: " + (e || "")
          });
        if ("on" === g) {
          b("GA", e.t);
          var t, n, o = m || " ",
            i = v || "",
            s = "Background Page: " + (v || ""),
            a = y.name + " - " + v,
            r = Math.random().toString().replace("0.", ""),
            c = window.location.hostname,
            u = window.location.host,
            d = window.location.href,
            o = {
              v: "1",
              tid: "UA-57562361-4",
              cid: o,
              ds: i,
              z: r,
              t: "pageview",
              aip: "1",
              npa: "1",
              dl: d,
              dh: u,
              dp: c,
              dt: s,
              an: a,
              aid: c,
              av: y.version
            },
            i = Object.assign(o, e || {}),
            l = [];
          i.ev && i.ev !== parseInt(i.ev) && delete i.ev;
          for ([t, n] of Object.entries(i)) l.push(t + "=" + n);
          r = l.join("&");
          try {
            var f = new XMLHttpRequest;
            f.open("POST", "https://www.google-analytics.com/collect", !0), f.send(r), b("Sent:", i), b("Sent:", r)
          } catch (e) {
            b("Error sending report to Google Analytics.\n" + e)
          }
        }
      }
    }, 100))
  }(t[e])
}
Readable selector fetch and storagejs/myapp.js
(async function() {
  const e = await fetch("https://rex-moji.firebaseio.com/youtube-skip-ad-trigger-classes.json"),
    t = await e.json(),
    n = (t || "").split(",").map(e => e.trim());
  a.storage.sync.set({
    youtube_ad_skip_trigger_skip_btn_classes: n
  }, function() {
    n.forEach(e => {
      s.includes(e) || s.push(e)
    })
  })
})()
06EvidenceTHIRD PARTY LIST
Remote endpoint involved in the selector update
  • rex-moji.firebaseio.com

    Firebase Realtime Database host that returns the selector string consumed by the YouTube page script.

Data recipients

www.google-analytics.comrex-moji.firebaseio.com
Updated 17 September 2026hpnelpabemhjfjgiibgkliipaehnfcjk