security.snyk.io Open in urlscan Pro
2a02:26f0:ef:288::ecd  Public Scan

Submitted URL: https://snyk.io/vuln/SNYK-JS-MOUT-2342654
Effective URL: https://security.snyk.io/vuln/SNYK-JS-MOUT-2342654
Submission: On June 29 via api from NL — Scanned from NL

Form analysis 2 forms found in the DOM

<form id="mktoForm_1461" style="display: none; font-family: Helvetica, Arial, sans-serif; font-size: 13px; color: rgb(51, 51, 51); width: 1px;" novalidate="novalidate" class="mktoForm mktoHasWidth mktoLayoutLeft">
  <style type="text/css">
    .mktoForm .mktoButtonWrap.mktoSimple .mktoButton {
      color: #fff;
      border: 1px solid #75ae4c;
      padding: 0.4em 1em;
      font-size: 1em;
      background-color: #99c47c;
      background-image: -webkit-gradient(linear, left top, left bottom, from(#99c47c), to(#75ae4c));
      background-image: -webkit-linear-gradient(top, #99c47c, #75ae4c);
      background-image: -moz-linear-gradient(top, #99c47c, #75ae4c);
      background-image: linear-gradient(to bottom, #99c47c, #75ae4c);
    }

    .mktoForm .mktoButtonWrap.mktoSimple .mktoButton:hover {
      border: 1px solid #447f19;
    }

    .mktoForm .mktoButtonWrap.mktoSimple .mktoButton:focus {
      outline: none;
      border: 1px solid #447f19;
    }

    .mktoForm .mktoButtonWrap.mktoSimple .mktoButton:active {
      background-color: #75ae4c;
      background-image: -webkit-gradient(linear, left top, left bottom, from(#75ae4c), to(#99c47c));
      background-image: -webkit-linear-gradient(top, #75ae4c, #99c47c);
      background-image: -moz-linear-gradient(top, #75ae4c, #99c47c);
      background-image: linear-gradient(to bottom, #75ae4c, #99c47c);
    }
  </style>
  <div class="mktoButtonRow"><span class="mktoButtonWrap mktoSimple" style="margin-left: 120px;"><button type="submit" class="mktoButton">Submit</button></span></div><input type="hidden" name="formid" class="mktoField mktoFieldDescriptor"
    value="1461"><input type="hidden" name="munchkinId" class="mktoField mktoFieldDescriptor" value="677-THP-415">
</form>

<form style="display: none; font-family: Helvetica, Arial, sans-serif; font-size: 13px; color: rgb(51, 51, 51); visibility: hidden; position: absolute; top: -500px; left: -1000px; width: 1600px;" novalidate="novalidate"
  class="mktoForm mktoHasWidth mktoLayoutLeft"></form>

Text Content

About Snyk
 1. Snyk Vulnerability Database
 2. npm
 3. mout




PROTOTYPE POLLUTION AFFECTING MOUT OPEN THIS LINK IN A NEW TAB PACKAGE, VERSIONS
*

--------------------------------------------------------------------------------

7.5
high


 * EXPLOIT MATURITY
   
   
   
   Proof of concept
   
   


 * ATTACK COMPLEXITY
   
   
   
   Low
   
   


 * AVAILABILITY
   
   
   
   High
   
   

See more

Do your applications use this vulnerable package?

In a few clicks we can analyze your entire application and see what components
are vulnerable in your application, and suggest you quick fixes.

Test your applications

Snyk Learn

Learn about Prototype Pollution vulnerabilities in an interactive lesson.

Start learning


 * SNYK-ID
   
   SNYK-JS-MOUT-2342654


 * PUBLISHED
   
   15 Jun 2022


 * DISCLOSED
   
   19 Jan 2022


 * CREDIT
   
   P.Adithya Srinivas, Masudul Hasan Masud Bhuiyan, Cristian-Alexandru Staicu

Report a new vulnerability Found a mistake?

INTRODUCED: 19 JAN 2022

CVE-2022-21213 Open this link in a new tab

CWE-1321 Open this link in a new tab

First added by Snyk
Share



HOW TO FIX?

There is no fixed version for mout.


OVERVIEW

mout is a Modular Utilities

Affected versions of this package are vulnerable to Prototype Pollution. The
deepFillIn function can be used to 'fill missing properties recursively', while
the deepMixIn mixes objects into the target object, recursively mixing existing
child objects as well. In both cases, the key used to access the target object
recursively is not checked, leading to exploiting this vulnerability.

Note: This vulnerability derives from an incomplete fix of CVE-2020-7792.


POC

let mout = require("mout")
let b = {};
let payload = JSON.parse('["constructor.prototype.polluted"]');
mout.object.set(b, payload, "success");
console.log(polluted);



DETAILS

Prototype Pollution is a vulnerability affecting JavaScript. Prototype Pollution
refers to the ability to inject properties into existing JavaScript language
construct prototypes, such as objects. JavaScript allows all Object attributes
to be altered, including their magical attributes such as _proto_, constructor
and prototype. An attacker manipulates these attributes to overwrite, or
pollute, a JavaScript application object prototype of the base object by
injecting other values. Properties on the Object.prototype are then inherited by
all the JavaScript objects through the prototype chain. When that happens, this
leads to either denial of service by triggering JavaScript exceptions, or it
tampers with the application source code to force the code path that the
attacker injects, thereby leading to remote code execution.

There are two main ways in which the pollution of prototypes occurs:

 * Unsafe Object recursive merge

 * Property definition by path


UNSAFE OBJECT RECURSIVE MERGE

The logic of a vulnerable recursive merge function follows the following
high-level model:

merge (target, source)



  foreach property of source


if property exists and is an object on both the target and the source

  merge(target[property], source[property])

else

  target[property] = source[property]








When the source object contains a property named _proto_ defined with
Object.defineProperty() , the condition that checks if the property exists and
is an object on both the target and the source passes and the merge recurses
with the target, being the prototype of Object and the source of Object as
defined by the attacker. Properties are then copied on the Object prototype.

Clone operations are a special sub-class of unsafe recursive merges, which occur
when a recursive merge is conducted on an empty object: merge({},source).

lodash and Hoek are examples of libraries susceptible to recursive merge
attacks.


PROPERTY DEFINITION BY PATH

There are a few JavaScript libraries that use an API to define property values
on an object based on a given path. The function that is generally affected
contains this signature: theFunction(object, path, value)

If the attacker can control the value of “path”, they can set this value to
_proto_.myValue. myValue is then assigned to the prototype of the class of the
object.


TYPES OF ATTACKS

There are a few methods by which Prototype Pollution can be manipulated:

Type Origin Short description Denial of service (DoS) Client This is the most
likely attack.
DoS occurs when Object holds generic functions that are implicitly called for
various operations (for example, toString and valueOf).
The attacker pollutes Object.prototype.someattr and alters its state to an
unexpected value such as Int or Object. In this case, the code fails and is
likely to cause a denial of service.
For example: if an attacker pollutes Object.prototype.toString by defining it as
an integer, if the codebase at any point was reliant on someobject.toString() it
would fail. Remote Code Execution Client Remote code execution is generally only
possible in cases where the codebase evaluates a specific attribute of an
object, and then executes that evaluation.
For example: eval(someobject.someattr). In this case, if the attacker pollutes
Object.prototype.someattr they are likely to be able to leverage this in order
to execute code. Property Injection Client The attacker pollutes properties that
the codebase relies on for their informative value, including security
properties such as cookies or tokens.
For example: if a codebase checks privileges for someuser.isAdmin, then when the
attacker pollutes Object.prototype.isAdmin and sets it to equal true, they can
then achieve admin privileges.


AFFECTED ENVIRONMENTS

The following environments are susceptible to a Prototype Pollution attack:

 * Application server

 * Web server


HOW TO PREVENT

 1. Freeze the prototype— use Object.freeze (Object.prototype).

 2. Require schema validation of JSON input.

 3. Avoid using unsafe recursive merge functions.

 4. Consider using objects without prototypes (for example,
    Object.create(null)), breaking the prototype chain and preventing pollution.

 5. As a best practice use Map instead of Object.


FOR MORE INFORMATION ON THIS VULNERABILITY TYPE:

Arteau, Oliver. “JavaScript prototype pollution attack in NodeJS application.”
GitHub, 26 May 2018


REFERENCES

 * GitHub Additional Information
 * GitHub Additional Information


PRODUCT

 * Snyk Open Source
 * Snyk Code
 * Snyk Container
 * Snyk Infrastructure as Code
 * Test with Github
 * Test with CLI


RESOURCES

 * Vulnerability DB
 * Documentation
 * Disclosed Vulnerabilities
 * Blog
 * FAQs


COMPANY

 * About
 * Jobs
 * Contact
 * Policies
 * Do Not Sell My Personal Information


CONTACT US

 * Support
 * Report a new vuln
 * Press Kit
 * Events


FIND US ONLINE

 * 
 * 
 * 
 * 


TRACK OUR DEVELOPMENT

 * 
 * 



© 2022 Snyk Limited

Registered in England and Wales. Company number: 09677925

Registered address: Highlands House, Basingstoke Road, Spencers Wood, Reading,
Berkshire, RG7 1NT.


Submit