
Isolierte JavaScript-Sandbox für Node.js, die nicht vertrauenswürdigen Code mit eingeschränktem Zugriff auf eingebaute Module und Host-Ressourcen über Proxy-basierte Abfangmechanismen ausführt.
vm2 ist eine Sandbox, die nicht vertrauenswürdigen Code mit auf die Whitelist gesetzten eingebauten Node-Modulen ausführen kann.
npm install vm2
## Schnellbeispiele```js
import { VM } from 'vm2';
const vm = new VM();
vm.run(`process.exit()`); // TypeError: process.exit is not a function
## Installation
To install `nuclei`, you need [Go](https://golang.org/dl/) installed on your system. Then you can install it with the following command:
```bash
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
Alternatively, you can download the pre-built binaries from the Releases page.
You can also run nuclei using Docker:
docker pull projectdiscovery/nuclei:latest
docker run -it projectdiscovery/nuclei:latest
If you are on macOS or Linux, you can install nuclei via Homebrew:
brew install nuclei
nuclei -h
This will display help for the tool. Here are all the switches it supports.
Usage:
nuclei [flags]
Flags:
INPUT:
-u, -target string[] target URLs/hosts to scan
-l, -list string path to file containing a list of target URLs/hosts to scan (one per line)
-resume string resume scan using resume.cfg (clustering will be disabled)
-sa, -scan-all-ips scan all the IP's associated with DNS record
-health-check run diagnostic check up
``````js
import { NodeVM } from 'vm2';
const vm = new NodeVM({
require: {
external: true,
root: './',
},
});
vm.run(
`
var request = require('request');
request('http://www.google.com', function (error, response, body) {
console.error(error);
if (!error && response.statusCode == 200) {
console.log(body); // Show the HTML for the Google homepage.
}
});
`,
'vm.js',
);
Bevor Sie vm2 verwenden, sollten Sie verstehen, wie es funktioniert und welche Einschränkungen es hat.
vm2 versucht, nicht vertrauenswürdigen JavaScript-Code im selben Node.js-Prozess wie Ihre Anwendung zu sandboxen. Dies geschieht über ein komplexes Netzwerk von Proxies, die jede Interaktion zwischen der Sandbox und der Host-Umgebung abfangen und vermitteln.
JavaScript ist eine außergewöhnlich dynamische Sprache. Objekte können über Prototyp-Ketten erreicht werden, Konstruktoren können über Fehlerobjekte erreicht werden, Symbole bieten Protokoll-Hooks, und asynchrone Ausführung erzeugt Timing-Fenster. Die schiere Anzahl an Möglichkeiten, in JavaScript von einem Objekt zu einem anderen zu gelangen, macht es äußerst schwierig, eine luftdichte In-Process-Sandbox zu bauen.
Wir sind ehrlich bezüglich dieser Realität: Trotz unserer besten Bemühungen entdecken Forscher und Sicherheitsexperten kontinuierlich neue Wege, die vm2-Sandbox zu umgehen. Wir patchen diese Schwachstellen aktiv, sobald sie gemeldet werden, aber die Natur des Katz-und-Maus-Spiels bei In-Process-Sandboxing bedeutet:
Wenn Sie stärkere Isolationsgarantien benötigen, ziehen Sie diese Alternativen in Betracht, die echte Prozess- oder Hardware-Level-Isolation bieten:
| Lösung | Ansatz | Leistung | Kompromisse |
|---|---|---|---|
| isolated-vm | Separate V8-Isolate (verschiedene V8-Heaps) | Schnell | Im Wartungsmodus; erfordert manuelle V8-Updates |
| Separater Prozess / Worker | child_process oder Worker-Threads mit eingeschränkten Berechtigungen | Mittel | Höherer IPC-Overhead; Daten müssen serialisiert werden |
| Container / VMs | Docker, gVisor, Firecracker | Langsam | Start-Overhead; ressourcenintensiv |
| Verwaltete Dienste | Cloud-basierte Code-Ausführung (z. B. AWS Lambda, Cloudflare Workers) | Variabel | Netzwerklatenz; externe Abhängigkeit |
vm2 kann geeignet sein, wenn:
Wenn Sie Code aus vollständig nicht vertrauenswürdigen Quellen ausführen (z. B. beliebige Benutzereinsendungen), empfehlen wir dringend eine Lösung mit stärkeren Isolationsgarantien.
| Laufzeitumgebung | Status |
|---|---|
| Node.js | Unterstützt. Die Sandbox ist eine Sicherheitsgrenze. |
| Bun | Experimentell. Teilweise funktionale Kompatibilität — keine Sicherheitsgrenze. |
Für Bun gelten zwei getrennte Einschränkungen, und keine impliziert die andere.
Es ist keine Sicherheitsgrenze. Das Bedrohungsmodell von vm2, der Angriffskatalog in
docs/ATTACKS.md und jeder Regressionstest in test/ghsa/
leiten sich aus V8-Interna ab. JavaScriptCore, das Bun verwendet, hat seine eigenen
Äquivalente, und keines wurde gegen die vm2-Brücke geprüft. Das Bestehen der Testsuite
unter Bun zeigt Kompatibilität, nicht dass die Sandbox dort hält. Verwenden Sie
vm2 unter Bun nicht, um nicht vertrauenswürdigen Code zu isolieren.
Die Kompatibilität ist teilweise, nicht gleichwertig. Ein grüner Bun-Lauf deckt nur die Tests ab,
die dort tatsächlich ausgeführt werden. test/bun-skips.js listet auf, was ausgeschlossen ist und warum,
und die bekannten Verhaltenslücken umfassen:
Buffer.from(arrayLike) gibt einen Puffer mit der Länge null zurückVMScript-Metadaten für filename / lineOffset / columnOffset sind nicht
beobachtbar, da JSC-CallSite-Objekte keine Methoden tragenObject.freeze auf einem eingefrorenen Host-Objekt mit einem nicht konfigurierbaren Accessor
wirft einen Proxy-Invariant-TypeError, wo V8 dies nicht tutBuffer-Operationen über die Sandbox-Grenze hinweg sind drastisch langsamer —
eine 64-MB-allocUnsafe dauert über 400 Sekunden gegenüber 1,7 unter Node, langsam genug,
um wie ein Hänger zu wirkenBehandeln Sie die Bun-Unterstützung als Best-Effort-Kompatibilität für vertrauenswürdigen Code und prüfen Sie die Skip-Liste, bevor Sie sich auf ein bestimmtes Verhalten verlassen.