chore(deps): update dependency marimo to v0.23.0 [security]#533
Merged
olivermeyer merged 1 commit intomainfrom Apr 9, 2026
Merged
chore(deps): update dependency marimo to v0.23.0 [security]#533olivermeyer merged 1 commit intomainfrom
olivermeyer merged 1 commit intomainfrom
Conversation
a1142ab to
0ba06ff
Compare
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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:
0.18.4→0.23.0Warning
Some dependencies could not be looked up. Check the Dependency Dashboard for more information.
GitHub Vulnerability Alerts
GHSA-2679-6mx9-h9xc
Summary
Marimo (19.6k stars) has a Pre-Auth RCE vulnerability. The terminal WebSocket endpoint
/terminal/wslacks authentication validation, allowing an unauthenticated attacker to obtain a full PTY shell and execute arbitrary system commands.Unlike other WebSocket endpoints (e.g.,
/ws) that correctly callvalidate_auth()for authentication, the/terminal/wsendpoint only checks the running mode and platform support before accepting connections, completely skipping authentication verification.Affected Versions
Marimo <= 0.20.4 (current latest)
Vulnerability Details
Root Cause: Terminal WebSocket Missing Authentication
marimo/_server/api/endpoints/terminal.pylines 340-356:Compare with the correctly implemented
/wsendpoint (ws_endpoint.pylines 67-82):Authentication Middleware Limitation
Marimo uses Starlette's
AuthenticationMiddleware, which marks failed auth connections asUnauthenticatedUserbut does NOT actively reject WebSocket connections. Actual auth enforcement relies on endpoint-level@requires()decorators orvalidate_auth()calls.The
/terminal/wsendpoint has neither a@requires("edit")decorator nor avalidate_auth()call, so unauthenticated WebSocket connections are accepted even when the auth middleware is active.Attack Chain
ws://TARGET:2718/terminal/ws(no auth needed)websocket.accept()accepts the connection directlypty.fork()creates a PTY child processA single WebSocket connection yields a complete interactive shell.
Proof of Concept
Reproduction Environment
Reproduction Result
With auth enabled (server generates random
access_token), the exploit bypasses authentication entirely:Suggested Remediation
/terminal/wsendpoint, consistent with/wsusingWebSocketConnectionValidator.validate_auth()Impact
An unauthenticated attacker can obtain a full interactive root shell on the server via a single WebSocket connection. No user interaction or authentication token is required, even when authentication is enabled on the marimo instance.
Release Notes
marimo-team/marimo (marimo)
v0.23.0Compare Source
v0.22.5Compare Source
What's Changed
This release launches marimo pair — an agent skill that drops AI agents directly inside a running marimo notebook session — along with a cleaner, more responsive data table experience and a slate of reliability fixes.
⭐ Highlights
marimo pair: collaborate with agents inside your notebook
marimo pair is a new agent skill that gives AI agents full control over a running marimo notebook session — accessing live variables, executing cells, installing packages, and building reproducible programs alongside you. This release adds the
marimo pair promptCLI command, a "Pair with an agent" modal in the notebook menu, and a secure--with-tokenauth flow that keeps credentials out of shell history.Smarter table headers and responsive column layout
Column headers are now split into a dedicated sort button (cycles asc → desc → clear on click, hidden until hover) and a separate ⋯ menu button for column options. Tables with ≤ 4 columns automatically use natural width with a filler column; larger tables fill the container. Vertical column separators complete the refresh.
✨ Enhancements
NotebookCellwith runtime status and error (#9056)marimo pair promptCLI command and "Pair with an agent" modal (#9000)MimeBundleDescriptor) (#8972)🐛 Bug fixes
_code_modethrough scratchpad (#9030)📚 Documentation
📝 Other changes
Contributors
Thanks to all our community and contributors who made this release possible: @alwaysahustler, @app/marimo-github-maintenance-bot, @app/renovate, @axsseldz, @daizutabi, @dmadisetti, @kirangadhave, @Light2Dark, @ManasVardhan, @manzt, @mscolnick, @tschm
And especially to our new contributors:
Full Changelog: marimo-team/marimo@0.22.0...0.22.5
v0.22.4Compare Source
v0.22.3Compare Source
v0.22.0Compare Source
What's Changed
This release brings a unified data table explorer, reliability improvements to the programmatic notebook API that power the new marimo-pair agent skill, smarter numeric formatting in tables, faster
mo.persistent_cache, and a contextual tips system in the CLI.⭐ Highlights
Combined row viewer and column explorer
The row viewer and column explorer panels are now unified into a single tabbed "Table Explorer" pane. A single toolbar button opens and closes the panel; Rows and Columns tabs live inside it, and your selected tab persists across open/close.
Pair programming with marimo-pair
The experimental
_codeAPI receives reliability fixes in this release, enabling the new marimo-pair agent skill for pair programming in marimo notebooks.🚨 Breaking changes
mo.imageno longer normalizes uint8 values (#8889)Previously,
mo.image()normalized all numeric arrays (includinguint8) to the[0, 1]float range. Now,uint8arrays are always rendered with values in[0, 255]without normalization. Two new parameters —vminandvmax— let you set explicit value bounds for under- or over-saturated displays. If you relied on the old uint8 normalization, passvmin=0, vmax=1explicitly.__marimo__location now followssys.pycache_prefix(#8797)The
__marimo__directory now respectssys.pycache_prefix, consistent with Python's own__pycache__placement. This also fixes cache placement for notebooks in nested directories. Existing caches will not be migrated — they can be safely deleted.Cache version bump (#8793)
The cache format version has been bumped, invalidating existing caches.
✨ Enhancements
hide_codenot taking effect on kernel-created cells (#8926)--watchfile reload (#8846)session.notify()(#8886)codeas positional arg inedit_cell(#8806)__doc__to cell execution namespace (#8636)🐛 Bug fixes
_code_modecell ID collisions on large notebooks (#8951)mo.ui.matplotlibselection masks (#8940)mo.ui.matplotlib(#8883)mo.mpl.interactiveinmarimo runmode (#8760)📚 Documentation
🔬 Preview features
📝 Other changes
NotebookDocumentmodel (#8842)Contributors
Thanks to all our community and contributors who made this release possible: @abhiyadav2345, @akshayka, @app/dependabot, @app/marimo-github-maintenance-bot, @app/renovate, @Bortlesboat, @daizutabi, @dmadisetti, @kirangadhave, @koaning, @Light2Dark, @manzt, @mauro-cerzosimo, @mscolnick, @peter-gy, @Sushit-prog, @tomneep
And especially to our new contributors:
Full Changelog: marimo-team/marimo@0.21.1...0.22.0
v0.21.1Compare Source
v0.21.0Compare Source
Builtin interactive matplotlib
mo.mpl.interactive()has been rewritten to use marimo's built-in communication channel instead of a separate server and WebSocket proxy. This means interactive matplotlib plots now work with no background threads or separate server process needed.Download notebooks as ipynb
You can now export your marimo notebook as a Jupyter
.ipynbfile directly from the editor's download menu. Cells are exported in visual order with their captured outputs included.🚨 Breaking changes
width: "container"on all Altair charts, which distorted aspect ratios, made charts look different from the Altair docs. Charts now render at Altair's native default size. If you want a chart to fill the container width, setwidth="container"explicitly in your chart spec.✨ Enhancements
🐛 Bug fixes
marimo export ipynbto support command-line arguments (#8709)getcontext("spawn")(#8705)TypeIs/TypeGuardnarrowing through@app.function,@mo.cache, and@mo.lru_cache(#8598)NameErrorinmarimo runwhen passingmo.md()between cells (#8692)<title>tooltip from marimo icons (#8595)📚 Documentation
🔬 Preview features
📝 Other changes
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @axsseldz, @chentoast, @daizutabi, @dmadisetti, @ffmiruz, @koaning, @Light2Dark, @manzt, @MarcoGorelli, @mchav, @mscolnick, @peter-gy, @PranavGopinath, @thliang01, @tigretigre, @tsubasakong, @VishakBaddur
And especially to our new contributors:
Full Changelog: marimo-team/marimo@0.20.4...0.21.0
v0.20.4Compare Source
v0.20.3Compare Source
What's Changed
This release brings improved PDF export with slide deck support and interactive widget rasterization, along with spreadsheet-style selection statistics for data tables.
⭐️ Highlights
Export slides as PDF
Notebooks using the slides layout can now be exported as PDF:
marimo export pdf --as=slidesThe UI automatically recommends the right preset based on your notebook's layout.
Additionally, the new
--rasterize-outputsflag captures interactive widgets (Plotly, anywidgets, etc.) as images in PDF exports — so your interactive components are preserved in the final document. Read the docs for more details.Summary statistics for selected cells in data tables
Select two or more cells in a data table to see count, sum, and average of the selected numeric values — just like a spreadsheet. Works with
mo.ui.tableandmo.ui.dataframe.Smart previews for SQL and markdown cells in the minimap
The dependency minimap now shows the actual content of SQL and markdown cells instead of unhelpful boilerplate like
mo.sql(f""".✨ Enhancements
marimo export sessionCLI tool (#8533)ChartBuilder(#8503)uv_buildsemver range to "<0.11.0" (#8502)marimo run <folder> --watch(#8460)html_headparameter tocreate_asgi_app()(#8302)get_cell_dependency_graphMCP tool (#8174)🐛 Bug fixes
mo.cachereturning stale values (#8411)auto_downloadis set (#8462)FigureWidgetthrough the anywidget formatter and syncing widget state via_repr_mimebundle_(). (#8430)with_dynamic_directorymounted at sub-path (#8322) (#8434)📚 Documentation
🔬 Preview features
code-modeMCP server (#8477)Contributors
Thanks to all our community and contributors who made this release possible: @24f2006299, @akshayka, @Antyos, @app/renovate, @axsseldz, @bxff, @daizutabi, @dmadisetti, @ffmiruz, @giulio-leone, @kyrre, @Light2Dark, @manzt, @mscolnick, @peter-gy, @tigretigre
And especially to our new contributors:
Full Changelog: marimo-team/marimo@0.20.2...0.20.3
v0.20.2Compare Source
This release improves the experience of imperatively writing output with
mo.Threads, and also includes an important bug fix formo.ui.matplotlibselection.⭐️ Highlights
Write to a single cell's output with multiple threads
It is now possible for multiple
mo.Threadobjects to write to a single cell's output area usingmo.output.append().Communicate progress to the user with a thread-safe progress bar
mo.status.progress_baris now thread-safe, making it possible for multiplemo.Threadobjects (started in the same cell) to update a single progress bar. This lets you communicate progress to the user when multiple threads are sharding work. (Example notebook.)