Security
- Prevent remote code execution through Bytefield diagrams.
bytefield-svgevaluates its input with sci (a Clojure interpreter) on Node.js, and the sci sandbox exposesaget, which lets a crafted diagram traverse the JavaScript prototype chain up to theFunctionconstructor and run arbitrary JavaScript (and, in the single-executablebytefieldbinary, OS commands viaprocess.binding). Thebytefieldprocess is now started withNODE_OPTIONS=--disallow-code-generation-from-strings, so its V8 context rejectsnew Function(...)/eval(...)and the escape no longer works, while legitimate diagrams are unaffected - Update Node.js to 24.22 in the companion images and the Node.js-based converters of the
yuzutech/krokiimage (previously 24.19), which includes the fix for the Brotli decoder vulnerability CVE-2026-111497. The vulnerable decoder was not reachable in Kroki, as no Brotli data is decompressed withnode:zlib(#2243) - Prevent diagrams.net image-shape nodes (
shape=image;image=URL) and background images, as well as Excalidraw image elements, from making the companion's headless Chromium fetch an attacker-controlled URL (server-side request forgery), by applying the request-interception policy already used by the Mermaid companion to the diagrams.net, Excalidraw and BPMN companions: requests are restricted tofile:/data:/same-origin plus an optional operator-configured allowlist (KROKI_DIAGRAMSNET_ALLOWED_ORIGINS,KROKI_EXCALIDRAW_ALLOWED_ORIGINS,KROKI_BPMN_ALLOWED_ORIGINS/KROKI_ALLOWED_ORIGINS) unless the gateway runs inUNSAFEmode (KROKI_DIAGRAMSNET_SAFE_MODE,KROKI_EXCALIDRAW_SAFE_MODE,KROKI_BPMN_SAFE_MODE/KROKI_SAFE_MODE). The diagrams.net companion now also takes the safe mode from the gateway, instead of its ownKROKI_SAFE_MODEenvironment variable, to decide whether to inline the images referenced by the diagram (#2225) - Reject every resource request made by Vega and Vega-Lite diagrams unless Kroki is running in
UNSAFEmode, using a custom Vega loader. The existing check only looked for URLs at known locations of the specification, so a URL computed by a transform was not rejected. It was not exploitable in the published images, as thevegabinary has no network or file system access (#2246)
Changed
- Update the
yuzutech/krokibase image to Ubuntu 26.04 LTS (eclipse-temurin:21.0.12.1_1-jre-resolute, previously21.0.9_10-jre-noble), with dvisvgm 3.6 for TikZ diagrams (#2209)
Fixed
- Fix GoAT diagrams on
linux/arm64: theyuzutech/krokiarm64 image shipped an x86-64goatbinary, because it was built for the build platform instead of the target platform (#2186) - Fix UMLet custom drawings, rendered as
java.lang.NullPointerException, and "all in one" activity and sequence elements, rendered almost empty: UMLet is now built from the upstream 15.1 sources (Kroki reported 15.1 but shipped a fork of UMLet 15.0) (#2223) - Stop installing a C/C++ toolchain (
gcc,build-essential, ...) and development packages in theyuzutech/krokiimage, pulled by a misspelledlibgirepositorypackage name (about 240 MB smaller) (#2199) - Report the Pikchr and GoAT versions shipped in the image in
/health(and in the HTTP cache key): Pikchr reported an olderpikchr.cartifact (7269f78c4ainstead of85e65b9686) and GoAT reportedundefinedinstead of 0.5.1 (#2205) - Fix zombie processes piling up in the Mermaid, BPMN, Excalidraw and diagrams.net containers after a Chromium crash:
tininow runs as PID 1 to reap them (#2244) - Fix the Excalidraw container taking 8.5 seconds to stop after its first render, and failing the conversions still loading a page at that point with a 400 error: the page and its assets are now served by a dedicated server listening on a random loopback port, which also means they are no longer exposed on port 8004 (#2247)
- Fix the error returned when a Vega or Vega-Lite diagram references a URL: it recommended
KROKI_SAFE_MODE=unsafe, which does not allow loading external resources, as thevegabinary has no network or file system access. This limitation is now documented (#2246)
Diagram libraries
- Update D2 to 0.9.0 (#2192)
- Update erd to 0.2.2, built from the upstream release sources (Kroki reported 0.2.3 but actually shipped erd 0.2.1.0) (#2188)
- Update PlantUML (and C4-PlantUML) to 1.2026.9 (#2190)
- Update Vega-Lite to 6.5.0 (#2195)
- Update bpmn-js to 18.31.1 (#2211)
- Update Structurizr to 6.2.4 (#2216)
- Update WaveDrom to 3.8.0 (#2217)
- Update Mermaid to 12.3.0 (#2252)
What's Changed
- ci: build erd and symbolator images on demand by @ggrossetie in #2187
- ci: build release images on native arm64 runners by @ggrossetie in #2186
- ci: build the Graphviz image on demand by @ggrossetie in #2189
- build(deps): copy erd, symbolator and Graphviz from the published tool images by @ggrossetie in #2188
- Update dependency d2lang/d2 to v0.9.0 by @ggrossetie in #2192
- Update dependency plantuml/plantuml to v1.2026.9 by @ggrossetie in #2190
- ci: build the Pikchr image on demand by @ggrossetie in #2191
- Update dependency vega-lite to v6.5.0 by @ggrossetie in #2195
- Update dependency onml to v2.3.0 by @ggrossetie in #2193
- Update dependency pino to v10.4.0 by @ggrossetie in #2194
- build(deps): copy Pikchr from the published tool image by @ggrossetie in #2196
- chore(renovate): keep the tool images on the Kroki base image Ubuntu release by @ggrossetie in #2197
- fix(docker): install libgirepository-1.0-1 instead of matching a regex by @ggrossetie in #2199
- ci: build the blockdiag and WireViz images on demand by @ggrossetie in #2200
- build: generate the companion assets when building the images by @ggrossetie in #2202
- fix: report the D2, PlantUML and Vega-Lite versions shipped in the image by @ggrossetie in #2201
- build(deps): copy blockdiag and WireViz from the published tool images by @ggrossetie in #2204
- ci: let Renovate update every diagram library version occurrence by @ggrossetie in #2203
- ci(docs): give the Kind deployments more time to become available by @ggrossetie in #2207
- fix: report the Pikchr and GoAT versions shipped in the image by @ggrossetie in #2205
- ci: let Renovate update the blockdiag and WireViz version occurrences by @ggrossetie in #2206
- ci(renovate): parse the eclipse-temurin versions by @ggrossetie in #2208
- ci: build the ditaa and UMLet images on demand from the upstream sources by @ggrossetie in #2210
- build(docker): move the Kroki image to Ubuntu 26.04 LTS by @ggrossetie in #2209
- Update ubuntu Docker tag to v26 by @ggrossetie in #2043
- fix(wavedrom): only lint the JavaScript sources by @ggrossetie in #2222
- chore(deps): update dependency buildx to v0.38.1 by @ggrossetie in #2212
- chore(deps): update dependency bpmn-js to v18.31.1 by @ggrossetie in #2211
- chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.6.1 by @ggrossetie in #2213
- chore(deps): update java dependencies by @ggrossetie in #2214
- ci: only build the tool images changed by a pull request by @ggrossetie in #2221
- chore(deps): update dependency graphviz/graphviz to v16 by @ggrossetie in #2219
- chore(deps): update haskell docker tag to v9.10.3 by @ggrossetie in #2218
- chore(deps): update structurizr packages to v6.2.4 by @ggrossetie in #2216
- chore(deps): update dependency wavedrom to v3.8.0 by @ggrossetie in #2217
- test(ditaa): extract ditaa from the published tool image instead of the ditaa-mini fork by @ggrossetie in #2224
- build(umlet): make the native binary relocatable and always headless by @ggrossetie in #2226
- fix(companions): block render-time requests in diagrams.net, Excalidraw and BPMN by @ggrossetie in #2225
- ci: manage the build tool versions with mise by @ggrossetie in #2227
- chore(renovate): only propose LTS Java and Node.js versions in mise.toml by @ggrossetie in #2228
- build(deps): copy ditaa and UMLet from the published tool images by @ggrossetie in #2223
- build(docker): silence npm install output in Docker images by @ggrossetie in #2229
- ci: speed up the test-containers job by @ggrossetie in #2230
- build(docker): reduce apt-get, download and deno compile output in Docker images by @ggrossetie in #2232
- ci: build the nightly arm64 images on a native runner instead of QEMU by @ggrossetie in #2231
- ci: use the GitHub Actions cache backend for the Docker layers by @ggrossetie in #2234
- ci: align the Buildx setup of the workflows and drop the QEMU leftovers by @ggrossetie in #2233
- ci: pin the BuildKit version and document its cache bug by @ggrossetie in #2237
- build: update Node.js to 24.22 and manage the local version with mise only by @ggrossetie in #2243
- fix(companions): run tini as PID 1 to reap zombie processes by @ggrossetie in #2244
- docs: fix the UNIX domain socket example for the Docker image by @ggrossetie in #2245
- fix(excalidraw): serve the page from a dedicated server to shut down cleanly by @ggrossetie in #2247
- fix(vega): reject resource requests outside unsafe mode by @ggrossetie in #2246
- chore(deps): update dependency jdx/mise to v2026.10.25 by @ggrossetie in #2239
- chore(deps): update docker images by @ggrossetie in #2240
- chore(renovate): update npm lock files without installing node_modules by @ggrossetie in #2260
- chore(deps): update dependency mermaid to v12.3.0 by @ggrossetie in #2252
- chore(deps): lock file maintenance by @ggrossetie in #2257
- chore(deps): lock file maintenance by @ggrossetie in #2256
- chore(deps): lock file maintenance by @ggrossetie in #2255
- chore(deps): lock file maintenance by @ggrossetie in #2254
- chore(deps): lock file maintenance by @ggrossetie in #2253
- chore(deps): update dependency @biomejs/biome to v2.6.3 by @ggrossetie in #2251
- chore(deps): update java dependencies by @ggrossetie in #2249
- chore(deps): update github actions by @ggrossetie in #2248
- chore(deps): update moby/buildkit docker tag to v0.34.2 by @ggrossetie in #2250
- chore(deps): update dependency @biomejs/biome to v2.6.4 by @ggrossetie in #2262
- chore(deps): lock file maintenance by @ggrossetie in #2268
- chore(deps): lock file maintenance by @ggrossetie in #2266
- chore(deps): lock file maintenance by @ggrossetie in #2264
- chore(deps): lock file maintenance by @ggrossetie in #2265
- chore(deps): update dependency jdx/mise to v2026.11.2 by @ggrossetie in #2263
- ci(renovate): align lockfile maintenance minimumReleaseAge with updates by @ggrossetie in #2269
- chore(deps): lock file maintenance by @ggrossetie in #2267
Full Changelog: v0.34.0...v0.35.0