VYPR
High severityNVD Advisory· Published Mar 28, 2025· Updated Apr 1, 2025

CVE-2024-38988

CVE-2024-38988

Description

alizeait unflatto <= 1.0.2 was discovered to contain a prototype pollution via the method exports.unflatto at /dist/index.js. This vulnerability allows attackers to execute arbitrary code or cause a Denial of Service (DoS) via injecting arbitrary properties.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

Prototype pollution vulnerability in unflatto <=1.0.2 allows arbitrary code execution or DoS via crafted input to the unflatto function.

Vulnerability

Description

The unflatto library (versions <= 1.0.2) contains a prototype pollution vulnerability in the exports.unflatto method located at /dist/index.js [1]. The root cause is that the function unsafely assigns properties from the input object to the destination object without filtering special keys such as __proto__ or constructor.prototype [4]. This allows an attacker to inject arbitrary properties into the global Object.prototype.

Exploitation

An attacker can exploit this by providing a flattened object with a key like "__proto__.polluted" set to a value. When unflatto processes this input, it recursively expands the key and assigns the value to Object.prototype.polluted [4]. No authentication or special network position is required; the attacker only needs to supply crafted input to any application that uses the vulnerable unflatto function. The proof-of-concept in [4] demonstrates that after the attack, any new object inherits the polluted property.

Impact

Successful prototype pollution can lead to severe consequences, including denial of service (DoS), arbitrary code execution, or cross-site scripting (XSS), depending on how the application uses the polluted properties [1][4]. For example, if the application later iterates over object properties or uses them in security-sensitive operations, the attacker may alter application logic or execute malicious code.

Mitigation

The vulnerability has been fixed in commit [2]. Users should update to a patched version of @alizeait/unflatto immediately. As a workaround, applications can sanitize input keys by blocking __proto__ and constructor before passing them to unflatto [4].

AI Insight generated on May 20, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
@alizeait/unflattonpm
< 1.0.31.0.3

Affected products

2

Patches

1
3c1b120f1dcd

Fix prototype pollution

