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)

filter applied

victim 2 — cross-origin iframe (filter blocked in v150+)

probing…
<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