From cb93ad5f1bbd6e1b6ee5886a70f55d57d815fbda Mon Sep 17 00:00:00 2001 From: Cylae Date: Sun, 13 Sep 2026 20:23:58 +0200 Subject: [PATCH] docs(audit): record evidence baseline and branch triage --- docs/audit/2026-09-13-BASELINE.md | 47 ++++++++++++++++++++++++++ docs/audit/2026-09-13-BRANCH-TRIAGE.md | 32 ++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 docs/audit/2026-09-13-BASELINE.md create mode 100644 docs/audit/2026-09-13-BRANCH-TRIAGE.md diff --git a/docs/audit/2026-09-13-BASELINE.md b/docs/audit/2026-09-13-BASELINE.md new file mode 100644 index 0000000..12f7432 --- /dev/null +++ b/docs/audit/2026-09-13-BASELINE.md @@ -0,0 +1,47 @@ +# Audit baseline — 2026-09-13 + +## Scope and evidence + +Repository: `Cylae/server_script`; initial HEAD `a6adc51a3d10fbcdddb5f4b8045b670947e82285`. +`git status --short` and `git diff --check` were empty on arrival. +28 registered services, 20 open pull requests; see the dated branch triage. +GitHub CI run [34293303158](https://github.com/Cylae/server_script/actions/runs/34293303158) passed for this exact HEAD. + +The environment initially lacked Cargo (`cargo build --locked`: exit 127). +Rust 1.98.1, rustfmt and clippy were subsequently installed. Local compilation and +installation of cargo-deny/cargo-audit are in progress at this discovery checkpoint. +No local test success is asserted here; final results belong in the dated final audit. + +## Findings confirmed in the initial source + +| ID | Severity | Evidence at initial HEAD | Impact | +|---|---|---|---| +| A01 | Critical | `core/users.rs:133-155` | Secret loading failure falls back to the known `admin` password. | +| A02 | High | `interface/cli.rs:381-476,667`; `services/infra.rs:72`; `services/apps.rs:276` | Plaintext credentials printed, duplicated, or stored in files without explicit protection. | +| A03 | High | `core/system.rs:164-196` | Newlines in passwords can inject extra records into chpasswd input. | +| A04 | High | `core/users.rs:261-279,229-245` | Last administrator protection checks a literal name and total users; demotion is unprotected. | +| A05 | High | `interface/web.rs:467-500` | Login uses cached credentials; clearing session data does not explicitly rotate its ID. | +| A06 | High | `interface/web.rs:658-661,1356-1359` | Authorization trusts the role captured at login, after deletion or demotion. | +| A07 | High | `core/config.rs:150-189`; `core/atomic_io.rs:57-78` | Non-atomic async writes; permission failures ignored; parent directory not fsynced. | +| A08 | High | `interface/cli.rs:180-208`; `core/ops.rs:111-119`; `services/infra.rs:203-210` | Host-wide cleanup and stopping unrelated web servers violate host preservation. | +| A09 | High | `interface/cli.rs:323-333,371-378,567-584,605-611` | Failed deployment/update can still return exit code zero. | +| A10 | High | `core/updater.rs:63-122` | Self-update tolerates pull/build failures, builds from wrong directory, never installs binary, yet reports success. | +| A11 | Medium | `core/config.rs:69-75,89-93`; `interface/web.rs:113-187` | Cache paths differ from persistence path selection; stale state can survive updates. | +| A12 | Medium | `src/lib.rs:69-70`; `services/apps.rs:98` | Disabled dependencies still referenced; YOURLS database is not initialized. | +| A13 | Medium | `services/infra.rs:195-200` | Proxy administration port 81 is publicly bound despite documentation. | + +## Architectural limits requiring explicit reporting + +`ProcessLock` is defined but not used by CLI mutations. The compensatory journal is +not wired into installation/apply. The web audit page must not claim complete or +immutable audit coverage. Personal app installation records names in users.yaml; +it does not deploy isolated per-user containers. Most image tags are `latest`. +The README promises an automatic web start and zero downtime that the code does not provide. +No real host deployment, quota enforcement, mail delivery or GPU transcoding has +been validated in this environment. A green unit-test CI does not establish these properties. + +## Delivery + +Changes are grouped into reviewable gate branches with regression tests and dated +evidence. Existing agent PRs are not merged solely on their descriptions. No branch +protection bypass, remote branch deletion or destructive history rewrite is used. diff --git a/docs/audit/2026-09-13-BRANCH-TRIAGE.md b/docs/audit/2026-09-13-BRANCH-TRIAGE.md new file mode 100644 index 0000000..b1a955e --- /dev/null +++ b/docs/audit/2026-09-13-BRANCH-TRIAGE.md @@ -0,0 +1,32 @@ +# Triage des branches — 13 septembre 2026 + +Base inspectée : `a6adc51a3d10fbcdddb5f4b8045b670947e82285`. +Sources : `git branch -r` et API GitHub `pulls?state=open&per_page=100`. +20 PR ouvertes et 20 branches de travail distantes à cette date. Les « 67 branches » du texte normatif sont un historique, pas l’inventaire actuel. + +Ce triage exprime des recommandations issues du sujet et des écarts avec les contrats ; il ne certifie ni le diff complet ni les performances revendiquées de chaque PR. Aucune ancienne branche n’a été supprimée ou fusionnée dans cette mission. + +| PR | Branche | Classement | Motif | +|---|---|---|---| +| #416 | `jules-5992953717060295136-253661ac` | à ignorer | Chevauchements sur les chemins/écritures ; une validation lexicale ne prouve pas le confinement des symlinks. À réexaminer après l’audit. | +| #415 | `jules-12468028964604981280-c35a1273` | à ignorer | Chevauchements sur les chemins/écritures ; une validation lexicale ne prouve pas le confinement des symlinks. À réexaminer après l’audit. | +| #414 | `fix/security-and-user-sorting-1430597682708282895` | à ignorer | Chevauchements sur les chemins/écritures ; une validation lexicale ne prouve pas le confinement des symlinks. À réexaminer après l’audit. | +| #413 | `jules-14022616465358029411-9f94621f` | à ignorer | Changement potentiellement utile, à revoir/tester dans son périmètre ; aucune fusion automatique de cette PR. | +| #412 | `perf/cache-hardware-detection-17336695570065704145` | à ignorer | Mémoriser RAM/disques définitivement rend la détection obsolète ; benchmark revendiqué non reproduit. | +| #411 | `fix/useradd-absolute-path-13098466155646312693` | à ignorer | Changement potentiellement utile, à revoir/tester dans son périmètre ; aucune fusion automatique de cette PR. | +| #410 | `perf/optimize-doctor-port-conflicts-13098466155646316055` | à ignorer | Changement potentiellement utile, à revoir/tester dans son périmètre ; aucune fusion automatique de cette PR. | +| #409 | `perf/telemetry-poller-throttling-9685045745597693274` | à ignorer | Changement potentiellement utile, à revoir/tester dans son périmètre ; aucune fusion automatique de cette PR. | +| #408 | `fix/integrate-validate-safe-path-10011583263562090100` | à ignorer | Chevauchements sur les chemins/écritures ; une validation lexicale ne prouve pas le confinement des symlinks. À réexaminer après l’audit. | +| #407 | `fix-command-injection-run-cli-toggle-2775550130301488844` | à ignorer | Changement potentiellement utile, à revoir/tester dans son périmètre ; aucune fusion automatique de cette PR. | +| #406 | `fix/atomic-io-insecure-tempfile-10188298294900936929` | à ignorer | Chevauchements sur les chemins/écritures ; une validation lexicale ne prouve pas le confinement des symlinks. À réexaminer après l’audit. | +| #405 | `perf/users-list-alloc-optimization-16929115810620791053` | à ignorer | Changement potentiellement utile, à revoir/tester dans son périmètre ; aucune fusion automatique de cette PR. | +| #404 | `fix/remove-unused-validate-domain-2958005753390998787` | à fermer | Retire des API publiques d’une bibliothèque sous prétexte de code mort ; absence de justification fonctionnelle. | +| #403 | `code-health/remove-unused-validate-port-str-7597355792170492956` | à fermer | Retire des API publiques d’une bibliothèque sous prétexte de code mort ; absence de justification fonctionnelle. | +| #402 | `fix/journal-recovery-test-13226370120388620467` | à ignorer | Changement potentiellement utile, à revoir/tester dans son périmètre ; aucune fusion automatique de cette PR. | +| #401 | `remove-unused-is-public-portmapping-9151569566518202775` | à fermer | Retire des API publiques d’une bibliothèque sous prétexte de code mort ; absence de justification fonctionnelle. | +| #400 | `test-check-root-privilege-1541694811706861378` | à ignorer | Changement potentiellement utile, à revoir/tester dans son périmètre ; aucune fusion automatique de cette PR. | +| #399 | `fix/remove-unused-generate-op-id-1337842746933228318` | à fermer | Retire des API publiques d’une bibliothèque sous prétexte de code mort ; absence de justification fonctionnelle. | +| #398 | `test/port-mapping-error-handling-16855835431767212044` | à ignorer | Changement potentiellement utile, à revoir/tester dans son périmètre ; aucune fusion automatique de cette PR. | +| #397 | `jules-16231249243070530309-c9278a62` | à ignorer | Priorité secondaire ; à revalider après les corrections fonctionnelles. | + +Branches restantes : `origin/main` (référence, à ignorer), `origin/HEAD` (alias).