fix(security): implement P3 high-entropy carrier default and P5 manifest capacity guard

This commit is contained in:
2026-09-09 21:33:01 +02:00
parent 771c08ff0f
commit 70d03df676
3 changed files with 30 additions and 6 deletions
+15 -1
View File
@@ -18,7 +18,7 @@ use futures_util::stream;
use rand::rngs::OsRng;
use rand::RngCore;
use serde::{Deserialize, Serialize};
use tracing::error;
use tracing::{error, warn};
use zeroize::{Zeroize, Zeroizing};
use crate::crypto::{decrypt_chunk, encrypt_chunk, CHUNK_SIZE};
@@ -268,6 +268,20 @@ pub struct CarrierFsInner {
impl CarrierFsInner {
pub fn save_manifest(&mut self) -> Result<()> {
let manifest_bytes = serde_json::to_vec(&self.manifest)?;
if manifest_bytes.len() > (crate::crypto::CHUNK_SIZE - 64) {
bail!(
"Carrier-Manifest überschreitet die maximale Blockgröße ({} > {} Bytes).",
manifest_bytes.len(),
crate::crypto::CHUNK_SIZE - 64
);
}
if manifest_bytes.len() > 800_000 {
warn!(
"Carrier-Manifest erreicht 80% der Blockkapazität ({}/{} Bytes)",
manifest_bytes.len(),
crate::crypto::CHUNK_SIZE - 64
);
}
write_carrier_block(
&self.db,
self.carrier_node_id,
+12 -2
View File
@@ -39,8 +39,11 @@ enum Commands {
#[arg(long, default_value_t = false)]
with_hidden: bool,
/// Dateiname der Trägerdatei im Decoy-Vault (Standard: backup_image.iso)
#[arg(long, default_value = "backup_image.iso")]
/// Dateiname der Alibi-Trägerdatei im Decoy-Vault (Standard: system_backup.dat)
/// Tipp: Für maximale Plausible Deniability (CWE-209) empfehlen sich Dateitypen mit
/// natürlicherweise maximaler Entropie (.dat, .bin, .enc, .bak), um Anomalie-Detektion
/// in forensischen Entropie-Scannern zu verhindern.
#[arg(long, default_value = "system_backup.dat")]
carrier_name: String,
/// Größe der Trägerdatei (z. B. 100MB, 500MB, 1GB, 2GB; Standard: 1GB)
@@ -245,6 +248,13 @@ fn handle_init(
if with_hidden {
println!(" Modus: Dual-Vault (Modell A: {})", ui::magenta("Alibi-Carrier"));
println!(" Alibi: {} ({})", ui::cyan(carrier_name), ui::cyan(carrier_size_str));
let lower = carrier_name.to_lowercase();
if lower.ends_with(".iso") || lower.ends_with(".vhd") || lower.ends_with(".img") || lower.ends_with(".zip") {
println!(
" [{}] Hinweis zur Plausible Deniability: Dateitypen wie '.iso' oder '.zip' besitzen ein starres Format. Da Carrier-Blöcke verschlüsselt sind (Entropie ~8.0), empfehlen sich unformatierte Typen wie '.dat', '.bin' oder '.enc' für maximale forensische Unauffälligkeit.",
ui::yellow("Tipp")
);
}
}
println!();
+3 -3
View File
@@ -25,7 +25,7 @@ fn temp_db_path(prefix: &str) -> PathBuf {
async fn test_model_a_carrier_filesystem_and_accounting_attack_resistance() {
let path = temp_db_path("carrier_accounting");
let carrier_size_bytes = 10 * 1024 * 1024; // 10 MB (10 Blöcke à 1 MB)
let carrier_name = "backup_image.iso";
let carrier_name = "system_backup.dat";
let pass_decoy = "DecoyPassword2026!";
let pass_hidden = "SuperSecretHiddenPassword2026!";
@@ -89,7 +89,7 @@ async fn test_model_a_carrier_filesystem_and_accounting_attack_resistance() {
assert_eq!(*auth_hidden.carrier_dek().unwrap(), *dek_0);
assert_eq!(auth_hidden.carrier_node_id(), Some(carrier_node_id));
// 2. Decoy Mount: Schutz der Alibi-Datei (backup_image.iso)
// 2. Decoy Mount: Schutz der Alibi-Datei (system_backup.dat)
let decoy_fs = SanctumFs::with_carrier(
db.clone(),
auth_decoy.dek().clone(),
@@ -100,7 +100,7 @@ async fn test_model_a_carrier_filesystem_and_accounting_attack_resistance() {
0,
);
let carrier_path = DavPath::new("/backup_image.iso").unwrap();
let carrier_path = DavPath::new("/system_backup.dat").unwrap();
// Metadaten der Alibi-Datei im Decoy prüfen
let carrier_meta = decoy_fs.metadata(&carrier_path).await.expect("Carrier meta");