From 9d68d638029ed6495f1d98815470db6e8f23229d Mon Sep 17 00:00:00 2001 From: Zhengchao An Date: Tue, 25 Aug 2026 04:34:13 +0800 Subject: [PATCH] test(e2e): fail closed on tampered payloads (#6558) --- crates/e2e_test/src/negative_sigv4_test.rs | 26 +++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/crates/e2e_test/src/negative_sigv4_test.rs b/crates/e2e_test/src/negative_sigv4_test.rs index a6a440383..2a2a02fd8 100644 --- a/crates/e2e_test/src/negative_sigv4_test.rs +++ b/crates/e2e_test/src/negative_sigv4_test.rs @@ -34,6 +34,7 @@ //! rejected header-SigV4 requests. use crate::common::{RustFSTestEnvironment, init_logging, local_http_client}; +use aws_sdk_s3::error::ProvideErrorMetadata; use aws_sdk_s3::primitives::ByteStream; use rustfs_signer::constants::UNSIGNED_PAYLOAD; use rustfs_signer::request_signature_v4::{SIGN_V4_ALGORITHM, get_scope, get_signature, get_signing_key}; @@ -280,7 +281,8 @@ async fn tampered_payload_is_rejected() -> Result<(), Box Result<(), Box { let status = resp.status(); let body = resp.text().await.unwrap_or_default(); - assert_ne!(status.as_u16(), 200, "payload mismatch must not succeed, body:\n{body}"); assert!( - status.is_client_error() || status.is_server_error(), - "payload mismatch must be an error status, got {status}, body:\n{body}" + status.is_client_error(), + "payload mismatch must be rejected with a client error, got {status}, body:\n{body}" ); info!(%status, "tampered payload rejected with error status"); } // A mid-stream hash-mismatch abort surfacing as a transport error is // also a valid rejection (definitely not a 200 success). - Err(err) => info!(%err, "tampered payload rejected via transport error"), + Err(err) => { + assert!(!err.is_connect(), "connection failure is not proof of payload rejection: {err}"); + assert!(!err.is_timeout(), "request timeout is not proof of payload rejection: {err}"); + info!(%err, "tampered payload rejected via mid-stream transport error"); + } } + + let absent = env + .create_s3_client() + .get_object() + .bucket(BUCKET) + .key(key) + .send() + .await + .expect_err("a tampered payload must not publish an object"); + assert_eq!(absent.raw_response().map(|response| response.status().as_u16()), Some(404)); + assert_eq!(absent.as_service_error().and_then(ProvideErrorMetadata::code), Some("NoSuchKey")); Ok(()) }