Sprint 15.3: (0, eval)() Escape dokumentieren + Workaround evaluieren #73
Labels
No labels
bug
docs
feature
housekeeping
html-spec
performance
react-compat
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
glow-all/true-headless-browser#73
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Indirect eval
(0, eval)()— Known LimitationStatus: Unfixable per JavaScript Specification
Priorität: Niedrig (~0% der Seiten betroffen)
Problembeschreibung
(0, eval)("typeof Bun")läuft per ECMAScript-Spezifikation (Section 18.2.1) im globalen Scope. Unabhängig vonwith()-Blöcken, Proxies oder Scope-Manipulation:(0, eval)erzeugt eine indirekte Referenz auf evalwith(_win)-Block hat KEINE KontrolleFunction-Proxy aus Sprint 14 greift nicht — eval ist kein KonstruktorWarum tritt das in der Praxis nicht auf?
thisoderselfzur globalen Detektion — nicht indirect evalnew Function()(Sprint 14 fix) — nicht indirect eval(0, eval)aufrufen können, haben XSS — dann ist Sandboxing akademischMögliche Workarounds (nicht empfohlen)
Workaround A: Proxy auf Window global
⇒ Aber:
(0, eval)läuft im GLOBALEN Scope — sieht_wingarnicht.Workaround B: Bun's globalThis manipulieren
⇒ Aber: Dann sehen ALLE Pages diese Änderung — zerstört Isolation zwischen Tabs.
Workaround C: Prozess-Sandboxing
Bun.spawn()mit eigenem--evalProzess. Jede Page in eigenem Prozess.⇒ Aber: Massiver Architektur-Eingriff, Performance-Verlust.
Entscheidung
Kein Workaround. Als Known Limitation dokumentieren. Der Aufwand für einen Workaround (Options C) steht in keinem Verhältnis zum Nutzen (~0% der Seiten).
Tests
tests/unit/sprint11-script-security.test.ts— bestehender Test dokumentiert Escape✅ Bereits gelöst: Test in
tests/unit/sprint11-script-security.test.ts:204dokumentiert den Escape als unfixable per JS Spec. Kein Code-Change nötig.