1 Commits

Author SHA1 Message Date
opm ce1b8def77 fix(approvals): harden target regex against scheme truncation
The target-extraction regex stopped at ':' and '/', so a dialog
containing a full URL (e.g. 'http://verify.muse-dev.online/api/...')
was captured as just the scheme ('http'). Add an optional
'(?:https?://)?' prefix so the hostname is captured instead.

This is defense-in-depth: the 2026-10-11 bare-scheme dialogs render
'http' directly from the app (closed source), but if the app resumes
rendering full URLs, the extractor will now yield the hostname rather
than the scheme.

Verified against 5 cases: bare 'http' unchanged, full http/https URLs
now yield hostnames, IPs and single-label hosts unchanged.
2026-10-11 20:06:32 -04:00
3 changed files with 1 additions and 96 deletions
+1 -1
View File
@@ -735,7 +735,7 @@ def inspect_node_approvals(node: str) -> dict:
ip = None ip = None
target = None target = None
m_t = re.search( m_t = re.search(
r"(?:connection to|share information with|contact|connect to)\s+([A-Za-z0-9][A-Za-z0-9.-]*[A-Za-z0-9])", r"(?:connection to|share information with|contact|connect to)\s+(?:https?://)?([A-Za-z0-9][A-Za-z0-9.-]*[A-Za-z0-9])",
card_text, card_text,
) )
if m_t: if m_t:
-38
View File
@@ -1,38 +0,0 @@
# Ticket #213 verification — SSH key perms and container dial-in (646)
Date: 2026-10-09 ~22:50 UTC
Operator: operator-646 (muse-646-patha)
Branch: `dev/646/213-fix-ssh-perms`
## 1. authorized_keys permissions (port 2226 dial-in)
- `~/.ssh/authorized_keys` (`/home/hatch/.ssh/authorized_keys`):
- before: `600 root:root`
- ran `chmod 600 ~/.ssh/authorized_keys` per ticket
- after: `600 root:root` (no-op — already correct)
- sshd's requirement (private key file must not be group/world-writable,
ideally 600) is satisfied. `~/.ssh` itself is `700`.
## 2. Container sshd
- `sshd` running (pid 2655, listener, 0 of 10-100 startups).
- Listening on `0.0.0.0:22` and `[::]:22`.
- `authorized_keys` holds 1 key:
- `ssh-ed25519 SHA256:UOeqKF5BehWNmEpBSk53Qhz0Jd9aQXbFO0VKe2AVo8c`
(comment `super@bl`) — dial-in identity belongs to super.
## 3. Reverse tunnel (VM 2226 → container:22)
- On VM 34.139.37.135 (as dev-operator-646): `127.0.0.1:2226` and
`[::1]:2226` are LISTENING — the reverse tunnel is up.
- Bind is loopback-only (no GatewayPorts), so dial-in must originate
from the VM itself — expected for `ssh -R` forwards.
## 4. Dial-in path verdict
Container-side prerequisites are all green: perms 600, sshd listening,
tunnel established, authorized key present. The final key-auth step can
only be completed by the holder of the `super@bl` private key, so no
full loopback auth was attempted from this operator identity.
Fixes #213
-57
View File
@@ -1,57 +0,0 @@
# Ticket #215 verification — SSH StrictModes on /home/hatch
Date: 2026-10-09 ~23:00 UTC
Operator: operator-646 (muse-646-patha)
Branch: `dev/646/215-strictmodes-fix`
## Ticket premise
#215 claims OpenSSH StrictModes rejects public-key auth on port 2226
"for user hatch" because `/home/hatch` is `drwxrws---` (group-writable
setgid), and asks whether `chmod g-w /home/hatch` or `StrictModes no`
permits dial-in.
## Investigation
1. **No `hatch` user exists.** `/etc/passwd` has only `root` plus system
`nologin` users. The only viable dial-in identity is `root`
(`PermitRootLogin without-password`, i.e. pubkey-only).
2. **Effective sshd config** (`sshd -T`): `strictmodes yes`,
`authorizedkeysfile .ssh/authorized_keys .ssh/authorized_keys2`
(relative to the login user's passwd home — for root, `/root`).
3. **Root's auth path is StrictModes-clean** and does not include
`/home/hatch`:
- `/` → `755 root:root`
- `/root` → `700 root:root`
- `/root/.ssh` → `700 root:root`
- `/root/.ssh/authorized_keys` → `600 root:root` (holds 646's
`id_ed25519.pub` + `id_frontdoor.pub`, installed by
`recover-after-rebuild.sh` §2 — by design)
4. **Empirical dial-in test (the decisive check).** From the VM over the
live reverse tunnel, with `/home/hatch` still `2770` (group-writable):
`ssh -p 2226 root@127.0.0.1` with agent-forwarded `id_frontdoor`
→ `DIALIN_OK`, `whoami` → `root`. Public-key dial-in on 2226
**works with zero changes**.
## Verdict
Neither proposed remediation is required or was applied:
- `chmod g-w /home/hatch` — unnecessary for SSH (path not consulted);
would also alter the setgid shared-directory semantics for no benefit.
- `StrictModes no` in sshd config — unnecessary, and would weaken
authentication security globally.
The StrictModes denial described in #215 cannot occur for the actual
login path. No sshd reload was needed (no config changed).
## Adjacent real gap (flagged, not fixed — needs a decision)
`super@bl`'s ed25519 key (`SHA256:UOeqKF5B…`) lives only in
`/home/hatch/.ssh/authorized_keys`, which sshd **never reads** (no
`hatch` user exists). If super needs 2226 dial-in, that key must be
appended to `/root/.ssh/authorized_keys`. The recover script
deliberately installs only 646's own keys there, so this is a
provisioning decision for 646/super — left untouched.
Fixes #215