https://github.com/alizeait/unflattoAli ZeaiterApr 1, 2025via ghsa
3 files changed · +262 414
  • package-lock.json+105 414 modified
    @@ -1,12 +1,12 @@
     {
       "name": "@alizeait/unflatto",
    -  "version": "1.0.1",
    +  "version": "1.0.2",
       "lockfileVersion": 2,
       "requires": true,
       "packages": {
         "": {
           "name": "@alizeait/unflatto",
    -      "version": "1.0.1",
    +      "version": "1.0.2",
           "license": "MIT",
           "devDependencies": {
             "@types/jest": "^26.0.20",
    @@ -3289,56 +3289,38 @@
           "dev": true
         },
         "node_modules/browserslist": {
    -      "version": "4.16.6",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
    -      "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
    +      "version": "4.24.4",
    +      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
    +      "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
           "dev": true,
    +      "funding": [
    +        {
    +          "type": "opencollective",
    +          "url": "https://opencollective.com/browserslist"
    +        },
    +        {
    +          "type": "tidelift",
    +          "url": "https://tidelift.com/funding/github/npm/browserslist"
    +        },
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/ai"
    +        }
    +      ],
    +      "license": "MIT",
           "dependencies": {
    -        "caniuse-lite": "^1.0.30001219",
    -        "colorette": "^1.2.2",
    -        "electron-to-chromium": "^1.3.723",
    -        "escalade": "^3.1.1",
    -        "node-releases": "^1.1.71"
    +        "caniuse-lite": "^1.0.30001688",
    +        "electron-to-chromium": "^1.5.73",
    +        "node-releases": "^2.0.19",
    +        "update-browserslist-db": "^1.1.1"
           },
           "bin": {
             "browserslist": "cli.js"
           },
           "engines": {
             "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
    -      },
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/browserslist"
           }
         },
    -    "node_modules/browserslist/node_modules/caniuse-lite": {
    -      "version": "1.0.30001230",
    -      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz",
    -      "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==",
    -      "dev": true,
    -      "funding": {
    -        "type": "opencollective",
    -        "url": "https://opencollective.com/browserslist"
    -      }
    -    },
    -    "node_modules/browserslist/node_modules/colorette": {
    -      "version": "1.2.2",
    -      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
    -      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
    -      "dev": true
    -    },
    -    "node_modules/browserslist/node_modules/electron-to-chromium": {
    -      "version": "1.3.739",
    -      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz",
    -      "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==",
    -      "dev": true
    -    },
    -    "node_modules/browserslist/node_modules/node-releases": {
    -      "version": "1.1.72",
    -      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
    -      "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
    -      "dev": true
    -    },
         "node_modules/bs-logger": {
           "version": "0.2.6",
           "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
    @@ -3445,10 +3427,25 @@
           }
         },
         "node_modules/caniuse-lite": {
    -      "version": "1.0.30001178",
    -      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001178.tgz",
    -      "integrity": "sha512-VtdZLC0vsXykKni8Uztx45xynytOi71Ufx9T8kHptSw9AL4dpqailUJJHavttuzUe1KYuBYtChiWv+BAb7mPmQ==",
    -      "dev": true
    +      "version": "1.0.30001707",
    +      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
    +      "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
    +      "dev": true,
    +      "funding": [
    +        {
    +          "type": "opencollective",
    +          "url": "https://opencollective.com/browserslist"
    +        },
    +        {
    +          "type": "tidelift",
    +          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
    +        },
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/ai"
    +        }
    +      ],
    +      "license": "CC-BY-4.0"
         },
         "node_modules/capture-exit": {
           "version": "2.0.0",
    @@ -4107,10 +4104,11 @@
           "dev": true
         },
         "node_modules/electron-to-chromium": {
    -      "version": "1.4.284",
    -      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
    -      "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
    -      "dev": true
    +      "version": "1.5.129",
    +      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.129.tgz",
    +      "integrity": "sha512-JlXUemX4s0+9f8mLqib/bHH8gOHf5elKS6KeWG3sk3xozb/JTq/RLXIv8OKUWiK4Ah00Wm88EFj5PYkFr4RUPA==",
    +      "dev": true,
    +      "license": "ISC"
         },
         "node_modules/emittery": {
           "version": "0.7.2",
    @@ -4179,10 +4177,11 @@
           }
         },
         "node_modules/escalade": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
    -      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
    +      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
           "dev": true,
    +      "license": "MIT",
           "engines": {
             "node": ">=6"
           }
    @@ -8543,10 +8542,11 @@
           }
         },
         "node_modules/node-releases": {
    -      "version": "2.0.7",
    -      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz",
    -      "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==",
    -      "dev": true
    +      "version": "2.0.19",
    +      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
    +      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
    +      "dev": true,
    +      "license": "MIT"
         },
         "node_modules/normalize-package-data": {
           "version": "2.5.0",
    @@ -8920,6 +8920,13 @@
             "node": ">=8"
           }
         },
    +    "node_modules/picocolors": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
    +      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
    +      "dev": true,
    +      "license": "ISC"
    +    },
         "node_modules/picomatch": {
           "version": "2.2.2",
           "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
    @@ -9666,22 +9673,6 @@
             "url": "https://github.com/chalk/ansi-styles?sponsor=1"
           }
         },
    -    "node_modules/rollup-plugin-postcss/node_modules/caniuse-lite": {
    -      "version": "1.0.30001439",
    -      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz",
    -      "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "opencollective",
    -          "url": "https://opencollective.com/browserslist"
    -        },
    -        {
    -          "type": "tidelift",
    -          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
    -        }
    -      ]
    -    },
         "node_modules/rollup-plugin-postcss/node_modules/chalk": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
    @@ -9921,12 +9912,6 @@
             "url": "https://github.com/fb55/nth-check?sponsor=1"
           }
         },
    -    "node_modules/rollup-plugin-postcss/node_modules/picocolors": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
    -      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
    -      "dev": true
    -    },
         "node_modules/rollup-plugin-postcss/node_modules/postcss-calc": {
           "version": "8.2.4",
           "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
    @@ -9974,34 +9959,6 @@
             "postcss": "^8.2.15"
           }
         },
    -    "node_modules/rollup-plugin-postcss/node_modules/postcss-convert-values/node_modules/browserslist": {
    -      "version": "4.21.4",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "opencollective",
    -          "url": "https://opencollective.com/browserslist"
    -        },
    -        {
    -          "type": "tidelift",
    -          "url": "https://tidelift.com/funding/github/npm/browserslist"
    -        }
    -      ],
    -      "dependencies": {
    -        "caniuse-lite": "^1.0.30001400",
    -        "electron-to-chromium": "^1.4.251",
    -        "node-releases": "^2.0.6",
    -        "update-browserslist-db": "^1.0.9"
    -      },
    -      "bin": {
    -        "browserslist": "cli.js"
    -      },
    -      "engines": {
    -        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
    -      }
    -    },
         "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-comments": {
           "version": "5.1.2",
           "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
    @@ -10084,34 +10041,6 @@
             "postcss": "^8.2.15"
           }
         },
    -    "node_modules/rollup-plugin-postcss/node_modules/postcss-merge-rules/node_modules/browserslist": {
    -      "version": "4.21.4",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "opencollective",
    -          "url": "https://opencollective.com/browserslist"
    -        },
    -        {
    -          "type": "tidelift",
    -          "url": "https://tidelift.com/funding/github/npm/browserslist"
    -        }
    -      ],
    -      "dependencies": {
    -        "caniuse-lite": "^1.0.30001400",
    -        "electron-to-chromium": "^1.4.251",
    -        "node-releases": "^2.0.6",
    -        "update-browserslist-db": "^1.0.9"
    -      },
    -      "bin": {
    -        "browserslist": "cli.js"
    -      },
    -      "engines": {
    -        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
    -      }
    -    },
         "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-font-values": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
    @@ -10161,34 +10090,6 @@
             "postcss": "^8.2.15"
           }
         },
    -    "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-params/node_modules/browserslist": {
    -      "version": "4.21.4",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "opencollective",
    -          "url": "https://opencollective.com/browserslist"
    -        },
    -        {
    -          "type": "tidelift",
    -          "url": "https://tidelift.com/funding/github/npm/browserslist"
    -        }
    -      ],
    -      "dependencies": {
    -        "caniuse-lite": "^1.0.30001400",
    -        "electron-to-chromium": "^1.4.251",
    -        "node-releases": "^2.0.6",
    -        "update-browserslist-db": "^1.0.9"
    -      },
    -      "bin": {
    -        "browserslist": "cli.js"
    -      },
    -      "engines": {
    -        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
    -      }
    -    },
         "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-selectors": {
           "version": "5.2.1",
           "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
    @@ -10307,34 +10208,6 @@
             "postcss": "^8.2.15"
           }
         },
    -    "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-unicode/node_modules/browserslist": {
    -      "version": "4.21.4",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "opencollective",
    -          "url": "https://opencollective.com/browserslist"
    -        },
    -        {
    -          "type": "tidelift",
    -          "url": "https://tidelift.com/funding/github/npm/browserslist"
    -        }
    -      ],
    -      "dependencies": {
    -        "caniuse-lite": "^1.0.30001400",
    -        "electron-to-chromium": "^1.4.251",
    -        "node-releases": "^2.0.6",
    -        "update-browserslist-db": "^1.0.9"
    -      },
    -      "bin": {
    -        "browserslist": "cli.js"
    -      },
    -      "engines": {
    -        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
    -      }
    -    },
         "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-url": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
    @@ -10398,34 +10271,6 @@
             "postcss": "^8.2.15"
           }
         },
    -    "node_modules/rollup-plugin-postcss/node_modules/postcss-reduce-initial/node_modules/browserslist": {
    -      "version": "4.21.4",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "opencollective",
    -          "url": "https://opencollective.com/browserslist"
    -        },
    -        {
    -          "type": "tidelift",
    -          "url": "https://tidelift.com/funding/github/npm/browserslist"
    -        }
    -      ],
    -      "dependencies": {
    -        "caniuse-lite": "^1.0.30001400",
    -        "electron-to-chromium": "^1.4.251",
    -        "node-releases": "^2.0.6",
    -        "update-browserslist-db": "^1.0.9"
    -      },
    -      "bin": {
    -        "browserslist": "cli.js"
    -      },
    -      "engines": {
    -        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
    -      }
    -    },
         "node_modules/rollup-plugin-postcss/node_modules/postcss-reduce-transforms": {
           "version": "5.1.0",
           "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
    @@ -10516,34 +10361,6 @@
             "postcss": "^8.2.15"
           }
         },
    -    "node_modules/rollup-plugin-postcss/node_modules/stylehacks/node_modules/browserslist": {
    -      "version": "4.21.4",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -      "dev": true,
    -      "funding": [
    -        {
    -          "type": "opencollective",
    -          "url": "https://opencollective.com/browserslist"
    -        },
    -        {
    -          "type": "tidelift",
    -          "url": "https://tidelift.com/funding/github/npm/browserslist"
    -        }
    -      ],
    -      "dependencies": {
    -        "caniuse-lite": "^1.0.30001400",
    -        "electron-to-chromium": "^1.4.251",
    -        "node-releases": "^2.0.6",
    -        "update-browserslist-db": "^1.0.9"
    -      },
    -      "bin": {
    -        "browserslist": "cli.js"
    -      },
    -      "engines": {
    -        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
    -      }
    -    },
         "node_modules/rollup-plugin-postcss/node_modules/supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
    @@ -12064,9 +11881,9 @@
           }
         },
         "node_modules/update-browserslist-db": {
    -      "version": "1.0.10",
    -      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
    -      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
    +      "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
           "dev": true,
           "funding": [
             {
    @@ -12076,25 +11893,24 @@
             {
               "type": "tidelift",
               "url": "https://tidelift.com/funding/github/npm/browserslist"
    +        },
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/ai"
             }
           ],
    +      "license": "MIT",
           "dependencies": {
    -        "escalade": "^3.1.1",
    -        "picocolors": "^1.0.0"
    +        "escalade": "^3.2.0",
    +        "picocolors": "^1.1.1"
           },
           "bin": {
    -        "browserslist-lint": "cli.js"
    +        "update-browserslist-db": "cli.js"
           },
           "peerDependencies": {
             "browserslist": ">= 4.21.0"
           }
         },
    -    "node_modules/update-browserslist-db/node_modules/picocolors": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
    -      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
    -      "dev": true
    -    },
         "node_modules/uri-js": {
           "version": "4.4.1",
           "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
    @@ -15031,42 +14847,15 @@
           "dev": true
         },
         "browserslist": {
    -      "version": "4.16.6",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
    -      "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
    +      "version": "4.24.4",
    +      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
    +      "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
           "dev": true,
           "requires": {
    -        "caniuse-lite": "^1.0.30001219",
    -        "colorette": "^1.2.2",
    -        "electron-to-chromium": "^1.3.723",
    -        "escalade": "^3.1.1",
    -        "node-releases": "^1.1.71"
    -      },
    -      "dependencies": {
    -        "caniuse-lite": {
    -          "version": "1.0.30001230",
    -          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz",
    -          "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==",
    -          "dev": true
    -        },
    -        "colorette": {
    -          "version": "1.2.2",
    -          "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
    -          "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
    -          "dev": true
    -        },
    -        "electron-to-chromium": {
    -          "version": "1.3.739",
    -          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz",
    -          "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==",
    -          "dev": true
    -        },
    -        "node-releases": {
    -          "version": "1.1.72",
    -          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
    -          "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
    -          "dev": true
    -        }
    +        "caniuse-lite": "^1.0.30001688",
    +        "electron-to-chromium": "^1.5.73",
    +        "node-releases": "^2.0.19",
    +        "update-browserslist-db": "^1.1.1"
           }
         },
         "bs-logger": {
    @@ -15151,9 +14940,9 @@
           }
         },
         "caniuse-lite": {
    -      "version": "1.0.30001178",
    -      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001178.tgz",
    -      "integrity": "sha512-VtdZLC0vsXykKni8Uztx45xynytOi71Ufx9T8kHptSw9AL4dpqailUJJHavttuzUe1KYuBYtChiWv+BAb7mPmQ==",
    +      "version": "1.0.30001707",
    +      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
    +      "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
           "dev": true
         },
         "capture-exit": {
    @@ -15682,9 +15471,9 @@
           "dev": true
         },
         "electron-to-chromium": {
    -      "version": "1.4.284",
    -      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
    -      "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
    +      "version": "1.5.129",
    +      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.129.tgz",
    +      "integrity": "sha512-JlXUemX4s0+9f8mLqib/bHH8gOHf5elKS6KeWG3sk3xozb/JTq/RLXIv8OKUWiK4Ah00Wm88EFj5PYkFr4RUPA==",
           "dev": true
         },
         "emittery": {
    @@ -15739,9 +15528,9 @@
           }
         },
         "escalade": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
    -      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
    +      "version": "3.2.0",
    +      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
    +      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
           "dev": true
         },
         "escape-string-regexp": {
    @@ -19096,9 +18885,9 @@
           }
         },
         "node-releases": {
    -      "version": "2.0.7",
    -      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz",
    -      "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==",
    +      "version": "2.0.19",
    +      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
    +      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
           "dev": true
         },
         "normalize-package-data": {
    @@ -19373,6 +19162,12 @@
           "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
           "dev": true
         },
    +    "picocolors": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
    +      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
    +      "dev": true
    +    },
         "picomatch": {
           "version": "2.2.2",
           "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
    @@ -19929,12 +19724,6 @@
                 "color-convert": "^2.0.1"
               }
             },
    -        "caniuse-lite": {
    -          "version": "1.0.30001439",
    -          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz",
    -          "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==",
    -          "dev": true
    -        },
             "chalk": {
               "version": "4.1.2",
               "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
    @@ -20105,12 +19894,6 @@
                 "boolbase": "^1.0.0"
               }
             },
    -        "picocolors": {
    -          "version": "1.0.0",
    -          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
    -          "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
    -          "dev": true
    -        },
             "postcss-calc": {
               "version": "8.2.4",
               "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
    @@ -20141,20 +19924,6 @@
               "requires": {
                 "browserslist": "^4.21.4",
                 "postcss-value-parser": "^4.2.0"
    -          },
    -          "dependencies": {
    -            "browserslist": {
    -              "version": "4.21.4",
    -              "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -              "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -              "dev": true,
    -              "requires": {
    -                "caniuse-lite": "^1.0.30001400",
    -                "electron-to-chromium": "^1.4.251",
    -                "node-releases": "^2.0.6",
    -                "update-browserslist-db": "^1.0.9"
    -              }
    -            }
               }
             },
             "postcss-discard-comments": {
    @@ -20205,20 +19974,6 @@
                 "caniuse-api": "^3.0.0",
                 "cssnano-utils": "^3.1.0",
                 "postcss-selector-parser": "^6.0.5"
    -          },
    -          "dependencies": {
    -            "browserslist": {
    -              "version": "4.21.4",
    -              "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -              "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -              "dev": true,
    -              "requires": {
    -                "caniuse-lite": "^1.0.30001400",
    -                "electron-to-chromium": "^1.4.251",
    -                "node-releases": "^2.0.6",
    -                "update-browserslist-db": "^1.0.9"
    -              }
    -            }
               }
             },
             "postcss-minify-font-values": {
    @@ -20250,20 +20005,6 @@
                 "browserslist": "^4.21.4",
                 "cssnano-utils": "^3.1.0",
                 "postcss-value-parser": "^4.2.0"
    -          },
    -          "dependencies": {
    -            "browserslist": {
    -              "version": "4.21.4",
    -              "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -              "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -              "dev": true,
    -              "requires": {
    -                "caniuse-lite": "^1.0.30001400",
    -                "electron-to-chromium": "^1.4.251",
    -                "node-releases": "^2.0.6",
    -                "update-browserslist-db": "^1.0.9"
    -              }
    -            }
               }
             },
             "postcss-minify-selectors": {
    @@ -20335,20 +20076,6 @@
               "requires": {
                 "browserslist": "^4.21.4",
                 "postcss-value-parser": "^4.2.0"
    -          },
    -          "dependencies": {
    -            "browserslist": {
    -              "version": "4.21.4",
    -              "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -              "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -              "dev": true,
    -              "requires": {
    -                "caniuse-lite": "^1.0.30001400",
    -                "electron-to-chromium": "^1.4.251",
    -                "node-releases": "^2.0.6",
    -                "update-browserslist-db": "^1.0.9"
    -              }
    -            }
               }
             },
             "postcss-normalize-url": {
    @@ -20388,20 +20115,6 @@
               "requires": {
                 "browserslist": "^4.21.4",
                 "caniuse-api": "^3.0.0"
    -          },
    -          "dependencies": {
    -            "browserslist": {
    -              "version": "4.21.4",
    -              "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -              "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -              "dev": true,
    -              "requires": {
    -                "caniuse-lite": "^1.0.30001400",
    -                "electron-to-chromium": "^1.4.251",
    -                "node-releases": "^2.0.6",
    -                "update-browserslist-db": "^1.0.9"
    -              }
    -            }
               }
             },
             "postcss-reduce-transforms": {
    @@ -20462,20 +20175,6 @@
               "requires": {
                 "browserslist": "^4.21.4",
                 "postcss-selector-parser": "^6.0.4"
    -          },
    -          "dependencies": {
    -            "browserslist": {
    -              "version": "4.21.4",
    -              "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
    -              "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
    -              "dev": true,
    -              "requires": {
    -                "caniuse-lite": "^1.0.30001400",
    -                "electron-to-chromium": "^1.4.251",
    -                "node-releases": "^2.0.6",
    -                "update-browserslist-db": "^1.0.9"
    -              }
    -            }
               }
             },
             "supports-color": {
    @@ -21701,21 +21400,13 @@
           }
         },
         "update-browserslist-db": {
    -      "version": "1.0.10",
    -      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
    -      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
    +      "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
           "dev": true,
           "requires": {
    -        "escalade": "^3.1.1",
    -        "picocolors": "^1.0.0"
    -      },
    -      "dependencies": {
    -        "picocolors": {
    -          "version": "1.0.0",
    -          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
    -          "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
    -          "dev": true
    -        }
    +        "escalade": "^3.2.0",
    +        "picocolors": "^1.1.1"
           }
         },
         "uri-js": {
    
  • src/index.ts+7 0 modified
    @@ -23,6 +23,13 @@ export function unflatto<Input extends Record<string, any>, Output = unknown>(
         ancestor = ancestor || parent;
    
         for (; i < keys.length; i++) {
    
           currentKey = nextKey || keys[i];
    
    +      if (
    
    +        currentKey === "prototype" ||
    
    +        currentKey === "__proto__" ||
    
    +        currentKey === "constructor"
    
    +      ) {
    
    +        break;
    
    +      }
    
           nextKey = keys[i + 1];
    
           if (currentKey in parent) {
    
             parent = parent[currentKey];
    
    
  • test/index.test.ts+150 0 modified
    @@ -1,3 +1,4 @@
    +/* eslint-disable @typescript-eslint/ban-ts-comment */
    
     const mock = require("../mock");
    
     const { unflatto } = require("../src");
    
     
    
    @@ -44,3 +45,152 @@ describe("unflatto", () => {
         expect(unflatto(data)).toMatchSnapshot();
    
       });
    
     });
    
    +
    
    +describe("unflatto prototype pollution tests", () => {
    
    +  beforeEach(() => {
    
    +    // Reset Object prototype properties that might have been polluted
    
    +    //@ts-ignore
    
    +    delete Object.prototype.polluted;
    
    +    //@ts-ignore
    
    +    delete Object.prototype.injected;
    
    +    //@ts-ignore
    
    +    delete Array.prototype.polluted;
    
    +  });
    
    +
    
    +  test("should protect against direct __proto__ pollution", () => {
    
    +    // Attempt direct pollution through __proto__
    
    +    const input = {
    
    +      "__proto__.polluted": "dangerous",
    
    +    };
    
    +
    
    +    unflatto(input);
    
    +
    
    +    // Verify Object prototype wasn't polluted
    
    +    //@ts-ignore
    
    +    expect(Object.prototype.polluted).toBeUndefined();
    
    +    //@ts-ignore
    
    +    expect({}.polluted).toBeUndefined();
    
    +  });
    
    +
    
    +  test("should protect against direct prototype pollution", () => {
    
    +    // Attempt direct pollution through prototype
    
    +    const input = {
    
    +      "prototype.injected": "exploit",
    
    +    };
    
    +
    
    +    unflatto(input);
    
    +
    
    +    // Verify Object prototype wasn't polluted
    
    +    //@ts-ignore
    
    +    expect(Object.prototype.injected).toBeUndefined();
    
    +    //@ts-ignore
    
    +    expect({}.injected).toBeUndefined();
    
    +  });
    
    +
    
    +  test("should protect against direct constructor pollution", () => {
    
    +    // Attempt pollution through constructor
    
    +    const input = {
    
    +      "constructor.prototype.dangerous": "exploit",
    
    +    };
    
    +
    
    +    unflatto(input);
    
    +
    
    +    // Verify Object prototype wasn't polluted
    
    +    //@ts-ignore
    
    +    expect(Object.prototype.dangerous).toBeUndefined();
    
    +    //@ts-ignore
    
    +    expect({}.dangerous).toBeUndefined();
    
    +  });
    
    +
    
    +  test("should protect against nested __proto__ pollution", () => {
    
    +    // Attempt nested pollution
    
    +    const input = {
    
    +      "nested.__proto__.polluted": "danger",
    
    +    };
    
    +
    
    +    const result = unflatto(input);
    
    +
    
    +    // Verify result structure is correct but prototype wasn't polluted
    
    +    expect(result).toEqual({ nested: {} });
    
    +    //@ts-ignore
    
    +    expect(Object.prototype.polluted).toBeUndefined();
    
    +    //@ts-ignore
    
    +    expect({}.polluted).toBeUndefined();
    
    +  });
    
    +
    
    +  test("should protect against array-based __proto__ pollution", () => {
    
    +    // Attempt pollution through numeric keys (which creates arrays)
    
    +    const input = {
    
    +      "0.__proto__.polluted": "danger",
    
    +    };
    
    +
    
    +    unflatto(input);
    
    +
    
    +    //@ts-ignore
    
    +    expect(Array.prototype.polluted).toBeUndefined();
    
    +    //@ts-ignore
    
    +    expect([].polluted).toBeUndefined();
    
    +  });
    
    +
    
    +  test("should protect against complex nested pollution attempts", () => {
    
    +    // Complex nested pollution attempt
    
    +    const input = {
    
    +      "a.b.c.__proto__.polluted": "danger",
    
    +      "x.y.constructor.prototype.injected": "exploit",
    
    +      "deep.nested.prototype.bad": "value",
    
    +    };
    
    +
    
    +    const result = unflatto(input);
    
    +
    
    +    expect(result).toEqual({
    
    +      a: { b: { c: {} } },
    
    +      x: { y: {} },
    
    +      deep: { nested: {} },
    
    +    });
    
    +
    
    +    //@ts-ignore
    
    +    expect(Object.prototype.polluted).toBeUndefined();
    
    +    //@ts-ignore
    
    +    expect(Object.prototype.injected).toBeUndefined();
    
    +    //@ts-ignore
    
    +    expect(Object.prototype.bad).toBeUndefined();
    
    +  });
    
    +
    
    +  test("should handle mixed safe and unsafe paths correctly", () => {
    
    +    // Mix of safe and unsafe paths
    
    +    const input = {
    
    +      "safe.path": "good",
    
    +      "unsafe.__proto__.bad": "evil",
    
    +      "another.safe.path": 123,
    
    +      "mixed.constructor.valid": "should-not-work",
    
    +    };
    
    +
    
    +    const result = unflatto(input);
    
    +
    
    +    // Verify safe paths were processed but unsafe were blocked
    
    +    expect(result).toEqual({
    
    +      safe: { path: "good" },
    
    +      unsafe: {},
    
    +      another: { safe: { path: 123 } },
    
    +      mixed: {},
    
    +    });
    
    +
    
    +    //@ts-ignore
    
    +    expect(Object.prototype.bad).toBeUndefined();
    
    +    //@ts-ignore
    
    +    expect({}.bad).toBeUndefined();
    
    +  });
    
    +
    
    +  test("should handle custom separators correctly", () => {
    
    +    // Attempt pollution with custom separator
    
    +    const input = {
    
    +      "a|b|__proto__|polluted": "danger",
    
    +    };
    
    +
    
    +    const result = unflatto(input, "|");
    
    +
    
    +    expect(result).toEqual({ a: { b: {} } });
    
    +    //@ts-ignore
    
    +    expect(Object.prototype.polluted).toBeUndefined();
    
    +  });
    
    +});
    
    

Vulnerability mechanics

Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

6

News mentions

0

No linked articles in our index yet.