Comparing rootvector2:master...dojo:master · rootvector2/dojo · GitHub
Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: rootvector2/dojo
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: master
Choose a base ref
...
head repository: dojo/dojo
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: master
Choose a head ref
Checking mergeability… Don’t worry, you can still create the pull request.
  • 5 commits
  • 8 files changed
  • 2 contributors

Commits on Jun 23, 2026

  1. Configuration menu
    Copy the full SHA
    a9df7ad View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    e6c0c8e View commit details
    Browse the repository at this point in the history
  3. reject prototype segment in getProp to block setObject pollution

    The CVE-2021-23450 guard rejects __proto__ and constructor but not prototype, so setObject("Object.prototype.x", v) still pollutes Object.prototype through any named global constructor. Reject prototype alongside the other two.
    rootvector2 authored and wkeese committed Jun 23, 2026
    Configuration menu
    Copy the full SHA
    ef801bc View commit details
    Browse the repository at this point in the history

Commits on Jul 10, 2026

  1. Reject prototype pollution via the final setObject path segment

    The CVE-2021-23450 guard (extended in dojo#458 to reject `prototype`) checks
    the segments that getProp walks, but setObject pops the final segment and
    assigns it directly with `obj[p] = value`, bypassing that guard. So
    setObject("__proto__", value) and setObject("x.__proto__", value) still
    reassign a prototype.
    
    Apply the same __proto__/constructor/prototype denylist to the popped
    final segment before assigning, completing the guard from dojo#458. Adds
    regression tests alongside the existing CVE-2021-23450 cases.
    Nexory authored and wkeese committed Jul 10, 2026
    Configuration menu
    Copy the full SHA
    5dd23c0 View commit details
    Browse the repository at this point in the history

Commits on Aug 17, 2026

  1. Skip __proto__ in Stateful.set, _changeAttrValue, _mixin and safeMixin

    dojo#460 guards the hash form of Stateful.set, where the for...in loop skips
    the key. The two argument form has no such guard: set("__proto__", value)
    falls through to the scalar branch and runs this[name] = value, which
    replaces the prototype of the instance instead of setting an attribute on
    it. Afterwards the instance is no longer an instanceof its class, get and
    set are gone, and a value carrying a function replaces a method rather
    than data. Application code reaches the two argument form whenever it
    copies a parsed object one key at a time.
    
    The same direct write is in _changeAttrValue, in lang._mixin (so
    lang.mixin, lang.clone and lang.extend) and in declare.safeMixin (so
    declare(null, props) and Class.extend(props) as well). Skip the key in
    those four places, the way the hash branch and request/util.deepCopy
    already do.
    
    The sibling loops guarded by has("bug-for-in-skips-shadowed") are left
    alone: they iterate lang._extraNames, a fixed list of seven
    Object.prototype members, so __proto__ cannot appear there. declare mixOwn
    is left alone as well, since it copies from a class prototype and those
    members arrive through safeMixin. store/Memory has the same write in its
    constructor, but a __proto__ key there makes the following setData call
    throw, which is a loud failure and better handled on its own.
    
    Object.prototype is not involved. Each case replaces the prototype of the
    target object only.
    Nexory authored and wkeese committed Aug 17, 2026
    Configuration menu
    Copy the full SHA
    1a4c3d1 View commit details
    Browse the repository at this point in the history
Loading