fix: address minor issues for v0.9.1 preparation (K-01 mount verification, path validation, legacy-names warning, V1-V2 migration docs)

This commit is contained in:
2026-09-20 17:08:44 +02:00
parent 3693e03494
commit a252393f96
11 changed files with 379 additions and 5 deletions
+9
View File
@@ -1007,6 +1007,9 @@ impl DavFileSystem for CarrierFs {
}
None => {
if options.create || options.create_new {
crate::pathutil::validate_node_name(file_name)
.map_err(|_| FsError::Forbidden)?;
let parent = inner.resolve_path(parent_path).ok_or(FsError::NotFound)?;
if !parent.is_dir {
return Err(FsError::Forbidden);
@@ -1129,6 +1132,8 @@ impl DavFileSystem for CarrierFs {
return Err(FsError::Forbidden);
}
crate::pathutil::validate_node_name(dir_name).map_err(|_| FsError::Forbidden)?;
if inner.resolve_path(&path_str).is_some() {
return Err(FsError::Exists);
}
@@ -1248,6 +1253,8 @@ impl DavFileSystem for CarrierFs {
return Err(FsError::Forbidden);
}
crate::pathutil::validate_node_name(to_name).map_err(|_| FsError::Forbidden)?;
let to_parent = inner
.resolve_path(to_parent_path)
.ok_or(FsError::NotFound)?;
@@ -1324,6 +1331,8 @@ impl DavFileSystem for CarrierFs {
return Err(FsError::Forbidden);
}
crate::pathutil::validate_node_name(to_name).map_err(|_| FsError::Forbidden)?;
let to_parent = inner
.resolve_path(to_parent_path)
.ok_or(FsError::NotFound)?;
+3 -1
View File
@@ -25,7 +25,7 @@ use sanctum::verify::verify_container;
#[command(about = "Sanctum: Verschlüsselter Ein-Datei-Container unter Windows im reinen Userland", long_about = None)]
#[command(version)]
struct Cli {
/// Erlaubt Legacy-Namensentschlüsselung ohne deterministisches AAD (S-07)
/// SICHERHEITSHINWEIS: Unsicher! Deaktiviert die kryptografische Bindung (AAD) von Dateinamen (Gefahr von Swap-Attacks/Manipulation). Nur zur temporären Migration alter Container verwenden!
#[arg(long, global = true, default_value_t = false)]
legacy_names: bool,
@@ -1591,6 +1591,8 @@ async fn run() -> Result<()> {
if cli.legacy_names {
set_allow_legacy_names(true);
eprintln!("WARNUNG: Das Flag '--legacy-names' ist aktiv. Die kryptografische Authentifizierung von Dateinamen ist geschwächt (Gefahr von Swap-Attacks). Verwenden Sie dieses Flag nur zur Datenmigration!");
tracing::warn!("Flag --legacy-names ist aktiv. Authenticated Associated Data (AAD) fuer Dateinamen ist abgeschwaecht.");
}
match cli.command {
+22
View File
@@ -187,6 +187,28 @@ pub async fn mount_container(
// S-06: Advisory Lock setzen, um parallele Mounts und schreibende Sync-Läufe abzuwehren
let _advisory_lock = db.acquire_advisory_lock_guard(false)?;
// K-01: Metadaten-Integrität via HMAC-SHA256 validieren (Format V3)
if version >= crate::crypto::FORMAT_VERSION_V3 {
match db.verify_metadata_mac_for_slot(vault_id, &dek) {
Ok(true) => {
if !stealth {
println!(
" • Metadaten-MAC: ✔ Integrität erfolgreich verifiziert (HMAC-SHA256)"
);
}
}
Ok(false) => {
bail!(
"Metadaten-MAC-Verifikation fehlgeschlagen: Die Container-Metadaten wurden manipuliert oder sind beschädigt (K-01)."
);
}
Err(e) => {
bail!("Fehler bei der Metadaten-MAC-Verifikation: {e}");
}
}
}
db.set_active_slot_and_dek(vault_id, dek.clone());
// 128-Bit Session-Token für Loopback-Schutz (CWE-306) & Anti-CSRF generieren
let mut token_bytes = [0u8; 16];
rand::RngCore::fill_bytes(&mut rand::rngs::OsRng, &mut token_bytes);
+3
View File
@@ -1245,6 +1245,9 @@ impl DavFileSystem for SanctumFs {
return Err(FsError::Forbidden);
}
validate_path_safety(to_name)?;
crate::pathutil::validate_node_name(to_name).map_err(|_| FsError::Forbidden)?;
let to_parent = self
.resolve_path(to_parent_path)?
.ok_or(FsError::NotFound)?;