In this lesson, you will learn how to safely execute untrusted or third-party task logic by isolating it within a restricted virtual machine context.
When your background workers process tasks provided by users—such as custom transformation scripts or plugin logic—running that code directly in your main process is dangerous. A malicious or poorly written script could access sensitive environment variables, manipulate the filesystem, or crash your entire worker process.
To mitigate this, we use the Node.js built-in vm module to create a sandbox. Instead of running code in the global scope, you initialize a context—a plain JavaScript object—that acts as the only available environment for the task.
Restricting Execution
When you run code in a sandbox, you control exactly which globals and functions are exposed to the task. If you don't provide a require function or access to process, the code cannot interact with your operating system or network.
Here is a simple implementation:
const vm = require('vm');
function runUntrustedTask(taskCode, inputData) {
// Define a restricted sandbox object
const sandbox = {
input: inputData,
result: null,
console: { log: () => {} } // Prevent spamming stdout
};
// Create a contextified object
vm.createContext(sandbox);
// Execute the code safely
vm.runInContext(taskCode, sandbox, { timeout: 1000 });
return sandbox.result;
}
// The user-provided script can only touch 'input' and 'result'
const script = 'result = input * 2;';
console.log(runUntrustedTask(script, 21)); // 42
Important Limitations
It is critical to note that while vm prevents accidental data leakage, it is not a security boundary against malicious code. Sophisticated attackers can often escape vm contexts to access the underlying Node.js instance. For high-stakes security, you should combine sandboxing with process-level isolation, such as running the task in a separate, low-privilege child_process or a containerized environment. Use vm primarily to prevent simple runtime errors from impacting your main task executor.
Key Takeaway: Use the vm module to define isolated execution contexts for third-party scripts, ensuring they only have access to the specific data and functions you explicitly expose.