S11.3: new Function() / eval() Escape aus Page-Sandbox verhindern #64
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#64
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?
Problembeschreibung
Page-Scripts können via
new Function()oder indirektemeval()die Sandbox verlassen, weil diese Konstrukte im globalen Bun-Scope ausgeführt werden:Ursache:
new Function()erzeugt einen FRESH globalen Scope, der NICHT imwith(_win)liegt.(0, eval)()ist indirect eval, das im globalen Scope läuft.Lösungsansatz
Option A (Proxy-patch):
Function.prototypepatchen, sodassnew Function(code)automatisch in unserem Realm ausgeführt wird.Option B (eval-patch): Indirektes eval abfangen.
Option C (security-by-depth): Zusätzliche Node-Blocker in den
new Function-Parametern — abernew Functionhat keinen Zugriff auf lokale vars. Die einzige Möglichkeit ist, die globalen Referenzen zu blocken.Option D (require/import blocken):
var require = void 0;undvar import = void 0;imwith(_win). Das verhindert Zugriff auf Node-Module aber nicht auf globale Werte.Entscheidung: Mehrschichtiger Ansatz:
var(S11.2)require/importblocken in diesem IssueFunction.prototypepatchen als optionale Hardening-SchichtAkzeptanzkriterien
new Function('return typeof Bun')()→"undefined"(0, eval)('typeof process')→"undefined"oder Sicherheitsfehlertypeof require→"undefined"im Page-ScriptBetroffene Dateien
src/js/execution-realm.tsvar require = void 0; var import = void 0;src/js/execution-realm.tsFunction.prototypePatch (optional)tests/unit/sprint11-sandbox-escape.test.tsRisiken
Function.prototypePatch könnte Webpack/CRA Builds brechen dienew Functionnutzenimportblocken könnte dynamicimport()in Modulen brechenTestplan
Sprint 14 — Fix implementiert ✅
Commit:
dc0c24b24 Tests — 0 Regression
Die
new Function()Escape-Lücke ist geschlossen:new Function("return typeof Bun")()→undefined(vorher:"object")window.Function,globalThis.Functionebenfalls gesandboxtthis === windowin new Function() korrigiertnew Function()korrekt gekapseltVerbleibend:
(0, eval)("typeof Bun")— Indirect eval. Das ist per JS-Spec nicht abfangbar (eval wird im globalen Scope ausgeführt). Wird als separates Issue dokumentiert.