Issue 361: the setuid search shows its progress, and the operator can ask for a fresh one at the terminal
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
layer: to-be
|
layer: to-be
|
||||||
status: in-progress
|
status: in-progress
|
||||||
code: [mesh-controller, mesh-host, mesh-tools, mesh-catalog, mesh-sdk, mesh-lab]
|
code: [mesh-controller, mesh-host, mesh-tools, mesh-catalog, mesh-sdk, mesh-lab]
|
||||||
updated: 2026-10-09
|
updated: 2026-10-10
|
||||||
decisions:
|
decisions:
|
||||||
- 02-DECISIONS/0271-a-send-held-for-the-buss-planned-step-is-told-to-the-operator-at-once-and-a-change-that-needs-it-says-so-before-it-merges.md
|
- 02-DECISIONS/0271-a-send-held-for-the-buss-planned-step-is-told-to-the-operator-at-once-and-a-change-that-needs-it-says-so-before-it-merges.md
|
||||||
- 02-DECISIONS/0265-a-verb-that-reads-is-answered-on-the-serving-controllers-own-connection-and-every-connection-says-what-it-is.md
|
- 02-DECISIONS/0265-a-verb-that-reads-is-answered-on-the-serving-controllers-own-connection-and-every-connection-says-what-it-is.md
|
||||||
@@ -73,6 +73,7 @@ Every kind of state the core keeps, and the one component that writes it. Anyone
|
|||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| a machine's declaration | controller (lease holder) | the bus, last per subject | read |
|
| a machine's declaration | controller (lease holder) | the bus, last per subject | read |
|
||||||
| a hand-over asked of a machine ([issue 356](../../04-ISSUES/356-the-operators-command-ran-a-stale-engine-and-a-hand-over-had-no-channel/00-report.md)) | controller, at its terminal | the machine, beside its state | the engine verifies the mesh's signature and records it, or refuses |
|
| a hand-over asked of a machine ([issue 356](../../04-ISSUES/356-the-operators-command-ran-a-stale-engine-and-a-hand-over-had-no-channel/00-report.md)) | controller, at its terminal | the machine, beside its state | the engine verifies the mesh's signature and records it, or refuses |
|
||||||
|
| a fresh setuid search asked of a machine ([issue 361](../../04-ISSUES/361-the-control-nodes-agent-account-is-never-judged/00-report.md)) | controller, at its terminal | the machine, which throws its last search away | the engine verifies the mesh's signature and starts it, or refuses |
|
||||||
| a machine's applied state and its report | the node-engine's apply queue (§6) | the machine; the report on the bus | the reconcile and a delivery *enqueue*, never apply |
|
| a machine's applied state and its report | the node-engine's apply queue (§6) | the machine; the report on the bus | the reconcile and a delivery *enqueue*, never apply |
|
||||||
| the controller lease | the controller instance holding it | key-value `mesh-controller_lease` | a candidate waits |
|
| the controller lease | the controller instance holding it | key-value `mesh-controller_lease` | a candidate waits |
|
||||||
| plans and their tiers | controller (lease holder), compare-and-set on the plan's revision | the controller's store | read through `plans` |
|
| plans and their tiers | controller (lease holder), compare-and-set on the plan's revision | the controller's store | read through `plans` |
|
||||||
|
|||||||
@@ -110,3 +110,37 @@ engine agree. What it found, and what was done:
|
|||||||
every searched filesystem would report each change of mode or owner as it happens, turning the daily walk into
|
every searched filesystem would report each change of mode or owner as it happens, turning the daily walk into
|
||||||
a true incremental search.
|
a true incremental search.
|
||||||
- **Resolution** of this core issue needs a replay in mesh-lab's register, or `replay-none:` with the reason.
|
- **Resolution** of this core issue needs a replay in mesh-lab's register, or `replay-none:` with the reason.
|
||||||
|
|
||||||
|
## 2026-10-10 — the search shows its progress, and the operator can ask for a fresh one
|
||||||
|
|
||||||
|
- **The progress was kept and seen by nobody.** At 01:40 the operator asked how far the first walk on the
|
||||||
|
control-node had got. The walk kept its progress every minute beside the engine's state, but `root-free` said
|
||||||
|
only "not judged yet (search running), started 01:27", and no tool read further. The node-engine serves no
|
||||||
|
tools of its own, so the progress now travels where the verdict already does: the agent account's verdict
|
||||||
|
carries it as fields, and its reason gains one line that `root-free` repeats. The line holds filesystems done
|
||||||
|
of the total, the mount point being walked, the entries visited, the setuid- or setgid-root files found so far,
|
||||||
|
when the progress was last kept, and how long each finished filesystem took. Counts, times and mount points
|
||||||
|
only: the cursor and every file found are often under an account's home, and stay in the engine's state and
|
||||||
|
journal. The line moves at each checkpoint (once a minute) and is never part of what makes a verdict
|
||||||
|
"changed", so the journal does not repeat it every minute; the statement is said every minute anyway while
|
||||||
|
the account is not healthy. An entry is counted once across a resume, as it is kept with the cursor it
|
||||||
|
matches. The time a filesystem took counts only the time the engine walked it, not the time it was stopped.
|
||||||
|
- **A change by hand was not searched for until the next day.** The first complete search on the control-node
|
||||||
|
ended at about 01:48 and found two setuid-root programs no package owns, copies in the operator's home. When the
|
||||||
|
operator removes them by hand, no apply says so, and nothing searches again until the daily search. The
|
||||||
|
operator now asks for one at the controller's terminal: `nox node setuid-search <node>` on the control-node.
|
||||||
|
The controller signs the ask with the mesh's key, as it signs a hand-over, under a signing context of its own.
|
||||||
|
The engine throws away the last complete search and any walk under way or kept, and the next look starts a
|
||||||
|
full search. Until it completes, the verdict is "not judged yet", with its progress.
|
||||||
|
- **Why at the terminal alone, not a verb.** A search can never make a machine root-free wrongly: it judges only
|
||||||
|
once complete. But every ask throws a walk away. Asked again and again, it would keep the machine unjudged
|
||||||
|
for good and its disks busy, and whoever may call a verb includes agents. The operator needs the line only
|
||||||
|
after a change made by hand.
|
||||||
|
- **Considered, not built: judge only what the agent account can reach.** A setuid program under another
|
||||||
|
account's home with mode 0700 cannot be executed by the agent account, because it cannot traverse the
|
||||||
|
directory. Counting only files whose every parent directory the agent account may traverse would stop the
|
||||||
|
operator's own copies blocking `root-free`. It is not built, for three reasons. Root or the operator can make
|
||||||
|
a directory traversable later without any apply, so the verdict would rest on modes that change unseen. ACLs
|
||||||
|
and group membership have to be read for every parent. A program the agent cannot reach today is still one
|
||||||
|
no package owns. Deciding it is a change to ADR 0266 §3 item 10, made through playbook 02 if wanted.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user