Warum können JavaScript-Shellcode-Exploits nicht über die Funktion "Verhinderung der Datenausführung" behoben werden?

Das "Haufenspritzen" Wikipedia-Artikel schlägt vor, dass bei vielen Javascript-Exploits ein Shellcode irgendwo im ausführbaren Code oder im Speicher des Datenraums des Skripts positioniert und der Interpreter dorthin springt und ihn ausführt. Was ich nicht verstehe ist, warum kann der gesamte Heap des Interpreters nicht als "Daten" markiert werden, so dass der Interpreter den Shellcode von DEP nicht ausführen kann? In der Zwischenzeit würde die Ausführung des von Javascript abgeleiteten Bytecodes durch eine virtuelle Maschine erfolgen, die es nicht ermöglichen würde, den zum Interpreter gehörenden Speicher zu ändern (dies würde in V8 nicht funktionieren, das scheinbar Maschinencode ausführt, würde aber wahrscheinlich in Firefox funktionieren, das irgendeine Art von Code verwendet Bytecode).

Ich denke, das klingt trivial und wahrscheinlich wird tatsächlich so etwas getan. Ich versuche also zu verstehen, wo der Fehler in der Argumentation oder der Fehler in vorhandenen Interpreter-Implementierungen liegt. Z.B. Verlässt sich der Interpreter auf die Speicherzuordnung des Systems, anstatt seine eigene interne Zuordnung zu implementieren, wenn Javascript nach Speicher fragt, wodurch es übermäßig schwierig wird, den zum Interpreter und zum Javascript gehörenden Speicher zu trennen? Oder warum können die DEP-basierten Methoden Shellcodes nicht vollständig eliminieren?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage