-
Notifications
You must be signed in to change notification settings - Fork 266
Description
Describe the bug
Issue
When using the presign functionality, a new x-amx-checksum-mode
header gets added to the request after its signature, causing validation of presigned URL to fail.
Regression Issue
- Select this option if this issue appears to be a regression.
Expected Behavior
New checksum header gets added before signing, so the signed url is correct.
Current Behavior
When using the presign functionality, a new x-amx-checksum-mode
header gets added to the request after its signature, causing validation to fail with:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Error><Code>AccessDenied</Code>
<Message>There were headers present in the request which were not signed</Message>
<HeadersNotSigned>x-amz-checksum-mode</HeadersNotSigned>
<RequestId>...</RequestId>
<HostId>...</HostId>
</Error>"
Reproduction Steps
I have not extracted a fully running code, can do if necessary, but the gist of it is the following:
let presigning_config = PresigningConfig::builder()
.expires_in(get_expiry())
.build()
.unwrap();
let request = self.client
.get_object()
.bucket(bucket_name)
.key(key)
.request_payer(RequestPayer::Requester)
.presigned(presigning_config)
.await?;
// request.headers() has `x-amz-request-payer` and `x-amz-checksum-mode` headers
Trying to access the signed URL now fails with the error above, which seems to imply that its signature happens before addition of the x-amz-checksum-mode
header.
I have looked at #1246 , which also seems to be related to a late addition of the header.
Possible Solution
I think the HttpResponseChecksumDecorator
runs after the PreSigningInterceptor
.
Short term solution would be to ensure that PreSigningInterceptor runs last, or alternatively have it somehow "freeze" the headers/payload, making it read-only, so that future similar regressions don't happen.
A short term workaround in our case is to set the checksum config to WhenRequired
to prevent decoration with the new header. Another solution is to manually remove the newly-added header from the presigned request (at the risk of having again verification failure once the header is properly included in the signature). But this is a local hack-ish workaround, not a proper fix of the s3 sdk.
Version
Versions used
├── aws-config v1.5.14
│ ├── aws-credential-types v1.2.1
│ │ ├── aws-smithy-async v1.2.4
│ │ ├── aws-smithy-runtime-api v1.7.3
│ │ │ ├── aws-smithy-async v1.2.4 (*)
│ │ │ ├── aws-smithy-types v1.2.12
│ │ ├── aws-smithy-types v1.2.12 (*)
│ ├── aws-runtime v1.5.4
│ │ ├── aws-credential-types v1.2.1 (*)
│ │ ├── aws-sigv4 v1.2.7
│ │ │ ├── aws-credential-types v1.2.1 (*)
│ │ │ ├── aws-smithy-eventstream v0.60.6
│ │ │ │ ├── aws-smithy-types v1.2.12 (*)
│ │ │ ├── aws-smithy-http v0.60.12
│ │ │ │ ├── aws-smithy-eventstream v0.60.6 (*)
│ │ │ │ ├── aws-smithy-runtime-api v1.7.3 (*)
│ │ │ │ ├── aws-smithy-types v1.2.12 (*)
│ │ │ ├── aws-smithy-runtime-api v1.7.3 (*)
│ │ │ ├── aws-smithy-types v1.2.12 (*)
│ │ ├── aws-smithy-async v1.2.4 (*)
│ │ ├── aws-smithy-eventstream v0.60.6 (*)
│ │ ├── aws-smithy-http v0.60.12 (*)
│ │ ├── aws-smithy-runtime v1.7.7
│ │ │ ├── aws-smithy-async v1.2.4 (*)
│ │ │ ├── aws-smithy-http v0.60.12 (*)
│ │ │ ├── aws-smithy-runtime-api v1.7.3 (*)
│ │ │ ├── aws-smithy-types v1.2.12 (*)
│ │ ├── aws-smithy-runtime-api v1.7.3 (*)
│ │ ├── aws-smithy-types v1.2.12 (*)
│ │ ├── aws-types v1.3.4
│ │ │ ├── aws-credential-types v1.2.1 (*)
│ │ │ ├── aws-smithy-async v1.2.4 (*)
│ │ │ ├── aws-smithy-runtime-api v1.7.3 (*)
│ │ │ ├── aws-smithy-types v1.2.12 (*)
│ ├── aws-sdk-sso v1.55.0
│ │ ├── aws-credential-types v1.2.1 (*)
│ │ ├── aws-runtime v1.5.4 (*)
│ │ ├── aws-smithy-async v1.2.4 (*)
│ │ ├── aws-smithy-http v0.60.12 (*)
│ │ ├── aws-smithy-json v0.61.2
│ │ │ └── aws-smithy-types v1.2.12 (*)
│ │ ├── aws-smithy-runtime v1.7.7 (*)
│ │ ├── aws-smithy-runtime-api v1.7.3 (*)
│ │ ├── aws-smithy-types v1.2.12 (*)
│ │ ├── aws-types v1.3.4 (*)
│ ├── aws-sdk-ssooidc v1.56.0
│ │ ├── aws-credential-types v1.2.1 (*)
│ │ ├── aws-runtime v1.5.4 (*)
│ │ ├── aws-smithy-async v1.2.4 (*)
│ │ ├── aws-smithy-http v0.60.12 (*)
│ │ ├── aws-smithy-json v0.61.2 (*)
│ │ ├── aws-smithy-runtime v1.7.7 (*)
│ │ ├── aws-smithy-runtime-api v1.7.3 (*)
│ │ ├── aws-smithy-types v1.2.12 (*)
│ │ ├── aws-types v1.3.4 (*)
│ ├── aws-sdk-sts v1.56.0
│ │ ├── aws-credential-types v1.2.1 (*)
│ │ ├── aws-runtime v1.5.4 (*)
│ │ ├── aws-smithy-async v1.2.4 (*)
│ │ ├── aws-smithy-http v0.60.12 (*)
│ │ ├── aws-smithy-json v0.61.2 (*)
│ │ ├── aws-smithy-query v0.60.7
│ │ │ ├── aws-smithy-types v1.2.12 (*)
│ │ ├── aws-smithy-runtime v1.7.7 (*)
│ │ ├── aws-smithy-runtime-api v1.7.3 (*)
│ │ ├── aws-smithy-types v1.2.12 (*)
│ │ ├── aws-smithy-xml v0.60.9
│ │ ├── aws-types v1.3.4 (*)
│ ├── aws-smithy-async v1.2.4 (*)
│ ├── aws-smithy-http v0.60.12 (*)
│ ├── aws-smithy-json v0.61.2 (*)
│ ├── aws-smithy-runtime v1.7.7 (*)
│ ├── aws-smithy-runtime-api v1.7.3 (*)
│ ├── aws-smithy-types v1.2.12 (*)
│ ├── aws-types v1.3.4 (*)
├── aws-credential-types v1.2.1 (*)
├── aws-sdk-s3 v1.70.0
│ ├── aws-credential-types v1.2.1 (*)
│ ├── aws-runtime v1.5.4 (*)
│ ├── aws-sigv4 v1.2.7 (*)
│ ├── aws-smithy-async v1.2.4 (*)
│ ├── aws-smithy-checksums v0.62.0
│ │ ├── aws-smithy-http v0.60.12 (*)
│ │ ├── aws-smithy-types v1.2.12 (*)
│ ├── aws-smithy-eventstream v0.60.6 (*)
│ ├── aws-smithy-http v0.60.12 (*)
│ ├── aws-smithy-json v0.61.2 (*)
│ ├── aws-smithy-runtime v1.7.7 (*)
│ ├── aws-smithy-runtime-api v1.7.3 (*)
│ ├── aws-smithy-types v1.2.12 (*)
│ ├── aws-smithy-xml v0.60.9 (*)
│ ├── aws-types v1.3.4 (*)
├── aws-smithy-runtime-api v1.7.3 (*)
├── aws-smithy-types v1.2.12 (*)
├── aws-types v1.3.4 (*)
Environment details (OS name and version, etc.)
Linux 6.8.0-51-generic-Ubuntu SMP PREEMPT_DYNAMIC x86_64 x86_64 x86_64 GNU/Linux