---
id: "CVE-2026-114606"
kind: "vulnerability"
aliases: ["CVE-2026-114606"]
title: "draw.io Desktop: renderer can read arbitrary local files through IPC"
severity: "medium"
cvss: 5.6
epss: 0.00193
exploited: false
status: "open"
category: "package"
products: []
ecosystems: []
tags: ["desktop", "draw.io-desktop", "electron", "package", "workstations"]
not_affected_if: ["fixed-version", "managed-hosting", "web-only-use"]
published_at: "2026-10-22T17:16:58+00:00"
first_seen_at: "2026-10-23T21:57:31+00:00"
updated_at: "2026-10-25T04:10:32+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-114606", "first_seen_at": "2026-10-23T21:57:31+00:00"}, {"source": "epss", "url": "https://api.first.org/data/v1/epss?cve=CVE-2026-114606", "first_seen_at": "2026-10-24T07:15:51+00:00"}]
---

# draw.io Desktop: renderer can read arbitrary local files through IPC

draw.io Desktop's Electron main process exposes several read-side IPC handlers that accept any filesystem path chosen by the renderer, with no authorization check. A frame running in the app's file:// origin can therefore read local files the app would never allow it to write.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- Run `draw.io --version` or check the installed draw.io Desktop version in the About dialog; versions below `31.4.4` are affected.
- Confirm whether untrusted web content or external documents can be opened inside the app's renderer.

## Fix

- Upgrade draw.io Desktop to `31.4.4` or later.

## Timeline

- 2026-10-23T21:57:31+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-114606
- 2026-10-24T07:15:51+00:00 epss https://api.first.org/data/v1/epss?cve=CVE-2026-114606

## From the sources

draw.io Desktop is the official Electron build of draw.io. Prior to 31.4.4, draw.io Desktop is vulnerable to arbitrary local-file disclosure through the Electron main process's read-side IPC handlers. The readFile, getFileDrafts, getBkpFile, fileStat, isFileWritable, checkFileExists, and watchFile actions operate on a renderer-chosen filesystem path with no blessed-path (assertWritablePath) authorization. The only gates are validateSender — a URL-prefix origin check — plus, for readFile alone, a content "sniff" and a lexical appBaseDir prefix block. The write-side handlers (saveFile, writeFile, saveDraft, deleteFile) are all protected by assertWritablePath; the read side is not. The result is a read/write authorization asymmetry: any frame executing in the app's file:// origin can read the contents of local files that the same origin is explicitly forbidden to write. This issue is fixed in version 31.4.4.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
