demo · v150
Clickjacking Replay
A reduced version of the attack from lyra.horse/blog/2025/12/svg-clickjacking. A feDisplacementMap filter is applied to two iframes — same-origin and cross-origin. In Chrome 150+ the cross-origin one renders unmolested, killing the attack vector that could read pixel data out of a victim frame.
How to read this demo: if the right-hand iframe also looks distorted, your browser still applies SVG filters cross-origin and is vulnerable. In Chrome 150+ it should look completely normal — the filter is silently dropped at the cross-origin boundary.
victim 1 — same-origin iframe (filter applies)
victim 2 — cross-origin iframe (filter blocked in v150+)
<svg><filter id="displace">
<feTurbulence baseFrequency="0.04" numOctaves="2" result="noise"/>
<feDisplacementMap in="SourceGraphic" in2="noise" scale="40"/>
</filter></svg>
.victim { filter: url(#displace); }
<!-- v150+: cross-origin iframes render without the filter -->
what attack this stops
The lyra.horse writeup demonstrated SVG filter chains acting as logic gates — reading pixel colours out of an embedded victim frame, then re-rendering them as a CAPTCHA-style challenge that, when solved by the user, leaked the underlying content. The blanket disable across cross-origin and restricted iframes closes the channel completely. Legitimate visual effects on cross-origin embeds break too, but the security trade is intentional.
see also
- Disable SVG filters on cross-origin iframes — feature index
- Filter Comparison — companion demo
- ChromeStatus entry
- Original SVG clickjacking writeup