From 96d2a7f0bfb26d36a03975306b4ca7a4acbad5af Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 4 Nov 2022 18:57:18 +0000 Subject: [PATCH 1/3] Assert that encryption preference is still mutual --- src/authres.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/authres.rs b/src/authres.rs index 55a3dc636..51f7eb9fa 100644 --- a/src/authres.rs +++ b/src/authres.rs @@ -357,6 +357,7 @@ mod tests { use super::*; + use crate::aheader::EncryptPreference; use crate::e2ee; use crate::mimeparser; use crate::peerstate::Peerstate; @@ -686,6 +687,9 @@ Authentication-Results: box.hispanilandia.net; spf=pass smtp.mailfrom=adbenitez@ .await? .unwrap(); + // Encryption preference is still mutual. + assert_eq!(bob_state.prefer_encrypt, EncryptPreference::Mutual); + // Also check that the keypair was not changed assert_eq!( bob_state.public_key.unwrap(), From 91ab10084a5b5c8b9fed4bdd589b6db008c4af11 Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 4 Nov 2022 19:45:29 +0000 Subject: [PATCH 2/3] Make error reproducible with sleep() --- src/authres.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/authres.rs b/src/authres.rs index 51f7eb9fa..d1a31636f 100644 --- a/src/authres.rs +++ b/src/authres.rs @@ -666,6 +666,10 @@ Authentication-Results: box.hispanilandia.net; spf=pass smtp.mailfrom=adbenitez@ tcm.section("An attacker, bob2, sends a from-forged email to Alice!"); + // Sleep to make sure key reset is ignored because of DKIM failure + // and not because reordering is suspected. + tokio::time::sleep(std::time::Duration::from_millis(1100)).await; + let bob2 = tcm.unconfigured().await; bob2.configure_addr("bob@example.net").await; e2ee::ensure_secret_key_exists(&bob2).await?; From 037739c6342dd2c80bf6c9b0f28ee1bb957aaf9f Mon Sep 17 00:00:00 2001 From: link2xt Date: Fri, 4 Nov 2022 19:48:11 +0000 Subject: [PATCH 3/3] mimeparser: do not allow key reset if DKIM check failed --- CHANGELOG.md | 1 + src/mimeparser.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bd95e37e..01ccb2e26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ ### Fixes - `dc_search_msgs()` returns unaccepted requests #3694 - emit "contacts changed" event when the contact is no longer "seen recently" #3703 +- do not allow peerstate reset if DKIM check failed #3731 ## 1.98.0 diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 10696e617..c87c627e2 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -298,6 +298,7 @@ impl MimeMessage { if let Some(peerstate) = &mut decryption_info.peerstate { if message_time > peerstate.last_seen_autocrypt && mail.ctype.mimetype != "multipart/report" + && decryption_info.dkim_results.allow_keychange { peerstate.degrade_encryption(message_time); peerstate.save_to_db(&context.sql, false).await?;