# Repository-Regeln — CVE-2026-111497

Geltungsbereich: Agenten und Menschen, die in diesem Repository arbeiten.
Priorität: Sicherheit vor Geschwindigkeit. Jeder nicht umkehrbaren Aktion gehen eine Sicherung
und eine Prüfung derselben Operation in einer Sandbox voraus.

## Zweck

Das Repository enthält einen wiederverwendbaren Behebungsagenten für **CVE-2026-111497**, einen
Out-of-Bounds-Schreibzugriff im Google-Brotli-Decoder. Der Kern ist die Menge deterministischer
Bash-Skripte in `src/`; sie liefern ein kompaktes maschinenlesbares Urteil und halten den
Token-Verbrauch des Sprachmodells minimal.

## Verantwortungsgrenzen

- `src/detect.sh` — **nur lesend.** Es ändert kein Paket, keinen Dienst und keine Konfigurationsdatei.
- `src/remediate.sh` — der einzige Änderungspunkt. Es führt die Sicherung, das Gate zur
  Echtheitsprüfung, den Probelauf, die Installation und den Neustart der Konsumenten aus.
- `src/verify.sh` — **nur lesend.** Es bestätigt den tatsächlich erzielten Effekt.

## Verbindliche Invarianten

1. **Sicherung vor der Änderung.** `remediate.sh` legt immer
   `/root/cve-2026-111497-fix-<timestamp>/` mit den alten `.so`-Dateien, dem herunterladbaren
   `.deb` und einem `dpkg`-Snapshot an, bevor irgendetwas installiert wird.
2. **Gate zur Echtheitsprüfung.** Eine Installation erfolgt erst, nachdem bestätigt ist, dass das
   Changelog des Kandidaten `CVE-2026-111497` nennt. Andernfalls endet das Skript und eskaliert.
3. **Konsumenten neu starten.** Nach der Behebung darf kein Prozess die verwundbare
   `libbrotlidec` weiter eingebunden halten. Geprüft wird über `/proc/*/maps` und den Vergleich
   der Inodes.
4. **Keine Geheimnisse im Repository.** Keine Schlüssel, Passwörter, Token, echten IP-Adressen
   oder Hostnamen. Zielhosts werden als SSH-Alias aus `~/.ssh/config` übergeben.
5. **Dateiformat.** LF, kein BOM, UTF-8. `.sh`-Dateien werden mit Modus `100755` committet.
6. **`.ragraf/` wird nie committet** — die Regel steht in der `.gitignore` im Wurzelverzeichnis.

## Befehle

```bash
# syntax check before delivery
bash -n src/common.sh src/detect.sh src/remediate.sh src/verify.sh

# field order is fixed: detect -> remediate -> verify
bash src/detect.sh ; echo "exit=$?"
bash src/remediate.sh
bash src/verify.sh
```

## Verifikation

Eine Änderung wird nur angenommen, wenn alles Folgende gilt:

```bash
bash -n src/*.sh                       # no syntax error
shellcheck src/*.sh                    # no unresolved finding
ghagent doc --root .                   # markdown and privacy contract
```

Der verhaltensbezogene Nachweis ist ein Feldlauf auf einem entbehrlichen Host: `detect.sh`
liefert `1`, dann liefert `remediate.sh` `0`, dann gibt `verify.sh` `VERIFY: PASS` aus.

## Reihenfolge beim Commit (Eigentümer, nicht Agent)

Die überschreibenden Variablen entfernen und die Identität des Eigentümers ausdrücklich setzen:

```bash
unset GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
git -c user.name='Mikhail Deynekin' -c user.email='Mikhail@Deynekin.com' commit -m '...'
git log -1 --format='%an <%ae> | %cn <%ce>'   # owner, never zwork
```

## Fallstricke

| Fallstrick | Symptom | Maßnahme |
|---|---|---|
| `set -o pipefail` mit einem früh beendenden `head`/`awk` | Exit 141 (SIGPIPE) im Erfolgsfall | `pipefail` wird in `common.sh` bewusst weggelassen |
| Eine State-Datei als Shell einbinden | Syntaxfehler bei `PRETTY_NAME` mit Klammern | Werte mit `state_get` lesen |
| Inode aus einem Glob erfasst | es wird der Inode des Symlinks erfasst, die Prüfung auf veraltete Bindung besteht fälschlich | `find -type f -printf '%i'` |
| `printf '%s'` ohne Zeilenumbruch in einer Unit-Schleife | Unit-Namen verschmelzen, der Neustart bewirkt stillschweigend nichts | `printf '%s\n'` |
| `systemctl restart` einer Desktop-Unit | verlorene Sitzung, abgebrochenes VPN | Desktop- und Infrastruktur-Units stehen in `DESKTOP_INFRA_PAT` und werden als zurückgestellt gemeldet |
| Neustart der Daemons des ISPmanager-Panels mit `kill` | Korruption des Panel-Zustands | `mgrctl -m core --restart srvparam` |

## Untersagt

- Dateien löschen, die die Aufgabe nicht nennt, ohne ausdrückliche Zustimmung des Eigentümers.
- `remediate.sh` ohne vorheriges `detect.sh` ausführen (der Zustand vor der Änderung ist
  verbindlich).
- Eine Paketinstallation erzwingen, wenn das Gate zur Echtheitsprüfung nicht bestanden ist.
- Automatische Aktualisierung oder unbeaufsichtigten Neustart auf einem Zielhost aus eigener
  Initiative aktivieren.
