AntiAdBlock.Core

Detection

9 min readBy Marcus Holt

How to detect uBlock Origin Lite after Manifest V3

uBlock Origin Lite is a Manifest V3 blocker that breaks the assumptions classic anti-adblock scripts rely on. Here is what changed and how to detect it.

What uBlock Origin Lite actually is

uBlock Origin Lite, usually written uBOL, is a separate extension from the classic uBlock Origin. It was built specifically for Chrome's Manifest V3 platform after Google began deprecating Manifest V2. It is not a stripped-down skin of the original: it is a different architecture with different runtime behaviour, and that distinction is the whole reason detection has to change.

Classic uBlock Origin is a dynamic blocker. It runs a persistent background process, reads every network request, and decides in JavaScript whether to block each one. uBOL cannot work that way. Under Manifest V3 it relies almost entirely on the declarativeNetRequest API, where the browser itself enforces a fixed set of rules that the extension registered ahead of time.

The practical consequence for publishers is that uBOL is quieter. It does less work in the page, exposes fewer observable side effects, and leaves a much smaller footprint for a detection script to find. A blocker that used to announce itself through obvious DOM and timing artefacts now slips through far more cleanly.

MV3 declarativeNetRequest versus MV2 dynamic blocking

Under Manifest V2, an ad blocker could intercept the webRequest stream and run arbitrary logic before a request completed. That power is what classic uBlock Origin, AdGuard and Adblock Plus all used. It also let them inject scriptlets, rewrite responses, and react to anything the page did at runtime.

Manifest V3 removes the blocking form of webRequest for content blockers and replaces it with declarativeNetRequest. The extension ships a list of static rules; Chrome compiles them and applies them natively. The extension never sees the individual request and cannot make a per-request decision in JavaScript. This is faster and more private, but it is also far less flexible.

For detection this matters because most legacy anti-adblock signals were really MV2 signals. They depended on the blocker doing something visible in JavaScript at the moment a request was made. With declarativeNetRequest the blocking happens below the page, in the browser's network layer, and the page only sees the result: a request that failed.

Why classic bait detection fails on uBOL

The oldest anti-adblock trick is DOM bait. The script creates an element with a class like ad-banner or adsbox, waits a moment, and checks whether the element was hidden or removed. If it was, a cosmetic filter must be active, so a blocker is present.

uBOL undermines this in two ways. First, its cosmetic filtering is more limited than classic uBO, especially in its lower modes, so a generic bait element may not be hidden at all. Second, and more importantly, uBOL's core job is network blocking through declarativeNetRequest, not cosmetic hiding. A bait element that is never fetched from a blocked URL gives the detector nothing to observe.

Bait that does load a script from a known ad path can still work, but only if the path is on the rule list uBOL happens to ship, and only in the modes where uBOL has the host permissions to act. A single bait probe therefore produces a noisy, mode-dependent yes-or-no answer. On uBOL specifically it produces a lot of false negatives, which is the worst failure mode for a publisher: the blocker is there, revenue is lost, and the script reports nothing.

Basic, Optimal and Complete modes

uBOL exposes three permission levels and they change its behaviour dramatically. In Basic mode uBOL uses only the rulesets it can apply without per-site host permissions. Network filtering still works through declarativeNetRequest, but cosmetic filtering and scriptlet injection are minimal because the extension has not been granted access to the page.

In Optimal mode the user grants broad host permissions, which unlocks generic cosmetic filtering and a wider rule set. In Complete mode uBOL is granted access on the specific site and can inject scriptlets and apply site-specific cosmetic rules, bringing it closest to the classic uBlock Origin experience.

A detection engine that treats uBOL as one thing will be wrong most of the time. The same extension can be nearly invisible on one site and aggressively cosmetic on another, depending purely on which mode the user picked. Reliable detection has to read several independent signals and infer the mode, rather than assuming a fixed behaviour.

Timing fingerprints, noopjs redirects and the ensemble

Even a quiet declarativeNetRequest block leaves measurable traces. When Chrome blocks a request natively, the failure returns on a different timing curve than a genuine network error or a slow server. Measuring how and when known ad requests fail, across several probes, produces a timing fingerprint that survives MV3.

A second strong signal is the redirect. declarativeNetRequest can redirect a blocked request to a bundled, neutralised resource, a so-called noopjs or noop redirect served from the extension's web_accessible_resources. When a request that should have returned ad code instead resolves to an empty, syntactically valid script, that substitution is itself evidence of a blocker, and a strong one for uBOL.

No single one of these is conclusive. Timing can be skewed by a bad connection; a noop redirect needs the right probe; cosmetic bait depends on mode. The robust answer is an ensemble: run many independent vectors and let them vote. AntiAdBlock Core uses an 11-vector engine for exactly this reason, and retrains its heuristics nightly against EasyList, uBlock and AdGuard filter deltas so that probes stay one step ahead of the lists. Any one vector can fail; the verdict does not depend on it.

A fully maintained adblock killer script runs all of these vectors and votes on the result, which is why managed detection reaches 99.7% precision across every uBOL mode where a single-signal script drops to near zero. The anti-adblock script 2026 guide covers how to wire this up on a live site.

Frequently asked questions

Is uBlock Origin Lite the same as uBlock Origin?

No. uBlock Origin Lite (uBOL) is a separate Manifest V3 extension built around declarativeNetRequest. Classic uBlock Origin is a Manifest V2 dynamic blocker. They behave differently and need different detection.

Why does my old anti-adblock script miss uBOL?

Most legacy scripts rely on DOM bait and cosmetic filtering signals. uBOL blocks mainly at the network layer through declarativeNetRequest and does little cosmetic work in its lower modes, so single-vector bait checks produce false negatives.

Can uBlock Origin Lite be detected reliably at all?

Yes, but not with one trick. Timing fingerprints on blocked requests and noop-redirect heuristics survive MV3. An ensemble that votes across many vectors, like AntiAdBlock Core's 11-vector engine, detects uBOL across its Basic, Optimal and Complete modes.

Put the best adblock killer script to the test.

Free up to 10,000 detections per month. 60-second install.

Keep reading

Explore more