Vulnerabilities

7 via 7 paths

Dependencies

87

Source

GitHub

Find, fix and prevent vulnerabilities in your code.

Issue type
  • 7
  • 1
Severity
  • 6
  • 2
Status
  • 8
  • 0
  • 0

high severity

Prototype Pollution

  • Vulnerable module: toml
  • Introduced through: @project-serum/anchor@0.24.2

Detailed paths

  • Introduced through: @lab11/anchorgen@labeleven-dev/anchorgen › @project-serum/anchor@0.24.2 › toml@3.0.0

Overview

Affected versions of this package are vulnerable to Prototype Pollution in the deepRef function of lib/compiler.js, which traverses through a scalar value into the prototype chain, and whose containment guard is missed because currentPath inconsistently holds arrays that coerce to comma-separated strings ("a,b") while the guard checks dot-separated paths ("a.b"). An attacker can inject arbitrary properties onto Object.prototype, affecting every object in the process, by supplying a TOML document whose table path steps through a scalar into __proto__.__proto__, for example [a.b.y.__proto__.__proto__] after y = 1. This requires the application to parse attacker-controlled TOML.

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

  • Web browser

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, Olivier. “JavaScript prototype pollution attack in NodeJS application.” GitHub, 26 May 2018

Remediation

Upgrade toml to version 4.1.2 or higher.

References

high severity
new

Prototype Pollution

  • Vulnerable module: toml
  • Introduced through: @project-serum/anchor@0.24.2

Detailed paths

  • Introduced through: @lab11/anchorgen@labeleven-dev/anchorgen › @project-serum/anchor@0.24.2 › toml@3.0.0

Overview

Affected versions of this package are vulnerable to Prototype Pollution via ambiguous path-key encoding in lib/compiler.js, where the compiler tracked table origins using string-rendered path sets rather than per-object tags. Because quoteDottedString() quotes a segment only when it contains a . and never escapes a " inside the segment, distinct key paths can render to the same string. This collision allows an array-of-tables header to clear the guard on an unrelated key, after which a dotted key can descend through a Date object into Object.prototype, polluting it with attacker-controlled values. An attacker who can supply a TOML document for parsing can trigger this condition.

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

  • Web browser

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, Olivier. “JavaScript prototype pollution attack in NodeJS application.” GitHub, 26 May 2018

Remediation

Upgrade toml to version 5.0.1 or higher.

References

high severity
new

Allocation of Resources Without Limits or Throttling

  • Vulnerable module: toml
  • Introduced through: @project-serum/anchor@0.24.2

Detailed paths

  • Introduced through: @lab11/anchorgen@labeleven-dev/anchorgen › @project-serum/anchor@0.24.2 › toml@3.0.0

Overview

Affected versions of this package are vulnerable to Allocation of Resources Without Limits or Throttling via the integer parsing logic in lib/parser.js and src/toml.pegjs, where BigInt conversion of oversized integer literals exhibits super-linear CPU growth relative to digit count. An attacker can supply a TOML document containing a multi-megabyte integer literal, causing the parser to consume excessive CPU before the range check rejects the value, resulting in a crash.

Remediation

Upgrade toml to version 5.0.1 or higher.

References

high severity
new

Inefficient Algorithmic Complexity

  • Vulnerable module: toml
  • Introduced through: @project-serum/anchor@0.24.2

Detailed paths

  • Introduced through: @lab11/anchorgen@labeleven-dev/anchorgen › @project-serum/anchor@0.24.2 › toml@3.0.0

Overview

Affected versions of this package are vulnerable to Inefficient Algorithmic Complexity via the compiler in lib/compiler.js, where processing an array-of-tables header causes a full rescan of every path defined so far. An attacker can supply a TOML document with a large number of array-of-tables headers to trigger quadratic time complexity, crashing the process.

Remediation

Upgrade toml to version 5.0.1 or higher.

References

high severity
new

Inefficient Algorithmic Complexity

  • Vulnerable module: toml
  • Introduced through: @project-serum/anchor@0.24.2

Detailed paths

  • Introduced through: @lab11/anchorgen@labeleven-dev/anchorgen › @project-serum/anchor@0.24.2 › toml@3.0.0

Overview

Affected versions of this package are vulnerable to Inefficient Algorithmic Complexity via the TOML compiler in lib/compiler.js, where path strings were maintained using three string-keyed Sets. Every key segment re-joined its entire prefix on each assignment, and every array-of-tables header rescanned every path defined so far, producing quadratic time complexity. An attacker can supply a TOML document with a large number of keys or array-of-tables headers to cause the parser to consume excessive CPU and crash the process.

Remediation

Upgrade toml to version 5.0.1 or higher.

References

high severity

Uncontrolled Recursion

  • Vulnerable module: toml
  • Introduced through: @project-serum/anchor@0.24.2

Detailed paths

  • Introduced through: @lab11/anchorgen@labeleven-dev/anchorgen › @project-serum/anchor@0.24.2 › toml@3.0.0

Overview

Affected versions of this package are vulnerable to Uncontrolled Recursion in lib/parser.js, where the mutually recursive peg$parsevalue(), peg$parsearray(), and peg$parseinline_table_entry() functions recurse to the input's nesting depth with no depth limit. An attacker can crash the process with a RangeError: Maximum call stack size exceeded by supplying a deeply nested TOML document, such as a ~6 KB payload nested about 2,500 levels (a=[[[...]]]). This requires the application to call toml.parse() on untrusted input, and error handlers that catch only SyntaxError do not contain the resulting RangeError, which is not a SyntaxError subclass.

Remediation

Upgrade toml to version 4.2.0 or higher.

References

medium severity

Improper Validation of Specified Index, Position, or Offset in Input

  • Vulnerable module: uuid
  • Introduced through: @project-serum/anchor@0.24.2

Detailed paths

  • Introduced through: @lab11/anchorgen@labeleven-dev/anchorgen › @project-serum/anchor@0.24.2 › @solana/web3.js@1.99.0 › jayson@4.3.0 › uuid@8.3.2

Overview

uuid is a RFC4122 (v1, v4, and v5) compliant UUID library.

Affected versions of this package are vulnerable to Improper Validation of Specified Index, Position, or Offset in Input due to accepting external output buffers but not rejecting out-of-range writes (small buf or large offset). This inconsistency allows silent partial writes into caller-provided buffers.

PoC

cd /home/StrawHat/uuid
npm ci
npm run build

node --input-type=module -e "
import {v4,v5,v6} from './dist-node/index.js';
const ns='6ba7b810-9dad-11d1-80b4-00c04fd430c8';
for (const [name,fn] of [
  ['v4',()=>v4({},new Uint8Array(8),4)],
  ['v5',()=>v5('x',ns,new Uint8Array(8),4)],
  ['v6',()=>v6({},new Uint8Array(8),4)],
]) {
  try { fn(); console.log(name,'NO_THROW'); }
  catch(e){ console.log(name,'THREW',e.name); }
}"

Remediation

Upgrade uuid to version 11.1.1, 14.0.0 or higher.

References

medium severity

LGPL-3.0 license

  • Module: rpc-websockets
  • Introduced through: @project-serum/anchor@0.24.2

Detailed paths

  • Introduced through: @lab11/anchorgen@labeleven-dev/anchorgen › @project-serum/anchor@0.24.2 › @solana/web3.js@1.99.0 › rpc-websockets@9.3.10

LGPL-3.0 license