Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-5325GitHub issuePublicDecided· Duplicate

Editable TextFields (weather, clock, network, tailscale) trigger unbounded native clipboard reads on every system clipboard change

Reported by iampoul · filed Oct 11, 2026 · open at source

Decided: Duplicate — decided by agents · verified 2 days ago.

R-1312 is the earliest report of this defect — filed Aug 28, 2026, open upstream. This report (filed Oct 11, 2026) describes the same defect, so it is folded under it in the inbox.

Decided by agents · verified· Oct 11, 2026

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
AreaPartly in the audited arealock· Decided by agents · verified
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

Editable TextFields (weather, clock, network, tailscale) trigger unbounded native clipboard reads on every system clipboard changerevision 1 · captured 2026-10-11 06:40 UTC via poll

Affected component

shell/Ui/TextField.qml (shared wrapper around QtQuick.Controls.TextField) and every first-party panel that embeds a non-readOnly instance of it. Found while reviewing a marketplace plugin update at omacom/omarchy-plugin-marketplace#10868; on inspection it is not specific to that plugin.

Omarchy version: 4.0.4-1 (installed). Checked against the quattro branch source on GitHub, which has the identical code.

What happens

Every editable TextField connects, unconditionally and for its whole lifetime, to the process-global QClipboard::dataChanged() signal (QQuickTextInput::init(), qquicktextinput.cpp:2894 at Qt 6.11.2, the version installed here). The handler, q_canPasteChanged(), calls mimeData->text() on every firing of that signal — i.e. whenever any application in the session writes to the clipboard, regardless of which field has focus or whether the user ever pastes (qquicktextinput.cpp:3001-3011, same version). This is skipped only when the field is readOnly.

mimeData->text() on Wayland reads through QWaylandMimeData::readData() (qwaylanddataoffer.cpp), which loops poll() + read() with only a 1-second timeout between chunks and no total byte cap and no overall deadline. A clipboard source that keeps producing data (or stalls just under the per-chunk timeout) can hold that read open indefinitely inside the shared Quickshell process, since all panels run in one process.

Because readOnly is the only gate in Qt, and it also disables keyboard editing entirely, there is no way to keep a field both typeable and exempt from this from inside the field itself.

Where it's instantiated

All of these are plain, non-readOnly TextFields, created once their panel loads and only toggled via visible: (not gated behind a Loader { active: ... }), so each is connected to the global clipboard signal for the panel's full lifetime:

  • shell/plugins/panels/weather/Panel.qml:615 — location search
  • shell/plugins/panels/clock/Panel.qml:384 and :407 — birth year / life expectancy
  • shell/plugins/panels/network/Panel.qml:2020 and :2044 — WiFi identity + passphrase
  • shell/plugins/panels/tailscale/Panel.qml:602 — Mullvad region search

The WiFi passphrase field is the most sensitive instance, since it's where users type a secret into a field that's reading the system clipboard on every unrelated clipboard write elsewhere in the session.

Impact

Any application in the same session with ordinary clipboard write access — no elevated privilege, nothing beyond what any GUI app already has — can keep this native read open against the shared shell process whenever it broadcasts clipboard changes. This is a shared-process reliability/memory concern (the shell can stall or grow memory while one of these fields exists), not a privilege-boundary crossing, so per .github/SECURITY.md this is filed as a regular issue rather than a private report.

Suggested directions (not prescriptive)

  • Gate each field behind Loader { active: <actively editing> }, matching the pattern already used in the plugin that surfaced this (omacom/omarchy-plugin-marketplace#10868, Panel.qml + LocationPicker.qml), so the clipboard connection only exists while the field is genuinely in use rather than for the panel's whole lifetime. This narrows the window but doesn't eliminate it while editing.
  • If a full fix needs to happen upstream in Qt/Qt Wayland (bounding QWaylandMimeData::readData(), or making canPaste computation lazy instead of eager on every clipboard change), it may be worth tracking there and treating this issue as the Omarchy-side mitigation tracker.

Happy to share the exact source citations/commit SHAs I checked them against if useful.

View raw text
## Affected component

`shell/Ui/TextField.qml` (shared wrapper around `QtQuick.Controls.TextField`) and every first-party panel that embeds a non-`readOnly` instance of it. Found while reviewing a marketplace plugin update at omacom/omarchy-plugin-marketplace#10868; on inspection it is not specific to that plugin.

Omarchy version: `4.0.4-1` (installed). Checked against the `quattro` branch source on GitHub, which has the identical code.

## What happens

Every editable `TextField` connects, unconditionally and for its whole lifetime, to the **process-global** `QClipboard::dataChanged()` signal (`QQuickTextInput::init()`, `qquicktextinput.cpp:2894` at Qt 6.11.2, the version installed here). The handler, `q_canPasteChanged()`, calls `mimeData->text()` on every firing of that signal — i.e. whenever *any* application in the session writes to the clipboard, regardless of which field has focus or whether the user ever pastes (`qquicktextinput.cpp:3001-3011`, same version). This is skipped only when the field is `readOnly`.

`mimeData->text()` on Wayland reads through `QWaylandMimeData::readData()` (`qwaylanddataoffer.cpp`), which loops `poll()` + `read()` with only a **1-second timeout between chunks** and **no total byte cap and no overall deadline**. A clipboard source that keeps producing data (or stalls just under the per-chunk timeout) can hold that read open indefinitely inside the shared Quickshell process, since all panels run in one process.

Because `readOnly` is the only gate in Qt, and it also disables keyboard editing entirely, there is no way to keep a field both typeable and exempt from this from inside the field itself.

## Where it's instantiated

All of these are plain, non-`readOnly` `TextField`s, created once their panel loads and only toggled via `visible:` (not gated behind a `Loader { active: ... }`), so each is connected to the global clipboard signal for the panel's full lifetime:

- `shell/plugins/panels/weather/Panel.qml:615` — location search
- `shell/plugins/panels/clock/Panel.qml:384` and `:407` — birth year / life expectancy
- `shell/plugins/panels/network/Panel.qml:2020` and `:2044` — WiFi identity + **passphrase**
- `shell/plugins/panels/tailscale/Panel.qml:602` — Mullvad region search

The WiFi passphrase field is the most sensitive instance, since it's where users type a secret into a field that's reading the system clipboard on every unrelated clipboard write elsewhere in the session.

## Impact

Any application in the same session with ordinary clipboard write access — no elevated privilege, nothing beyond what any GUI app already has — can keep this native read open against the shared shell process whenever it broadcasts clipboard changes. This is a shared-process reliability/memory concern (the shell can stall or grow memory while one of these fields exists), not a privilege-boundary crossing, so per `.github/SECURITY.md` this is filed as a regular issue rather than a private report.

## Suggested directions (not prescriptive)

- Gate each field behind `Loader { active: <actively editing> }`, matching the pattern already used in the plugin that surfaced this (omacom/omarchy-plugin-marketplace#10868, `Panel.qml` + `LocationPicker.qml`), so the clipboard connection only exists while the field is genuinely in use rather than for the panel's whole lifetime. This narrows the window but doesn't eliminate it while editing.
- If a full fix needs to happen upstream in Qt/Qt Wayland (bounding `QWaylandMimeData::readData()`, or making `canPaste` computation lazy instead of eager on every clipboard change), it may be worth tracking there and treating this issue as the Omarchy-side mitigation tracker.

Happy to share the exact source citations/commit SHAs I checked them against if useful.

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

  • DuplicateR-1312Decided by agents · verified · 2026-10-11 07:02 UTC