fix(dependencies): update dependency vega to v6 [security] #370
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
^5.20.2->^6.0.0GitHub Vulnerability Alerts
CVE-2025-25304
Summary
The
vlSelectionTuplesfunction can be used to call JavaScript functions, leading to XSS.Details
vlSelectionTuplescalls multiple functions that can be controlled by an attacker, including one call with an attacker-controlled argument.Example call:
vlSelectionTuples([{datum:<argument>}], {fields:[{getter:<function>}]})This can be used to call
Function()with arbitrary JavaScript and the resulting function can be called withvlSelectionTuplesor using a type coercion to calltoStringorvalueOf.PoC
CVE-2025-26619
Impact
In
vega5.30.0 and lower,vega-functions5.15.0 and lower , it was possible to call JavaScript functions from the Vega expression language that were not meant to be supported.Patches
Patched in
vega5.31.0/vega-functions5.16.0Workarounds
Is there a way for users to fix or remediate the vulnerability without upgrading?
vegawithoutvega.expressionInterpreter. This mode is not the default as it is slower.References
Reproduction of the error in Vega by @mattijn
CVE-2025-27793
Impact
Users running Vega/Vega-lite JSON definitions could run unexpected JavaScript code when drawing graphs, unless the library is used with the
vega-interpreter.Workarounds
vegawith expression interpreter5.32.0)POC Summary
Calling
replacewith aRegExp-like pattern callsRegExp.prototype[@​@​replace], which can then call an attacker-controlledexecfunction.POC Details
Consider the function call
replace('foo', {__proto__: /h/.constructor.prototype, global: false}). SincepatternhasRegExp.prototype[@​@​replace],pattern.exec('foo')winds up being called.The resulting malicious call looks like this:
Since functions cannot be returned from this, an attacker that wishes to escalate to XSS must abuse
event.viewto gain access toeval.Reproduction steps
CVE-2025-59840
Impact
Applications meeting 2 conditions are at risk of arbitrary JavaScript code execution, even if "safe mode" expressionInterpreter is used.
vegain an application that attachesvegalibrary and avega.Viewinstance similar to the Vega Editor to the globalwindowJSONdefinitions (vs JSON that was is only provided through source code)Patches
vega6.2.0/vega-expression6.1.0/vega-interpreter2.2.1(if using AST evaluator mode)vega-expression5.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
vegaView instances to global variables, as Vega editor used to do herevegato the global window as the editor used to do hereThese 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.
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:
uto the result of callingthis.eventNamewith undefineddtothis._handlersthis._handlerIndexwith the result ofuindexed into thedobject as the first argument, and undefined as the second two._handlerIndexis 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_DEBUGis 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 toeval, 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.0Compare Source
v6.1.2Compare Source
v6.1.1Compare Source
v6.1.0Compare Source
v6.0.0Compare Source
changes since v5.33.0
monorepo
vega-typings
docs
v5.33.0Compare Source
Changes since v5.32.0
docs
v5.32.0Compare Source
Changes since v5.31.0
vega-expression
vega-expressionandvega-interpreter(via #4009). (Thanks @hydrosquall!)vega-typings
vega-loader(via #4000). (Thanks @hydrosquall!)docs
expressions.md(via #3996). (Thanks @dangotbanned!)crossfilter.md(via #4005). (Thanks @danmarshall!)v5.31.0Compare Source
changes since v5.30.0
vega-utils
Object.hasOwninstead ofObject.prototype.hasOwnProperty(via #3951). (Thanks @domoritz!)vega-parser
vega-functions
vega-selections
monorepo
docs
v5.30.0Compare Source
Changes since v5.29.0
vega-functions
docs
monorepo
vega-*deps in topological order to eliminate version mismatches within the monorepo (via #3932). (Thanks @lsh!)v5.29.0Compare Source
docs
monorepo
vega-encode
vega-scale
vega-scenegraph
vega-typings
vega-view
v5.28.0Compare Source
changes from v5.27.0
docs
vega-parser
nice(via #3887). (Thanks @lsh!)vega-scenegraph
vega-typings
aggregate_paramsto window transform type (#3874). (Thanks @julieg18!)v5.27.0Compare Source
changes from v5.26.1:
docs
monorepo
codeownersfile. (Thanks @domoritz!)vega-scenegraph
devicePixelRatio(via #3844). (Thanks @lsh!)vega-transforms
sum([invalid]) -> undefined(via #3849). (Thanks @nicolaskruchten!)vega-typings
vega-view
devicePixelRatiochange (via #3844). (Thanks @lsh!)v5.26.1Compare Source
Changes from v5.26.1:
vega-scenegraph
vega-typings
v5.26.0Compare Source
Changes from v5.25.0:
vega-functions
vega-scale
vega-scenegraph
vega-selections
vega-transforms
vega-typings
vega-voronoi
v5.25.0Compare Source
Changes from v5.24.0:
monorepo
vega-cli
ppiresolution parameter for PNG output. (thanks @davidanthoff!)vega-expression
hypotfunction. (thanks @domoritz!)vega-functions
hypot.vega-regression
vega-statistics
vega-transforms
vega-util
splitAccessPath#3724 (thanks @suchanlee!)v5.24.0Compare Source
Changes from v5.23.0:
monorepo
vega-force
strength.vega-schema
strength.vega-typings
strength.Configuration
📅 Schedule: Branch creation - "" in timezone UTC, Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.