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:
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
Reference in New Issue
Block a user