<?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>Tue, 29 Sep 2026 04:57:49 +0000</lastBuildDate>
    <item>
      <title>GHSA-r5mx-6wc6-7h9w — dottie is vulnerable to Prototype Pollution bypass via non-first path segments in set() and transform()</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-r5mx-6wc6-7h9w</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: dottie&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;dottie versions 2.0.4 through 2.0.6 contain an incomplete fix for CVE-2023-26132. The prototype pollution guard introduced in commit `7d3aee1` only validates the first segment of a dot-separated path, allowing an attacker to bypass the protection by placing `__proto__` at any position other than the first.&lt;/p&gt;
&lt;p&gt;Both `dottie.set()` and `dottie.transform()` are affected.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The existing guard checks only `pieces[0] === &amp;#39;__proto__&amp;#39;`. When a path like `&amp;#39;a.__proto__.polluted&amp;#39;` is used, `pieces[0]` evaluates to `&amp;#39;a&amp;#39;`, not `&amp;#39;__proto__&amp;#39;`, so the guard is bypassed.&lt;/p&gt;
&lt;p&gt;Inside the traversal loop, `current[&amp;#39;__proto__&amp;#39;] = {}` triggers the `__proto__` setter, replacing the intermediate object&amp;#39;s prototype. The final value is then written onto this new prototype.&lt;/p&gt;
&lt;p&gt;**Important distinction:** This vulnerability does NOT pollute the global `Object.prototype`. It injects properties into a specific object&amp;#39;s prototype chain. However, injected properties are invisible to `hasOwnProperty()` and `Object.keys()`, which makes them difficult to detect and can lead to authorization bypass in common coding patterns.&lt;/p&gt;
&lt;p&gt;### PoC
```javascript
const dottie = require(&amp;#39;dottie&amp;#39;);&lt;/p&gt;
&lt;p&gt;// set() bypass
const obj = {};
dottie.set(obj, &amp;#39;session.__proto__.isAdmin&amp;#39;, true);
console.log(obj.session.isAdmin);                    // true
console.log(({}).isAdmin);                           // undefined
console.log(obj.session.hasOwnProperty(&amp;#39;isAdmin&amp;#39;));  // false&lt;/p&gt;
&lt;p&gt;// transform() bypass
const flat = { &amp;#39;user.__…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: dottie&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;dottie versions 2.0.4 through 2.0.6 contain an incomplete fix for CVE-2023-26132. The prototype pollution guard introduced in commit `7d3aee1` only validates the first segment of a dot-separated path, allowing an attacker to bypass the protection by placing `__proto__` at any position other than the first.&lt;/p&gt;
&lt;p&gt;Both `dottie.set()` and `dottie.transform()` are affected.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;The existing guard checks only `pieces[0] === &amp;#39;__proto__&amp;#39;`. When a path like `&amp;#39;a.__proto__.polluted&amp;#39;` is used, `pieces[0]` evaluates to `&amp;#39;a&amp;#39;`, not `&amp;#39;__proto__&amp;#39;`, so the guard is bypassed.&lt;/p&gt;
&lt;p&gt;Inside the traversal loop, `current[&amp;#39;__proto__&amp;#39;] = {}` triggers the `__proto__` setter, replacing the intermediate object&amp;#39;s prototype. The final value is then written onto this new prototype.&lt;/p&gt;
&lt;p&gt;**Important distinction:** This vulnerability does NOT pollute the global `Object.prototype`. It injects properties into a specific object&amp;#39;s prototype chain. However, injected properties are invisible to `hasOwnProperty()` and `Object.keys()`, which makes them difficult to detect and can lead to authorization bypass in common coding patterns.&lt;/p&gt;
&lt;p&gt;### PoC
```javascript
const dottie = require(&amp;#39;dottie&amp;#39;);&lt;/p&gt;
&lt;p&gt;// set() bypass
const obj = {};
dottie.set(obj, &amp;#39;session.__proto__.isAdmin&amp;#39;, true);
console.log(obj.session.isAdmin);                    // true
console.log(({}).isAdmin);                           // undefined
console.log(obj.session.hasOwnProperty(&amp;#39;isAdmin&amp;#39;));  // false&lt;/p&gt;
&lt;p&gt;// transform() bypass
const flat = { &amp;#39;user.__…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-r5mx-6wc6-7h9w</guid>
    </item>
  </channel>
</rss>
