TGViewer
melikhov.dev melikhov.dev @melikhov_dev · 4.74K subscribers
Post #237 5K
В ноде есть встроенный механизм песочницы для запуска опасного кода. vm.runInNewContext(<код>, <контекст>) и погнали. Лучше и безопаснее eval, но... со своими проблемами. Всё ещё можно вылезти из песочницы и ударить в глобал. this.constructor.constructor и побежали веселиться.

Но вот ещё про одну забавную проблему расскажу.

Как можно подвесить процесс через песочницу? Очень просто:


vm.runInNewContext('while(true){}',{});


Но вы скажете, что есть же параметр timeout:


vm.runInNewContext('while(true){}',{timeout: 5});


Уже лучше. Но проблема в том, что timeout не ловит микротаски. Выносим луп в микротаску и снова DoS


vm.runInNewContext(
'Promise.resolve().then(()=>{while(true) {}});',
{},
{timeout:5}
);


Ок, проблема известная, в 15-й ноде дырку заделали фанерой.


vm.runInNewContext(
'Promise.resolve().then(()=>{while(true) {}});',
{},
{timeout:5, microtaskMode: 'afterEvaluate'}
);


Почему такое апи? Ума не приложу :) Но в этом режиме песочница разматывает микротаски сразу после макротасок и таймаут общий. Почти хорошо стало, но что если мы решили передать в песочницу что-нибудь асинхронное? И пользователь сможет выйти на следующий луп. Тогда ой:


vm.runInNewContext(
`
setTimeout(() => {
while(true) {};
}, 10000);`,
{setTimeout},
{timeout:5, microtaskMode: 'afterEvaluate'}
);


Всё попало, шеф. У нас DoS.

В общем, посмотрите лучше на vm2 или на более интересную изоляцию через isolated-vm
GitHub vm: add run-after-evaluate microtask mode · nodejs/node@f63436d This allows timeouts to apply to e.g. `Promise`s and `async function`s from code running inside of `vm.Context`s, by giving the Context its own microtasks queue. Fixes: https://github.com/nodejs/n...
  • ❤ 20
  • 🔥 10
  • 👍 4
  • 👀 1
More from @melikhov_dev
  1. Sep 26, 2026Блин, ну нравятся мне TUI решения, сил нет. Просто, красиво и понятно (для меня). Продолжа…
  2. Sep 13, 2026Какой он — личный харнес? Вот мы и пришли в точку, когда уже бизнес не устраивает медленна…
  3. Aug 30, 2026Разобрал своего питонячего новостного бота и собрал нового, уже на Гермесе. Ну как собрал…
  4. Aug 24, 2026Вы могли наверное заметить что как-то мало меня стало в последнее время. Не видно на конфе…
  5. Aug 6, 2026Как же хорошо перечитывается сейчас «Трилогия Муравейника» Гибсона (она же Sprawl trilogy)…
  6. Aug 1, 2026github показал очередную полезную штуку — Stacked pull requests. Даже жалко, что как обычн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →