Watch
1
0
Fork
You've already forked SouveraineOS
0

audit: drop the report; the findings belong in the code and the tasks

This commit is contained in:
Fimeg 2026-08-03 15:18:35 -04:00
commit 1a73e3f4dc

View file

@ -1,114 +0,0 @@
# Audit — our own code, 2026-08-03
Asked for after a night of using the phone. Everything below was checked against
the code or the running device; anything I could not confirm says so. Ordered by
what I would fix first, not by severity in the abstract.
## 1. Five protocol filters admit every client, and two of them are keystrokes
`wayland.rs` creates these with `|_| true` as the filter — the argument whose
whole purpose is deciding who may bind:
| line | global | what binding it buys a caller |
|---|---|---|
| 477, 484 | data-control (wlr + ext) | read every clipboard and primary selection |
| 486 | `ext-session-lock` manager | ask to lock the session |
| 513 | `zwp_virtual_keyboard_v1` | **synthesize keystrokes into the focused surface** |
| 514 | `input-method` | **intercept and rewrite text input** |
The last two are the sharp ones. Any process running as uid 1000 can create a
virtual keyboard and type into whatever holds focus, or install itself as the
input method and read what is typed. That is a keylogger and an injector, from
an unprivileged process, with no attestation anywhere in the path.
Today's ceiling argument — "any uid-1000 process could already run
`blueline-screen-toggle`" — does not cover this. Blanking a screen is not
reading a password.
`SO_PEERCRED` is already available at the control socket and unused, and
`may_take_lock` is still a uid check. TASK-41 owns all of it and lands at every
one of these boundaries or none.
## 2. A wake leaves no trace in the forensic trail
`apply_gesture`'s dark-panel branch does:
```rust
self.blank_requested = false;
return vec![Action::Unblank, Action::Restore];
```
No `record_decision`. The blank branch records `panel-off` or
`lock-before-blank`; the wake branch records nothing. So the trail shows
`button-gesture … recognised` and then silence, and **"the button woke it" and
"the button did nothing" are the same entry.**
This cost real time tonight: I could not tell, from the trail, whether a press
had been swallowed or had worked. It is a two-line fix and it is the highest
value-per-line item on this page.
## 3. The device flaps `Locked → Observed → Locked` continuously
Measured on the phone today, `observed_confidence: 0.20`, transitions
alternating with nothing else between them. Every one is a trail entry, so the
trail is mostly this.
Same shape as the light-sensor oscillation fixed on 2026-07-28 (confidence
pulsing 0.50→0.70→0.50 in 1.2 s, toggling `promote_idle` across the 0.6 band):
a confidence sitting on a threshold with no hysteresis. The fix there was an
asymmetric debounce, and the same argument applies here.
Not yet established: whether the fingerprint sensor is the source. It is a
candidate — TASK-44 records that arming generates its own edge, and that a
re-arm-on-every-interrupt loop produced a 1444-event run. Casey reports the
fingerprint sensor "sometimes locks the display", which is consistent with a
storm of wake-class input driving state transitions, but I have not tied a
specific event to a specific lock and will not claim it.
What *is* ruled out: the fingerprint does not enter as a button.
`buttons.rs::classify` maps `KEY_WAKEUP` to `KeyDisposition::Wake`, not to
`Report { button: Power }`, so it cannot be resolving as a power tap.
## 4. Recognised, and bound to nothing
A running theme, and worth counting in one place:
- **Volume keys** — sessiond recognises the gesture; only power-tap is bound
(TASK-51 §3). Second-most-used control on the device.
- **`navigation.rs`** — holds TASK-37's policy, both tiers and the predictive
drag. Nothing calls it.
- **`furniture_at()` returns `None`** — so `Route::Shell` is unreachable and the
pill cannot be addressed as furniture.
- **Gestures other than the three-finger tap** — drag and drag-end resolve and
are dropped (deliberate, but it is the same shape).
Each is a decision, not a bug. The concern is that the count keeps growing.
## 5. Shipping paths that silently do not ship
- **viewtop is still a hand-copied binary in `/usr/local/bin`** — TASK-25.
`souveraine/CLAUDE.md` names this exact pattern as the one that silently never
updates, and it is how sessiond sat five days stale.
- **`blueline-usb-gadget` is NOT INSTALLED on the phone.** It was packaged
precisely to fix the stale-usb0 tether, and the device still does not have it,
so that failure recurs on every cold boot.
- **`build-cross.sh` has no `--release`** — line 45 takes `debug/`, line 46 only
prefers `release/` if it happens to exist. "aarch64 built" therefore produced
a 137 MB debug compositor. Pass `--release` or change the default.
## 6. Documentation that is now false
- `START-HERE.md` §6: *"away from home the phone has no wifi — the SSIDs are
pinned to the home network."* It joined a foreign SSID on 2026-08-02 and sat
there working. Fixed in `phone-triage.sh`; the prose still says it.
## Not audited
The QML surface tree, the kernel, and PAF. This pass covered `souveraine/src/
sessiond`, `souveraine-viewtop/crates`, and the device's live state.
## Connects to
TASK-41 (attestation at every boundary — §1 is entirely its scope), TASK-51
(§4's list is mostly its punch list), TASK-25 (§5), TASK-44 (§3's open
question), `LOCK-DPMS-LESSONS.md` §1.