- [x] 🔐 Run untrusted JavaScript code in an isolated environment.
- [x] 👽 Pass external APIs (Objects, Functions, Classes) and let untrusted JavaScript code to use them.
- [ ] ⏱️ Timeout and memory usage limits. See halting problem.
- [x] ⚛️ Available in electron render. See issue from electron.
- [x] 🪟 (Almost) Fully transparent. You can even replace
vm()
withwindow
(if you don't want protection)! - [x] 🤔 Keep traceback & code from hackers / DevTools. DevTools will be unable to inspect your code or use
debugger
. - [ ] 🧑💻 ESM support (You can use
babel
to implement that though).
npm install secure-vm
yarn add secure-vm
pnpm install seucre-vm
<script src="https://cdn.jsdelivr.net/npm/secure-vm@latest/dist/index.global.js"></script>
<script>
const ctx = SecureVM.vm()
</script>
import { vm } from 'secure-vm'
const ctx = vm() // Create an isolated context.
ctx.console = globalThis.console
ctx.eval(`
console.log("Hello secure-vm")
`)
☣️ This is an experimental library that may be incompatible with some old browser kernels (for example, Opera). However, it works on latest versions of Chromium, Firefox, Edge and Safari.
💫 Try it out by yourself: (Demo not ready)
✅ To create a simple isolation, you only have to use a simple function, const ctx = vm() 👽 You can bypass almost everything to your sandbox and it will work properly, for example, const ctx = vm({ console })
let callback
ctx.test = new Promise(resolve => {
callback = resolve
})
ctx.eval(`
test.then(value => {
console.log(value)
})
`)
callback('Hello World!') |
🥰 Feel free to add anything you want, secure-vm also fixed almost all security issues on evel, for example, Object.prototype bypass will fail. ctx.fetch = fetch
ctx.console = console
fetch('some furry pics')
.then(
ctx.eval(`
req => {
console.log(req)
return req.text()
}
`)
)
.then(v => {
console.log(v)
}) 🤖 Dynamic Maybe we can run these code by using import('data:text/javascript,console.log(window)')
// TypeError: Cannot import module from an inactive browsing context. (Chromium)
// TypeError: error loading dynamically imported module: data:text/javascript,console.log(window) (Firefox) |
🔏 secure-vm will automatically erase the traceback line info (if available) so hackers cannot access source code, making it harder to deobfuscate. ctx.eval(`
function throwError() {
throw new Error('Where is it?')
}
throwError() // throwError() will not be displayed in the DevTools traceback (Edge, Chromium, Firefox).
`) |
😎 You can customize global objects by: const ctx = vm({ WebAssembly })
ctx. // type hint: WebAssembly ...or use our default whitelist by: const ctx = vm() |
This project is licensed under the MIT license.
❤️