v150 · security · css · svg · iframes
Disable SVG filters on plugins and iFrames
Chrome 150 prevents Scalable Vector Graphics (SVG) filters from being applied to embedded plugins (for example, PDFs) and cross-origin or restricted iFrames (for example, sandboxed ones). When a plugin or iFrame would be painted with an SVG filter effect, the effect tree is traversed to find the highest ancestor without SVG filters, and that effect is then applied instead. CSS filter functions such as blur() are not SVG reference filters and are unaffected.
at a glance
| Milestone listing | Chrome 150 — “Enabled by default” (the listing is authoritative for milestone + slug) |
|---|---|
| Feature detail | Desktop 150, Android 150, WebView 150; detail status text “Proposed” (accurate_as_of 2026-06-01); all platforms using Blink |
| Category | Security — behavioral restriction; no new API surface, no developer flag, no origin trial; rolled out under the Finch control kPreventSvgFilterPaint (check chrome://variations on a given install) |
| Enterprise | First enterprise notification milestone 149 |
| Specification | w3c/csswg-drafts PR #13846 — [filter-effects-1] Document Clickjacking Attacks (open, unmerged at review time; amends Filter Effects Module Level 1) |
| Tracking bug | crbug.com/476646486 (Blink>SVG) |
| Tests | WPT svg/styling/svg-filter-render-*.tentative cross-browser reference tests |
| Shipping intent | blink-dev intent thread (ship stage) |
| ChromeStatus | 5117170452398080 — Disable SVG filters on plugins and iFrames |
why it exists
SVG filter primitives such as feBlend, feColorMatrix, feComposite, and feGaussianBlur arbitrarily manipulate the pixels of the surface they are applied to. When a page applies such a filter to a cross-origin iframe or a plugin, it can visually manipulate content it has no script access to — potentially causing users to take actions they might not otherwise. The canonical write-up is the SVG clickjacking research by the independent security researcher who disclosed the attack (rebane2001) and whose work the ChromeStatus motivation cites: dynamic SVG filters disguise cross-origin content and manipulate users, and can exfiltrate data through user feedback or QR-code tricks.
A second, older motivation is timing: SVG filter rendering cost can be data-dependent, so filtering cross-origin pixels enables pixel-perfect timing attacks that reconstruct protected content one measurement at a time (the Black Hat USA 2013 pixel-perfect timing paper, cited in the ChromeStatus motivation). Note that direct pixel readback through feDisplacementMap-style tainted inputs was already a no-op before this change; this restriction targets visual manipulation and timing, not a new readback channel.
The proposed specification text is direct: user agents must not apply SVG reference filters to cross-origin/restricted iframes or web plugins because of their ability to arbitrarily manipulate pixels. It is added to Filter Effects Level 1 as a “Clickjacking Attacks” subsection and points at the HTML standard's guidance on writing secure applications.
Source: w3c/csswg-drafts PR #13846 (proposed normative text + review discussion); SVG clickjacking research (rebane2001); Pixel-perfect timing attacks (Black Hat USA 2013); chromestatus feature motivationwhat changes
| Scenario | Before Chrome 150 | Chrome 150+ |
|---|---|---|
SVG reference filter on same-origin <iframe> (including same-origin srcdoc) | Applied normally | Applied normally (unchanged) |
SVG reference filter on cross-origin <iframe> | Applied (frame pixels manipulable by embedder) | SVG filter skipped; nearest non-SVG ancestor effect used |
SVG reference filter on sandboxed <iframe> (even same-origin) | Applied | SVG filter skipped |
SVG reference filter on a web plugin (<embed>/<object>, e.g. the PDF viewer) | Applied | SVG filter skipped |
CSS filter functions (blur(), brightness()…) on any of the above | Applied normally | Applied normally (unchanged — the restriction covers SVG reference filters only) |
Non-SVG-filter effects (opacity, transform, backdrop-filter) around the frame | Applied normally | Applied normally — but a backdrop-filter SVG reference on an element in front of the frame is a separate, unaddressed path (see caveats) |
behavior reference
The developer-facing surface is a paint-time behavior of one CSS construct — filter: url(…) referencing an SVG <filter> element — on three kinds of replaced content, plus the fallback algorithm. Each item below covers syntax, inputs, outputs, errors, context/exposure, lifecycle, examples, compatibility, and security/privacy.
SVG reference filters on cross-origin or restricted iframes
Syntax. The restricted construct is the CSS filter property with a url() reference to an SVG <filter> element — e.g. filter: url(#my-svg-filter) — declared on a selector that matches an <iframe> whose document is cross-origin to the embedder, or that is restricted (a sandboxed frame, including a same-origin frame with a sandbox attribute). Shorthand and longhand forms are equivalent: filter: url(#f) blur(2px) has only its SVG-reference component skipped. CSS filter functions in the same declaration are not restricted.
Inputs. The behavior is keyed on three inputs, evaluated together: (1) the computed filter value of the iframe element — does it contain an SVG reference filter; (2) the origin relationship between the embedding document and the framed document — same-origin frames (including same-origin srcdoc frames) keep their filters, cross-origin frames lose them, and a frame that navigates from a same-origin srcdoc document to a cross-origin document loses the filter on navigation; (3) the frame's restricted status — a sandbox attribute makes even a same-origin frame restricted.
Outputs. Painted output only: the restricted frame renders as if the SVG reference filter were not declared — the WPT references for the cross-origin and sandbox cases render the iframe with no filter effect at all. Any non-SVG-filter ancestor effect is still applied via the fallback algorithm below. Effect on computed style is not defined in any cited source (explicit unknown): the skip is defined at paint time, which implies the declaration remains in the computed value, but this is not directly sourced and runtime verification on an enforcing build is pending.
Source: WPT cross-origin-frame reference (no filter, unfiltered iframe markup); chromestatus feature summaryErrors. None by design: no exception is thrown, no CSS parse error is produced, and the declaration remains valid — the filter is skipped silently at paint time. Neither the ChromeStatus record nor the proposed spec text defines a console message or other developer-facing signal; whether Chrome emits a devtools warning is not recorded in any cited source (explicit unknown — no stable public source).
Source: PR #13846 proposed text; ChromeStatus API feature recordContext / exposure. Applies in every Blink context that paints iframes: desktop Chrome 150, Android 150, and WebView 150 (“all platforms using blink”). It is a default-on behavioral change with no flag, no origin trial, and no permissions or capability detection surface; pages cannot opt a restricted frame back into SVG filtering.
Source: ChromeStatus API feature record (desktop/android/webview 150, all_platforms_descr)Lifecycle / state transitions. The decision is re-evaluated as the frame's state changes, not latched at first paint: the WPT suite covers a same-origin frame that becomes restricted when a sandbox attribute is set and the frame reloads (filter lost after reload), and a srcdoc frame that is navigated cross-origin (filter lost on navigation). Nested frames compose — the suite includes cross-origin-in-cross-origin, cross-origin-in-same-origin, same-origin-in-cross-origin, and same-origin-in-same-origin cases.
Examples.
/* SKIPPED in Chrome 150+ when #frame loads a cross-origin document
or carries a sandbox attribute — the frame paints unfiltered. */
.restricted-frame {
filter: url(#svg-filter);
}
/* Still applied: same-origin frame — unchanged behavior. */
.same-origin-frame {
filter: url(#svg-filter);
}
/* Still applied on ANY frame: CSS filter functions are not
SVG reference filters. Use these for cross-origin embeds. */
.cross-origin-frame {
filter: blur(2px) brightness(0.8);
}
<svg width="0" height="0" aria-hidden="true">
<filter id="svg-filter">
<feGaussianBlur in="SourceGraphic" stdDeviation="5" />
</filter>
</svg>
<!-- filtered (same-origin) -->
<iframe class="same-origin-frame" src="/local.html"></iframe>
<!-- unfiltered in Chrome 150+ (sandboxed = restricted) -->
<iframe class="restricted-frame" sandbox src="/local.html"></iframe>
Source: mirrors the WPT cross-origin-frame test and sandbox-frame test markup (feGaussianBlur url-reference on the iframe)
Compatibility.
| Engine | Support | Evidence |
|---|---|---|
| Chrome 150+ (desktop, Android, WebView) | Enabled by default (milestone listing) | ChromeStatus API record |
| Safari / WebKit | Restricted since 2017 — WebKit allows SVG filters only on content in accessible security origins (same-origin keeps filters, cross-origin/plugins lose them). The standards-position request is open with no official position. | WebKit changeset 216541 (2017, “Restrict SVG filters to accessible security origins”); WebKit bug 118689; position request #654 (open) |
| Firefox / Gecko | No position taken (request open) — currently allows SVG filters on cross-origin iframes, tracked as an open security bug | Mozilla standards-position #1395 (open); bugzilla 2004487 (NEW) |
| BCD / MDN compat data | Unknown — no dedicated entry exists for this behavior (explicit unknown) | PR #13846 (unmerged at review time) |
| Cross-browser tests | svg/styling/svg-filter-render-*.tentative.https.html (tentative reftests) | WPT svg/styling |
Security / privacy. This item is the security fix: SVG reference filters let an embedder arbitrarily manipulate the painted pixels of a frame it cannot script-access, enabling clickjacking-style manipulation of cross-origin or restricted content. Dropping the filter removes the embedder's ability to alter how the framed content looks (and thus what the user believes they are interacting with). The restriction trades off a legitimate styling capability on restricted embeds; CSS filter functions remain available as the unaffected alternative.
Source: PR #13846 (Clickjacking Attacks subsection); HTML standard — writing secure applications (clickjacking)SVG reference filters on web plugins
Syntax. Same restricted construct — filter: url(#svg-filter) — but declared on a selector matching an element that instantiates a web plugin, such as <embed> or <object> (the canonical example being the browser's PDF viewer). The WPT plugin test applies the class carrying the url() filter directly to an <embed type="application/x-webkit-test-webplugin"> element.
Inputs. Two inputs: (1) a computed filter value containing an SVG reference filter, and (2) the element being a plugin-instantiating replaced element. Unlike the iframe case there is no origin input — plugins have no same-origin carve-out in the cited sources; the filter is skipped for plugins unconditionally.
Outputs. Painted output only: the plugin content renders with no SVG filter effect — the WPT web-plugin reference renders the <embed> unfiltered. Computed-style effect is not defined in any cited source (explicit unknown, as with iframes); non-SVG effects around the plugin still apply via the fallback algorithm.
Errors. None by design, as with iframes: the declaration stays valid, no exception is raised, and the skip happens silently at paint time. No cited source defines a console message or devtools signal for the plugin case (explicit unknown — no stable public source).
Source: PR #13846 proposed text; ChromeStatus API feature recordContext / exposure. Same exposure as the iframe rule — desktop Chrome 150, Android 150, WebView 150, all Blink platforms, default-on with no opt-out surface. The practical case is embedded documents rendered by a plugin (for example PDFs), where the embedder has no access to the plugin's content yet could previously restyle its pixels.
Source: ChromeStatus API feature record; chromestatus feature summaryLifecycle / state transitions. Evaluated at paint time whenever the plugin's element would be painted with an SVG filter effect; there is no latched state. The cited sources define no transitions specific to plugins beyond the shared effect-tree traversal — the WPT coverage is a single static render test with an unfiltered reference.
Source: chromestatus feature summary; WPT web-plugin testExamples.
/* SKIPPED in Chrome 150+ — plugin content (e.g. the PDF viewer)
paints without the SVG filter effect. */
.plugin-embed {
filter: url(#svg-filter);
}
<!-- Unfiltered in Chrome 150+; the SVG reference filter is skipped. -->
<embed class="plugin-embed" src="document.pdf" type="application/pdf"
width="600" height="400">
<!-- CSS filter functions remain the working alternative: -->
<style>
.plugin-embed-dim { filter: brightness(0.85); }
</style>
Source: pattern from the WPT web-plugin test (url-reference filter class on <embed>); PDF example per the chromestatus feature summary
Compatibility.
| Engine | Support | Evidence |
|---|---|---|
| Chrome 150+ (desktop, Android, WebView) | Enabled by default (milestone listing) | ChromeStatus API record |
| Safari / WebKit | Restricted since 2017 — SVG filters allowed only on content in accessible security origins; plugins are not script-accessible to the embedder and lose filters | WebKit changeset 216541 (2017); WebKit bug 118689; position request #654 (open) |
| Firefox / Gecko | No position taken (request open) — currently allows SVG filters on plugins and cross-origin iframes | Mozilla standards-position #1395 (open); bugzilla 2004487 (NEW) |
| BCD / MDN compat data | Unknown — no dedicated entry exists for this behavior (explicit unknown) | PR #13846 (unmerged at review time) |
Security / privacy. Plugin content (a PDF document, for instance) is rendered by the browser on the user's behalf and is not script-accessible to the embedder — but an SVG reference filter previously let the embedder arbitrarily manipulate its painted pixels, the same clickjacking-style manipulation the iframe rule closes. Skipping the filter restores the invariant that the embedder cannot alter how protected content looks.
Source: PR #13846 (Clickjacking Attacks subsection); HTML standard — writing secure applications (clickjacking)Ancestor-effect fallback algorithm
Syntax. Not a developer-invoked construct — there is no CSS syntax to write or detect. The algorithm is the browser's defined reaction when a restricted frame or plugin would be painted inside an effect chain that includes an SVG filter: “the effect tree is traversed to find the highest ancestor without SVG filters, and that effect is then applied instead.” A page influences the outcome only by where it places non-SVG effects (e.g. opacity, transform, CSS filter functions) in the ancestor chain.
Inputs. The effect tree of the composited page at the point a restricted frame or plugin is painted, and the set of effects on the path from that frame toward the root — specifically which of those effects involve SVG filters and which do not.
Source: chromestatus feature summaryOutputs. The highest ancestor effect that does not include an SVG filter is applied to the restricted content instead of the full effect chain. When no such ancestor effect exists, the practical output is the unfiltered frame — exactly what the WPT restricted-case references render (an iframe or plugin with no filter effect).
Source: chromestatus feature summary; WPT cross-origin-frame referenceErrors. None: the traversal is an internal paint-time fallback with no exception, no invalid declaration, and no defined developer-facing signal in the cited sources (explicit unknown whether any devtools indication exists — no stable public source).
Source: ChromeStatus API feature record; PR #13846 proposed textContext / exposure. Runs wherever Blink paints a restricted frame or plugin inside an effect chain — all Blink platforms from Chrome 150. It is not observable from script except through painted output; there is no API, event, or CSS condition that exposes which fallback effect was chosen.
Source: ChromeStatus API feature record; chromestatus feature summaryLifecycle / state transitions. Recomputed as the effect tree changes: restyling ancestors, changing the frame's origin or sandbox state, or navigating the frame all re-evaluate which ancestor effect applies. The WPT reload-as-sandbox and cross-origin-navigation-in-srcdoc tests exist precisely to pin these transitions.
Source: WPT reload-as-sandbox test; WPT cross-origin-navigation-in-srcdoc testExamples. A non-SVG effect on an ancestor survives and applies to the restricted frame, because it is the highest ancestor effect without SVG filters:
/* The wrapper's opacity is the highest ancestor effect without
SVG filters — it still applies to the cross-origin frame.
The SVG filter on the frame itself is skipped. */
.embed-wrapper {
opacity: 0.9;
transform: scale(0.98);
}
.embed-wrapper iframe {
filter: url(#svg-filter); /* skipped for cross-origin/sandboxed frames */
}
Source: behavior per the chromestatus feature summary (“highest ancestor without SVG filters”)
Compatibility.
| Engine | Behavior | Evidence |
|---|---|---|
| Chrome 150+ | Highest non-SVG-filter ancestor effect applied instead | chromestatus feature summary |
| Safari / WebKit | Does not apply the filter in these cases (per the 2017 accessible-security-origin restriction; exact fallback mechanics not specified in public sources) | WebKit changeset 216541; position request #654 (open) |
| Firefox / Gecko | Currently applies SVG filters on all iframes/plugins (no fallback needed); position under consideration | Mozilla standards-position #1395 |
| Specification | Unknown — PR #13846 mandates the restriction but does not specify the ancestor-effect fallback; the algorithm is currently Chrome-implementation-defined (explicit unknown) | PR #13846 |
Security / privacy. The fallback preserves the security invariant — the restricted content is never painted through an SVG filter — while keeping the page's remaining visual effects intact, so sites do not lose non-SVG styling (opacity, transforms, CSS filter functions) around legitimate embeds. Reviewers on PR #13846 have asked for the spec to pin down exactly which reference filters and hierarchies are covered so other engines do not have to reverse-engineer this behavior.
Source: PR #13846 (proposed text + review discussion); chromestatus feature summaryExamples
The showcase feature for this change also ships sandbox-filter-test (sandboxed-frame behavior), clickjacking-replay (the attack this closes), and svg-filter-policy-tester (per-scenario checks). Per-item markup examples live in the behavior reference above.
/* Minimal probe: an SVG reference filter on a cross-origin iframe
is skipped in enforcing engines; blur() still applies everywhere. */
const frame = document.querySelector('iframe.cross-origin');
getComputedStyle(frame).filter; // the skip is paint-time only — no error,
// no invalid declaration; computed-value
// behavior is not defined in cited sources
// (explicit unknown, see behavior reference)
Source: chrome-platform-showcase feature (identity-matched to chromestatus 5117170452398080; route HEAD-checked 200, 2026-07-26)
web platform tests
The feature ships with tentative cross-browser reftests under WPT svg/styling (svg-filter-render-*.tentative.https.html). Each restricted-case test applies an feGaussianBlur url-reference filter and references a render with no filter effect; same-origin cases reference the filtered render:
- cross-origin frame — filter skipped (also nested in cross-origin and nested in same-origin)
- sandboxed frame — filter skipped, and same-origin frame reloaded as sandboxed — filter lost on reload
- srcdoc frame — filter retained (same-origin), but cross-origin navigation inside a srcdoc frame — filter lost
- same-origin frame — filter retained (also nested in cross-origin and nested in same-origin)
- web plugin — filter skipped
caveats and open questions
- Spec text not yet landed. The normative sentence is proposed in w3c/csswg-drafts PR #13846, which is open and unmerged at review time; reviewers have asked for the text to cover all reference filters that could use iframe pixel data, not only filters applied to the iframe directly.
backdrop-filteris a separate path. PR review discussion notes that filters reached viabackdrop-filteron an element in front of the frame are a distinct mechanism that the proposed text does not address; treat the restriction as covering thefilterproperty's SVG references only.- Listing vs detail status. The milestone listing files the feature under “Enabled by default” for Chrome 150, while the detail record's status text still reads “Proposed” (
accurate_as_of2026-06-01). Per repo convention the listing is authoritative for milestone and slug. - No BCD entry. browser-compat-data has no subfeature for this restriction; engine rows above cite vendor positions and WPT instead, with explicit unknowns where no source exists.
- Runtime observation (2026-07-26). On Chromium 150.0.7871.114 (Arch Linux, headless), the restriction was not active: a dual-origin test rig (same-origin, cross-origin, and sandboxed iframes plus a
blur()control, all underfilter: url(#feGaussianBlur)) showed the cross-origin and sandboxed frames rendered through the SVG filter, blurred identically to the same-origin control. The milestone listing's “Enabled by default” remains the sourced record of intent, but this build — an early-milestone distro build — does not enforce it. Because the rollout sits behind the Finch controlkPreventSvgFilterPaint, an equally plausible explanation is that the Finch configuration simply had not reached that install (checkchrome://variations). Verify on an official Chrome 150+ stable build before relying on the behavior.
browser support
| Browser | Support | Notes |
|---|---|---|
| Chrome 150+ (desktop, Android, WebView) | Enabled by default | Milestone listing; all Blink platforms |
| Edge | Unknown | No BCD entry or explicit signal; Chromium-based, so expected to follow Chrome — unverified (explicit unknown) |
| Firefox | No position taken | Currently allows SVG filters on cross-origin iframes/plugins (position request; bugzilla 2004487) |
| Safari | Restricted since 2017 | SVG filters allowed only on accessible-security-origin content; same-origin keeps filters, cross-origin/plugins lose them (changeset 216541; position request) |
Specifications
| Specification | Status | Comment |
|---|---|---|
| Filter Effects Module Level 1 | Proposed addition (PR open, unmerged) | w3c/csswg-drafts PR #13846 adds a “Clickjacking Attacks” subsection: user agents must not apply SVG reference filters to cross-origin/restricted iframes or web plugins |
| HTML — writing secure applications | Living standard (referenced) | Clickjacking guidance the PR points at |
see also
- Chrome Platform Showcase — interactive demos for this feature
- Chrome Platform Status — Disable SVG filters on plugins and iFrames
- w3c/csswg-drafts PR #13846 — [filter-effects-1] Document Clickjacking Attacks
- Filter Effects Module Level 1 (specification being amended)
- Chromium tracking bug 476646486
- SVG clickjacking research (rebane2001 — the researcher who disclosed the attack)
- Pixel Perfect Timing Attacks with HTML5 (Black Hat USA 2013)
- WebKit changeset 216541 — Restrict SVG filters to accessible security origins (2017)
- blink-dev shipping-intent thread
- HTML standard — writing secure applications with HTML (clickjacking)
- WPT svg/styling — svg-filter-render-* reftests