XS-Leaks — cross-site information leaks via timing, frame counting, navigation, error oracles. Side-channel attacks against same-origin authenticated state.
49
53%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Critical
Do not install without reviewing
Fix and improve this skill with Tessl
tessl review fix ./packages/decepticon/decepticon/skills/standard/exploit/web/xs-leaks/SKILL.mdXS-Leaks abuse browser primitives that leak information ACROSS origins. Attacker page can observe whether a cross-origin GET returned different content based on victim's authenticated state. Smaller than full cross-origin read (which is blocked), but enough to enumerate identifiers, detect membership, learn search-result presence.
Cross-origin fetch / image load timing varies by server response size. Attacker measures load time → infers content.
const start = performance.now();
const img = new Image();
img.onerror = () => console.log(performance.now() - start);
img.src = 'https://target.com/api/users/me/notifications';window.frames.length)Some pages embed N iframes when authenticated and 0 when not. Attacker
iframes target page and reads iframe.contentWindow.frames.length.
iframe.contentWindow.name is preserved across navigation. Some pages
set it w/ user-identifying data.
<img src=target.com/api/user/{id}/data> triggers different onerror
behavior based on response code (403 vs 404 vs 200 w/ image content-type).
<link rel=stylesheet href=target.com/page> — different applied styles
leak state via getComputedStyle of attacker page.
Many search endpoints return cached/non-cached headers indicating hits. Attacker measures cache hit vs miss timing for guessed search terms.
for (const guessed_id of guessable_set) {
const url = `https://target.com/api/user/${guessed_id}`;
// measure timing or frame-count differential
}Full taxonomy + browser-version compatibility matrix: https://xsleaks.dev/
Decepticon agents should consult this for current technique viability — browser mitigations evolve fast (COOP, COEP, Cross-Origin-Opener-Policy).
// Frame count
const f = document.createElement('iframe');
f.src = 'https://target.com/dashboard'; // attacker hosts this in own page
document.body.appendChild(f);
f.onload = () => {
console.log('frames:', f.contentWindow.frames.length);
};
// Timing
async function timeFetch(url) {
const t = performance.now();
try { await fetch(url, {mode:'no-cors', credentials:'include'}); } catch {}
return performance.now() - t;
}XS-Leak PoCs require:
Document the attack page, record video of victim browser visiting it → inferred information displayed.
| Bug | Severity |
|---|---|
| XS-Search enumerating victim's private documents | High 7-8 |
| Frame-count revealing logged-in state | Medium 5-6 |
| Timing oracle inferring victim email / ID | High 7-8 |
| Window.name leaking session info | High 7-8 |
| Cross-origin error-event leaking which users exist | Medium 4-5 |
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corpCross-Origin-Resource-Policy: same-originX-Frame-Options: DENY or frame-ancestors 'none' in CSPVary: Cookie + careful cachingskills/_corpus/payloads/XS-Leak/skills/exploit/web/dom-clobbering/SKILL.mde34afba
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.