From 93d92c45859ac866f15a379aea650fefdfec3a9f Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Fri, 14 Aug 2026 12:39:21 -0700 Subject: [PATCH] fix(make-pdf): close the offline-gate bypass via raw-HTML fetch vectors With --allow-network off, the sanitizer stripped script/iframe/link but let Chromium fetch remote resources at print time through four raw-HTML vectors: `; + const out = sanitizeUntrustedHtml(input); + expect(out).not.toContain("@import"); + expect(out).not.toContain("evil.example"); + expect(out).toContain("color: red"); + }); + + test("strips string-form @import (no url())", () => { + const out = sanitizeUntrustedHtml(``); + expect(out).not.toContain("@import"); + expect(out).not.toContain("evil.example"); + }); + + test("neutralizes remote url() inside `; + const out = sanitizeUntrustedHtml(input); + expect(out).not.toContain("evil.example"); + expect(out).toContain("url(#)"); + expect(out).toContain("color: blue"); + }); + + test("neutralizes remote url() in inline style attributes", () => { + const input = `
x
`; + const out = sanitizeUntrustedHtml(input); + expect(out).not.toContain("evil.example"); + expect(out).toContain("url(#)"); + expect(out).toContain("padding:4px"); + }); + + test("neutralizes protocol-relative url(//…) in style attributes", () => { + const out = sanitizeUntrustedHtml(`
x
`); + expect(out).not.toContain("evil.example"); + }); + + test("strips srcset with a remote candidate, leaves src for the inliner", () => { + const input = ``; + const out = sanitizeUntrustedHtml(input); + expect(out).not.toContain("srcset"); + expect(out).not.toContain("evil.example"); + expect(out).toContain(`src="local.png"`); + }); + + test("strips unquoted remote srcset", () => { + const out = sanitizeUntrustedHtml(``); + expect(out).not.toContain("evil.example"); + }); + + test("keeps local-only srcset (no network vector)", () => { + const input = ``; + expect(sanitizeUntrustedHtml(input)).toContain(`srcset="a.png 1x, a@2x.png 2x"`); + }); + + test("neutralizes remote