<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Mon, 05 Oct 2026 20:39:53 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-92935</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-92935</link>
      <description>&lt;p&gt;vm2 is a sandbox for running untrusted Node.js code. In versions &amp;gt;= 3.11.4 and &amp;lt;= 3.11.6, the NodeVM constructor computes `hasRealRequireConfig` with `typeof requireOpts === &amp;#39;object&amp;#39; &amp;amp;&amp;amp; requireOpts !== null`, so an array-shaped `require` value (for example `require: []`) satisfies the guard that is meant to reject nesting without an explicit require configuration. `makeResolverFromLegacyOptions()` then destructures the array into undefined option fields and returns a resolver containing only `NESTING_OVERRIDE.vm2`. As a result, an attacker who can supply JavaScript executed by a NodeVM configured with truthy `nesting` and an array-shaped `require` (e.g. `new NodeVM({nesting: true, require: []})`) can require the host `vm2` module, create an inner NodeVM with an attacker-chosen builtin allowlist (such as `child_process`), and execute arbitrary commands with the privileges of the host Node.js process, escaping the sandbox. Outer builtin restrictions do not constrain the attacker-created inner NodeVM. This issue is fixed in vm2 3.11.7.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;vm2 is a sandbox for running untrusted Node.js code. In versions &amp;gt;= 3.11.4 and &amp;lt;= 3.11.6, the NodeVM constructor computes `hasRealRequireConfig` with `typeof requireOpts === &amp;#39;object&amp;#39; &amp;amp;&amp;amp; requireOpts !== null`, so an array-shaped `require` value (for example `require: []`) satisfies the guard that is meant to reject nesting without an explicit require configuration. `makeResolverFromLegacyOptions()` then destructures the array into undefined option fields and returns a resolver containing only `NESTING_OVERRIDE.vm2`. As a result, an attacker who can supply JavaScript executed by a NodeVM configured with truthy `nesting` and an array-shaped `require` (e.g. `new NodeVM({nesting: true, require: []})`) can require the host `vm2` module, create an inner NodeVM with an attacker-chosen builtin allowlist (such as `child_process`), and execute arbitrary commands with the privileges of the host Node.js process, escaping the sandbox. Outer builtin restrictions do not constrain the attacker-created inner NodeVM. This issue is fixed in vm2 3.11.7.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-92935</guid>
    </item>
    <item>
      <title>GHSA-8hr7-r645-pc6w — vm2: NodeVM nesting guard accepts array-shaped require and permits host RCE</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-8hr7-r645-pc6w</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: vm2&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `NodeVM` constructor computes `hasRealRequireConfig` using `typeof requireOpts === &amp;#39;object&amp;#39; &amp;amp;&amp;amp; requireOpts !== null`, so `require: []` bypasses the guard intended to reject `nesting` without an explicit require configuration. `makeResolverFromLegacyOptions()` then destructures the array to undefined option fields and returns a resolver containing only `NESTING_OVERRIDE.vm2`. Any attacker whose JavaScript is executed by a downstream `NodeVM` configured with `{nesting: true, require: []}` can load the host `vm2` module, create an inner `NodeVM` with an attacker-selected builtin allowlist, and execute commands as the host process. No equivalent plain-object validation exists in `makeResolverFromLegacyOptions()`.&lt;/p&gt;
&lt;p&gt;Array is converted into the vm2-only resolver:
https://github.com/patriksimek/vm2/blob/54b54b74a382577f0bcd0538c5bf99acdcd7f53b/lib/resolver-compat.js#L205-L226&lt;/p&gt;
&lt;p&gt;Nesting loader returns the host VM constructors:
https://github.com/patriksimek/vm2/blob/54b54b74a382577f0bcd0538c5bf99acdcd7f53b/lib/nodevm.js#L640-L645&lt;/p&gt;
&lt;p&gt;## Proof of Concept&lt;/p&gt;
&lt;p&gt;Preconditions:&lt;/p&gt;
&lt;p&gt;- The host creates `NodeVM` with truthy `nesting` and array-shaped `require`.
- The attacker can supply JavaScript executed by that `NodeVM`.&lt;/p&gt;
&lt;p&gt;```javascript
&amp;#39;use strict&amp;#39;;&lt;/p&gt;
&lt;p&gt;const {NodeVM} = require(&amp;#39;./index.js&amp;#39;);&lt;/p&gt;
&lt;p&gt;const outer = new NodeVM({nesting: true, require: []});
const result = outer.run(`
	const {NodeVM} = require(&amp;#39;vm2&amp;#39;);
	const inner = new NodeVM({require: {builtin: [&amp;#39;child_process&amp;#39;]}});
	module.exp…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: vm2&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The `NodeVM` constructor computes `hasRealRequireConfig` using `typeof requireOpts === &amp;#39;object&amp;#39; &amp;amp;&amp;amp; requireOpts !== null`, so `require: []` bypasses the guard intended to reject `nesting` without an explicit require configuration. `makeResolverFromLegacyOptions()` then destructures the array to undefined option fields and returns a resolver containing only `NESTING_OVERRIDE.vm2`. Any attacker whose JavaScript is executed by a downstream `NodeVM` configured with `{nesting: true, require: []}` can load the host `vm2` module, create an inner `NodeVM` with an attacker-selected builtin allowlist, and execute commands as the host process. No equivalent plain-object validation exists in `makeResolverFromLegacyOptions()`.&lt;/p&gt;
&lt;p&gt;Array is converted into the vm2-only resolver:
https://github.com/patriksimek/vm2/blob/54b54b74a382577f0bcd0538c5bf99acdcd7f53b/lib/resolver-compat.js#L205-L226&lt;/p&gt;
&lt;p&gt;Nesting loader returns the host VM constructors:
https://github.com/patriksimek/vm2/blob/54b54b74a382577f0bcd0538c5bf99acdcd7f53b/lib/nodevm.js#L640-L645&lt;/p&gt;
&lt;p&gt;## Proof of Concept&lt;/p&gt;
&lt;p&gt;Preconditions:&lt;/p&gt;
&lt;p&gt;- The host creates `NodeVM` with truthy `nesting` and array-shaped `require`.
- The attacker can supply JavaScript executed by that `NodeVM`.&lt;/p&gt;
&lt;p&gt;```javascript
&amp;#39;use strict&amp;#39;;&lt;/p&gt;
&lt;p&gt;const {NodeVM} = require(&amp;#39;./index.js&amp;#39;);&lt;/p&gt;
&lt;p&gt;const outer = new NodeVM({nesting: true, require: []});
const result = outer.run(`
	const {NodeVM} = require(&amp;#39;vm2&amp;#39;);
	const inner = new NodeVM({require: {builtin: [&amp;#39;child_process&amp;#39;]}});
	module.exp…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-8hr7-r645-pc6w</guid>
    </item>
  </channel>
</rss>
