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-4699GitHub issuePublicReceived

[Security] Screen recording keeps the in-flight recording path at a fixed /tmp name, and that path drives ffmpeg, mv and rm

Reported by Chessing234 · filed Aug 26, 2026Closed upstream on 2026-09-15 by the merge of PR #8374 (closed by ErikMelton). GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked yet.

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?
Not yet mapped to any requirement or component.
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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

[Security] Screen recording keeps the in-flight recording path at a fixed /tmp name, and that path drives ffmpeg, mv and rmrevision 1 · captured 2026-10-04 12:03 UTC via poll

bin/omarchy-capture-screenrecording keeps the path of the recording in flight at a fixed name in /tmp:

RECORDING_FILE="/tmp/omarchy-screenrecord-filename"
REGION_FILE="${XDG_RUNTIME_DIR:-/tmp}/omarchy-screenrecord-region"

The line below it already uses the per-user runtime directory. This one does not.

/tmp is world-writable — the sticky bit prevents deleting another user's file, not creating the name first — and the contents of that file are read back on stop and used as a filesystem path:

finalize_recording() {
  latest=$(cat "$RECORDING_FILE" 2>/dev/null)
  [[ -f $latest ]] || return
  ...
  local processed="${latest%.mp4}-processed.mp4"
  if ffmpeg "${args[@]}" "$processed" -loglevel quiet 2>/dev/null; then
    mv "$processed" "$latest"
  ...
}

stop_screenrecording() {
  ...
  local filename=$(cat "$RECORDING_FILE" 2>/dev/null)
  local preview="${filename%.mp4}-preview.png"
  ffmpeg -y -i "$filename" ... "$preview" ...
  omarchy-notification-send "Screen recording saved" ... --exec mpv -- "$filename"
  rm -f "$preview"
}

So another local account that owns the name controls, as the recording user:

  • where ffmpeg -y writes (<path>-processed.mp4, <path>-preview.png — -y overwrites without asking)
  • what mv replaces (<path> itself)
  • what rm -f deletes
  • the path the "Screen recording saved" toast opens in mpv when clicked

[[ -f $latest ]] only checks that the target exists, which is exactly the case for a file worth clobbering. $XDG_RUNTIME_DIR is 0700 and per-user, so the sibling region file has none of this.

OMARCHY_SCREENRECORD_DEBUG=true has the same shape: it appends the recorder's stderr and the picked geometry to /tmp/omarchy-screenrecord.log.

Same class as #7904 (FIDO2 authfile staged at a predictable /tmp path).

Expected

Keep the recording state and the debug log beside the region file under $XDG_RUNTIME_DIR.

View raw text
`bin/omarchy-capture-screenrecording` keeps the path of the recording in flight at a fixed name in `/tmp`:

```bash
RECORDING_FILE="/tmp/omarchy-screenrecord-filename"
REGION_FILE="${XDG_RUNTIME_DIR:-/tmp}/omarchy-screenrecord-region"
```

The line below it already uses the per-user runtime directory. This one does not.

`/tmp` is world-writable — the sticky bit prevents deleting another user's file, not creating the name first — and the contents of that file are read back on stop and used as a **filesystem path**:

```bash
finalize_recording() {
  latest=$(cat "$RECORDING_FILE" 2>/dev/null)
  [[ -f $latest ]] || return
  ...
  local processed="${latest%.mp4}-processed.mp4"
  if ffmpeg "${args[@]}" "$processed" -loglevel quiet 2>/dev/null; then
    mv "$processed" "$latest"
  ...
}

stop_screenrecording() {
  ...
  local filename=$(cat "$RECORDING_FILE" 2>/dev/null)
  local preview="${filename%.mp4}-preview.png"
  ffmpeg -y -i "$filename" ... "$preview" ...
  omarchy-notification-send "Screen recording saved" ... --exec mpv -- "$filename"
  rm -f "$preview"
}
```

So another local account that owns the name controls, as the recording user:

- where `ffmpeg -y` writes (`<path>-processed.mp4`, `<path>-preview.png` — `-y` overwrites without asking)
- what `mv` replaces (`<path>` itself)
- what `rm -f` deletes
- the path the "Screen recording saved" toast opens in mpv when clicked

`[[ -f $latest ]]` only checks that the target exists, which is exactly the case for a file worth clobbering. `$XDG_RUNTIME_DIR` is 0700 and per-user, so the sibling region file has none of this.

`OMARCHY_SCREENRECORD_DEBUG=true` has the same shape: it appends the recorder's stderr and the picked geometry to `/tmp/omarchy-screenrecord.log`.

Same class as #7904 (FIDO2 authfile staged at a predictable `/tmp` path).

## Expected

Keep the recording state and the debug log beside the region file under `$XDG_RUNTIME_DIR`.

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

Not linked to any known issue, other report or change yet.

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.

No decision has been recorded yet.