2 Commits
3 changed files with 111 additions and 2 deletions
+98
View File
@@ -0,0 +1,98 @@
# Sanctum — Projekt-Kontext & Agenten-Leitfaden (AGENTS.md)
Dieses Dokument dient als primäres Projektgedächtnis für Antigravity-Agenten und Entwickler. Es verknüpft die historische Entwicklungshistorie, dokumentiert die Kernarchitektur, verweist auf alle Sicherheitsdokumente und definiert die verbindlichen Quality Gates.
---
## 1. Konversations-Referenz & Historie
Die gesamte Genese dieses Projekts (Audit-Behebung aller 39 Findings, Carrier V2 Paged Manifest, Disaster Recovery MAC-Fix R-NEW-1, Supply-Chain-Audits und Releases bis v0.9.3) ist in folgender Konversation protokolliert:
🔗 **[Sanctum Genese, Audit-Härtung & v0.9.3 Release-Konversation](conversation://f8a1e581-6556-4799-b012-fabcae853c09)**
*(ID: `f8a1e581-6556-4799-b012-fabcae853c09` — kann in Antigravity per Klick oder im Chat via `@Conversations` geladen werden).*
---
## 2. Projektüberblick & Kernarchitektur
**Sanctum** ist eine speichersichere, hochperformante Userland-CLI in Rust, die verschlüsselte Ein-Datei-Container (`.sanctum`) unter Windows 10/11 und Linux verwaltet — zu 100 % im Userland ohne Administratorrechte oder Kernel-Treiber (kein Dokan, kein WinFsp).
### 2.1 Kryptografische Säulen (Container-Format V3)
- **Format-Version**: Neue Container nutzen Format V3 (`format_version = 3`).
- **KDF**: Argon2id ($M=256\,\text{MiB}, T=4, P=4$, M-01) zur KEK-Ableitung mit CSPRNG-Salts (`OsRng`).
- **DEK & Wrapping**: 256-Bit DEK, gewrappt per AES-256-GCM.
- **Kanonische Metadaten-Authentifizierung (K-01)**:
- Inode-Metadaten werden mit einer HMAC-SHA-256 (`SANCTUM_META_MAC_V3`) authentifiziert.
- Validierung bei jedem `mount` (`verify_metadata_mac_status_for_slot`).
- Disaster-Recovery-Resilienz (R-NEW-1): Rebuild-Fähigkeit via `MetadataMacStatus::PendingRebuild` nach Header-Wiederherstellung.
- **Chunk-Replay-Schutz (K-02)**: 24-Byte AAD (`node_id || chunk_index || metadata_gen`).
- **Dateinamen-Verschlüsselung**: AES-256-GCM mit Bindung an `parent_id` als AAD (Swap-Schutz). Warnung bei `--legacy-names`.
### 2.2 Dual-Vault & Carrier-Format V2 (Paged Manifest)
- **2-Slot-Architektur**: Slot 0 als Decoy-Vault, Slot 1 als Second Safe (Hidden Vault Modell A).
- **Steganografie & Größeninvarianz**: Der Hidden Vault liegt innerhalb einer Alibi-Trägerdatei im Decoy-Vault. Versteckte Schreibvorgänge verändern die Host-Dateigröße um exakt 0 Bytes.
- **Paged Manifest V2**:
- Trennung von Superblock (redundant auf Block 0 und Block 1, rollierende `manifest_generation`, C-02) und Inode-Seiten (`CarrierInodePage`, ~1 MB Payload, ca. 4.5007.000 Inodes/Seite).
- Keine starre Kapazitätsobergrenze mehr; dynamische Skalierung mit den Trägerblöcken.
- Fail-Soft Resilienz (D-01): Isolierung beschädigter Seiten ohne Mount-Abbruch.
- In-Memory Sekundärindex (D-02): $O(\text{Geschwister})$ Pfadauflösung.
- Manifest-Entkopplung via Dirty-Tracking (C-03): Schnelle I/O-Operationen ohne synchrone 1-MB-Manifest-Neuverschlüsselung.
### 2.3 OpSec, Anti-Leak & Disaster Recovery
- **Anti-Leak Shield**: Blockiert Explorer-Artefakte (`Thumbs.db`, `desktop.ini`, `*.tmp`, NTFS ADS `:Zone.Identifier`).
- **Memory Security**: `Zeroize` für alle Schlüssel und Passwörter; `VirtualLock` / `mlock` gegen Swap-Auslagerung.
- **Transaktionales Chunk-Shredding**: Logisches Überschreiben von Chunks mit CSPRNG-Rauschen vor dem Löschen.
- **Disaster Recovery**: 24-Wort BIP-39 Notfallschlüssel pro Slot, Online-Backups via SQLite Online Backup API.
---
## 3. Zentrale Dokumentation im Repository
| Dokument | Zweck / Inhalt |
|---|---|
| [`README.md`](README.md) | Hauptdokumentation, Feature-Übersicht, CLI-Verwendung & V1→V2 Migrationsanleitung |
| [`SECURITY.md`](SECURITY.md) | Responsible Disclosure Policy, SLAs (48h/5d/90d), Scope, Meldekanal (`security@pansi.eu`) |
| [`SECURITY_AUDIT.md`](SECURITY_AUDIT.md) | Vollständiges Log aller 39 behobenen Audit-Findings + R-NEW-1 + Tool-Audits |
| [`THREAT_MODEL.md`](THREAT_MODEL.md) | Bedrohungsmodell, Angreiferprofile und Sicherheitsannahmen |
| [`RELEASE_PROCESS.md`](RELEASE_PROCESS.md) | Multi-Platform CI/CD Release-Architektur, Toolchain-Pins und Minisign-Signierung |
| [`QUICKSTART.md`](QUICKSTART.md) | Kompakte Schritt-für-Schritt-Anleitung für Endanwender |
| [`INSTALL.md`](INSTALL.md) | Installationsanweisungen (Binaries, Scoop, WinGet, Cargo) |
| [`CHANGELOG.md`](CHANGELOG.md) | Keep-a-Changelog Versionshistorie (aktuell: v0.9.3) |
| [`deny.toml`](deny.toml) | Strikte Konfiguration für `cargo-deny` (Advisories, Bans, Lizenzen, Quellen) |
| [`.gitea/workflows/release.yaml`](.gitea/workflows/release.yaml) | Automatisierte CI/CD Release-Pipeline für Windows & Linux musl |
---
## 4. Richtlinien für Agenten (Quality Gates)
Jede Code- oder Konfigurationsänderung **MUSS** vor einem Release oder Commit folgende Gates erfolgreich und ohne Warnungen durchlaufen:
1. **Formatierung**:
```powershell
cargo fmt --check
```
2. **Statische Code-Analyse (Linter)**:
```powershell
cargo clippy --all-targets -- -D warnings
```
3. **Vollständige Testsuite** (aktuell 136 Tests):
```powershell
cargo test --all
```
4. **Supply-Chain & Lizenz-Governance**:
```powershell
cargo-deny check
```
5. **Secret-Leak-Prävention**:
```powershell
gitleaks detect --verbose
```
*(Erlaubte Test-Mocks in `.gitleaksignore` pflegen).*
---
## 5. Coding-Konventionen
- **Keine Panics im Produktivcode**: Verwende `anyhow::Result`, `context(...)` oder `bail!` anstelle von `.unwrap()` oder `.expect()`.
- **Pfad- und Knotennamens-Sicherheit**: Alle neuen Dateinamen-Operationen müssen `validate_node_name` / `validate_path_safety` durchlaufen (Abweisung von Windows-Reservierungen wie `CON`, `PRN`, ungültigen Zeichen `<>:"/\|?*` und Steuerzeichen).
- **Speichersicherheit**: Alle sensiblen Schlüsselstrukturen müssen `Zeroize` implementieren und mit `Zeroizing<T>` gewrappt werden.
- **PowerShell-Syntax**: Befehle in PowerShell mit `;` verketten (nicht `&&`). Keine `cd`-Befehle verwenden.
+5
View File
@@ -0,0 +1,5 @@
# Antigravity & Gemini Project Context
Die vollständigen Projektrichtlinien, die Verlinkung zur Entstehungs- und Audit-Konversation, die Architektur-Dokumentation sowie die verbindlichen Quality Gates für Sanctum befinden sich in:
👉 **[AGENTS.md](AGENTS.md)**
+8 -2
View File
@@ -81,12 +81,18 @@ $Release = $ExistingReleases | Where-Object { $_.tag_name -eq $TagName }
if (-not $Release) { if (-not $Release) {
$Utf8NoBom = New-Object System.Text.UTF8Encoding($false) $Utf8NoBom = New-Object System.Text.UTF8Encoding($false)
$Changelog = [System.IO.File]::ReadAllText((Join-Path $ProjectRoot "CHANGELOG.md"), $Utf8NoBom) $FullChangelog = [System.IO.File]::ReadAllText((Join-Path $ProjectRoot "CHANGELOG.md"), $Utf8NoBom)
$VersionPattern = "(?s)## \[$([regex]::Escape($Version))\].*?(?=(?:\r?\n## \[|\z))"
if ($FullChangelog -match $VersionPattern) {
$ReleaseBody = $matches[0].Trim()
} else {
$ReleaseBody = $FullChangelog
}
$PayloadPath = Join-Path $DistDir "release_req.json" $PayloadPath = Join-Path $DistDir "release_req.json"
$Payload = @{ $Payload = @{
tag_name = $TagName tag_name = $TagName
name = "Sanctum $TagName (Windows & Linux x86_64)" name = "Sanctum $TagName (Windows & Linux x86_64)"
body = $Changelog body = $ReleaseBody
draft = $false draft = $false
prerelease = $false prerelease = $false
} | ConvertTo-Json -Depth 5 } | ConvertTo-Json -Depth 5