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

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

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. ini-parser




PROTOTYPE POLLUTION AFFECTING INI-PARSER OPEN THIS LINK IN A NEW TAB PACKAGE,
VERSIONS *

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

4.4
medium


 * EXPLOIT MATURITY
   
   
   
   Proof of concept
   
   


 * ATTACK COMPLEXITY
   
   
   
   Low
   
   

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-ID
   
   SNYK-JS-INIPARSER-564122


 * PUBLISHED
   
   1 Apr 2020


 * DISCLOSED
   
   1 Apr 2020


 * CREDIT
   
   JHU System Security Lab

Report a new vulnerability Found a mistake?

INTRODUCED: 1 APR 2020

CVE-2020-7617 Open this link in a new tab

CWE-400 Open this link in a new tab

First added by Snyk
Share



HOW TO FIX?

There is no fixed version for ini-parser.


OVERVIEW

ini-parser is a package to parse .ini files.

Affected versions of this package are vulnerable to Prototype Pollution. The
library could be tricked into adding or modifying properties of Object.prototype
using a __proto__ payload.


POC

var a = require("ini-parser");
a.parse('[__proto__]\ntoString=JHU');
console.log({}.toString);



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 PR
 * Vulnerable Code


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