<?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 16:35:05 +0000</lastBuildDate>
    <item>
      <title>CVE-2026-77415 — JSONata: Arbitrary Code Execution via crafted JSONata expressions</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2026-77415</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; jsonata-js jsonata&lt;/p&gt;
&lt;p&gt;JSONata is a JSON query and transformation language. Prior to 1.8.8 and 2.2.1, crafted JSONata expressions could chain several object-integrity weaknesses to execute arbitrary code. The chain could overwrite $clone to mutate objects through evaluateTransformExpression, expose and deconstruct JSONata functions or lambdas through $merge.*, replace proc.arguments.forEach used by applyProcedure, and forge internal lambda state. These primitives allowed an attacker to reach prototype getters, prototype and constructor access, and process.getBuiltinModule with child_process, executing code with the privileges of the host process. This issue is fixed in versions 1.8.8 and 2.2.1.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; jsonata-js jsonata&lt;/p&gt;
&lt;p&gt;JSONata is a JSON query and transformation language. Prior to 1.8.8 and 2.2.1, crafted JSONata expressions could chain several object-integrity weaknesses to execute arbitrary code. The chain could overwrite $clone to mutate objects through evaluateTransformExpression, expose and deconstruct JSONata functions or lambdas through $merge.*, replace proc.arguments.forEach used by applyProcedure, and forge internal lambda state. These primitives allowed an attacker to reach prototype getters, prototype and constructor access, and process.getBuiltinModule with child_process, executing code with the privileges of the host process. This issue is fixed in versions 1.8.8 and 2.2.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2026-77415</guid>
    </item>
    <item>
      <title>GHSA-66mm-25pp-rfff — JSONata vulnerable to Arbitrary Code Execution via crafted JSONata expressions</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-66mm-25pp-rfff</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: jsonata&lt;/p&gt;
&lt;p&gt;Before JSONata `2.2.1` and `1.8.8` it was possible to execute arbitrary code with
crafted expressions, due to:
- overwriting `$clone` allowing mutation of objects via transforms (see
[`evaluateTransformExpression`](https://github.com/jsonata-js/jsonata/blob/8ee4476f8a228bfc7a62979ae0a9c13a4043cd03/src/jsonata.js#L1304-L1314))
- it being possible to destruct jsonata functions/lambdas (e.g. `$merge.*`)
- [applyProcedure](https://github.com/jsonata-js/jsonata/blob/8ee4476f8a228bfc7a62979ae0a9c13a4043cd03/src/jsonata.js#L1670C20-L1675)
using `proc.arguments.forEach` and not `Array.prototype.forEach`&lt;/p&gt;
&lt;p&gt;Which could be chained to execute arbitrary code.&lt;/p&gt;
&lt;p&gt;This was fixed with:&lt;/p&gt;
&lt;p&gt;- https://github.com/jsonata-js/jsonata/pull/799
(https://github.com/jsonata-js/jsonata/pull/799/changes#diff-de23c1b6e199d0e59406a284aae5fa7be63fcbbff706829913dba73dcdeb061cL1673-R1673)
- https://github.com/jsonata-js/jsonata/pull/800
- https://github.com/jsonata-js/jsonata/pull/802&lt;/p&gt;
&lt;p&gt;Which are included in the `2.2.1` release. Fixes were then back-ported to the `1.8.8` release.&lt;/p&gt;
&lt;p&gt;## PoC&lt;/p&gt;
&lt;p&gt;```js
import jsonata from &amp;#34;jsonata&amp;#34;;&lt;/p&gt;
&lt;p&gt;const expression = jsonata(`
(
    $obj := {};
    $clone := function($o) { $o };
    $m := ($merge.*)[1];&lt;/p&gt;
&lt;p&gt;$fn := function($a) {
        (
            $a({&amp;#34;value&amp;#34;:&amp;#34;lg&amp;#34;},&amp;#34;__lookupGetter__&amp;#34;);
            $a({&amp;#34;value&amp;#34;:&amp;#34;x&amp;#34;},&amp;#34;x&amp;#34;);
        )
    };&lt;/p&gt;
&lt;p&gt;$nop := function() { $ };&lt;/p&gt;
&lt;p&gt;$capture := function($val) {
        $obj ~&amp;gt; | $obj | {&amp;#34;x&amp;#34;: 1, &amp;#34;y&amp;#34;: 1, &amp;#34;lg&amp;#34;:$lg} |
    };&lt;/p&gt;
&lt;p&gt;$ ~&amp;gt; | $ | $m([$…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: jsonata&lt;/p&gt;
&lt;p&gt;Before JSONata `2.2.1` and `1.8.8` it was possible to execute arbitrary code with
crafted expressions, due to:
- overwriting `$clone` allowing mutation of objects via transforms (see
[`evaluateTransformExpression`](https://github.com/jsonata-js/jsonata/blob/8ee4476f8a228bfc7a62979ae0a9c13a4043cd03/src/jsonata.js#L1304-L1314))
- it being possible to destruct jsonata functions/lambdas (e.g. `$merge.*`)
- [applyProcedure](https://github.com/jsonata-js/jsonata/blob/8ee4476f8a228bfc7a62979ae0a9c13a4043cd03/src/jsonata.js#L1670C20-L1675)
using `proc.arguments.forEach` and not `Array.prototype.forEach`&lt;/p&gt;
&lt;p&gt;Which could be chained to execute arbitrary code.&lt;/p&gt;
&lt;p&gt;This was fixed with:&lt;/p&gt;
&lt;p&gt;- https://github.com/jsonata-js/jsonata/pull/799
(https://github.com/jsonata-js/jsonata/pull/799/changes#diff-de23c1b6e199d0e59406a284aae5fa7be63fcbbff706829913dba73dcdeb061cL1673-R1673)
- https://github.com/jsonata-js/jsonata/pull/800
- https://github.com/jsonata-js/jsonata/pull/802&lt;/p&gt;
&lt;p&gt;Which are included in the `2.2.1` release. Fixes were then back-ported to the `1.8.8` release.&lt;/p&gt;
&lt;p&gt;## PoC&lt;/p&gt;
&lt;p&gt;```js
import jsonata from &amp;#34;jsonata&amp;#34;;&lt;/p&gt;
&lt;p&gt;const expression = jsonata(`
(
    $obj := {};
    $clone := function($o) { $o };
    $m := ($merge.*)[1];&lt;/p&gt;
&lt;p&gt;$fn := function($a) {
        (
            $a({&amp;#34;value&amp;#34;:&amp;#34;lg&amp;#34;},&amp;#34;__lookupGetter__&amp;#34;);
            $a({&amp;#34;value&amp;#34;:&amp;#34;x&amp;#34;},&amp;#34;x&amp;#34;);
        )
    };&lt;/p&gt;
&lt;p&gt;$nop := function() { $ };&lt;/p&gt;
&lt;p&gt;$capture := function($val) {
        $obj ~&amp;gt; | $obj | {&amp;#34;x&amp;#34;: 1, &amp;#34;y&amp;#34;: 1, &amp;#34;lg&amp;#34;:$lg} |
    };&lt;/p&gt;
&lt;p&gt;$ ~&amp;gt; | $ | $m([$…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-66mm-25pp-rfff</guid>
    </item>
  </channel>
</rss>
