Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA 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.
Bluetooth remains pairable after the Omarchy panel is closed
Reported by bosse4 · filed Aug 23, 2026 · open at source
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?
- AreaOutside the audited area· 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
System details
- Hardware: Lenovo ThinkPad L480
- Omarchy: 4.0.0-1
- Kernel: 7.1.8-arch1-3
- BlueZ: 5.87-2
What's wrong?
With Bluetooth powered on and the Omarchy Bluetooth panel closed, the adapter remains pairable indefinitely:
$ bluetoothctl show | grep -E 'Powered|Discoverable|Pairable|Discovering'
Powered: yes
Discoverable: no
Pairable: yes
Discovering: noPairableTimeout uses the BlueZ default of 0, so pairable mode does not expire. The default pairing agent runs for the entire graphical session:
$ systemctl --user status bt-agent.service
/usr/bin/bt-agent -c NoInputNoOutputExpected behavior
The comment in /usr/lib/systemd/user/bt-agent.service says:
NoInputNoOutput auto-accepts pair requests. Safe because the adapter is only pairable: true when the user explicitly opens the omarchy bluetoothPanel and starts scanning; outside that window bluez refuses inbound pair attempts at a lower layer.The adapter should therefore be non-pairable whenever the Bluetooth panel is closed.
Actual code path
/usr/share/omarchy/shell/plugins/panels/bluetooth/Panel.qml starts discovery while the panel is open and stops it after closing by writing:
root.adapter.discovering = true
root.adapter.discovering = falseHowever, the panel never reads or writes adapter.pairable. Quickshell exposes pairable as a writable adapter property, but BlueZ remains at its default Pairable: true.
Security impact
A nearby device that knows the adapter's public Bluetooth address may initiate an incoming pairing attempt while the panel is closed.
Because the default agent advertises NoInputNoOutput, pairing may fall back to “Just Works” without user confirmation, depending on the peer and negotiated security requirements. Discoverable: no reduces exposure but does not enforce the security boundary described by the service comment.
No pairing attempt or exploit was performed while investigating this issue.
Minimal fix
Tie adapter.pairable to the Bluetooth panel lifecycle:
- Set it to
truewhile at least one Bluetooth panel is open and the adapter is powered. - Set it to
falseafter the last panel closes, is destroyed, or Bluetooth is turned off. - Preserve the existing multi-monitor discovery ownership logic.
- Keep
NoInputNoOutput; reconnection of already paired devices should remain unaffected.
A fixed timeout alone is insufficient because the current panel does not re-enable pairable mode on later opens.
Steps to reproduce
- Log in with Bluetooth enabled.
- Confirm that
bt-agent.serviceis running. - Open the Omarchy Bluetooth panel and let it scan.
- Close the panel and wait a few seconds.
- Run:
bluetoothctl show | grep -E 'Powered|Discoverable|Pairable|Discovering'- Observe:
Powered: yes
Discoverable: no
Pairable: yes
Discovering: noExpected after closing the panel:
Pairable: noView raw text
## System details - Hardware: Lenovo ThinkPad L480 - Omarchy: 4.0.0-1 - Kernel: 7.1.8-arch1-3 - BlueZ: 5.87-2 ## What's wrong? With Bluetooth powered on and the Omarchy Bluetooth panel closed, the adapter remains pairable indefinitely: ```console $ bluetoothctl show | grep -E 'Powered|Discoverable|Pairable|Discovering' Powered: yes Discoverable: no Pairable: yes Discovering: no ``` `PairableTimeout` uses the BlueZ default of `0`, so pairable mode does not expire. The default pairing agent runs for the entire graphical session: ```console $ systemctl --user status bt-agent.service /usr/bin/bt-agent -c NoInputNoOutput ``` ## Expected behavior The comment in `/usr/lib/systemd/user/bt-agent.service` says: > NoInputNoOutput auto-accepts pair requests. Safe because the adapter is only `pairable: true` when the user explicitly opens the omarchy bluetoothPanel and starts scanning; outside that window bluez refuses inbound pair attempts at a lower layer. The adapter should therefore be non-pairable whenever the Bluetooth panel is closed. ## Actual code path `/usr/share/omarchy/shell/plugins/panels/bluetooth/Panel.qml` starts discovery while the panel is open and stops it after closing by writing: ```qml root.adapter.discovering = true root.adapter.discovering = false ``` However, the panel never reads or writes `adapter.pairable`. Quickshell exposes `pairable` as a writable adapter property, but BlueZ remains at its default `Pairable: true`. ## Security impact A nearby device that knows the adapter's public Bluetooth address may initiate an incoming pairing attempt while the panel is closed. Because the default agent advertises `NoInputNoOutput`, pairing may fall back to “Just Works” without user confirmation, depending on the peer and negotiated security requirements. `Discoverable: no` reduces exposure but does not enforce the security boundary described by the service comment. No pairing attempt or exploit was performed while investigating this issue. ## Minimal fix Tie `adapter.pairable` to the Bluetooth panel lifecycle: - Set it to `true` while at least one Bluetooth panel is open and the adapter is powered. - Set it to `false` after the last panel closes, is destroyed, or Bluetooth is turned off. - Preserve the existing multi-monitor discovery ownership logic. - Keep `NoInputNoOutput`; reconnection of already paired devices should remain unaffected. A fixed timeout alone is insufficient because the current panel does not re-enable pairable mode on later opens. ## Steps to reproduce 1. Log in with Bluetooth enabled. 2. Confirm that `bt-agent.service` is running. 3. Open the Omarchy Bluetooth panel and let it scan. 4. Close the panel and wait a few seconds. 5. Run: ```console bluetoothctl show | grep -E 'Powered|Discoverable|Pairable|Discovering' ``` 6. Observe: ```text Powered: yes Discoverable: no Pairable: yes Discovering: no ``` Expected after closing the panel: ```text Pairable: no ```
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.
- Out of scopeDecided by agents · verified · 2026-10-09 08:29 UTC