Re: Bug in RGW header x-amz-date parsing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sorry for the chain mail - here is the response from AWS: So it is indeed a
bug with RGW - how do we update this?


The format of this header will depend on the signature version that is used
when signing and authenticating requests with AWS. The provided piece of
documentation that uses the RFC 2616 format is only applicable for AWS
Signature Version 2 [1], which is an older version of how AWS authenticates
requests and has been primarily replaced by AWS Signature Version 4. When
using AWS SigV2, the x-amz-date header should be in the RFC 2616 format.
When using AWS Signature Version 4, the x-amz-date header as well as the
timestamp in the String to Sign adheres to the ISO 8601 format [2]. Since
all of our SDKs, including the Go SDK, utilize AWS SigV4 by default, the
x-amz-date is set to the ISO 8601 format. SigV4 is the recommended way of
signing requests to S3, and so I would recommend using SigV4 in your
clients, which will require that the x-amz-date value is formatted
according to ISO 8601. For more information on the overall SigV4 signing
process, as well as signature calculation examples, please see [3-4].

There is also this note in the documentation you referenced
https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAuthentication.html#RESTAuthenticationTimeStamp
 that confirms that is for SigV2:

Note

This topic explains authenticating requests using Signature Version 2.
Amazon S3 now supports the latest Signature Version 4. This latest
signature version is supported in all regions and any new regions after
January 30, 2014 will support only Signature Version 4. For more
information, go to Authenticating Requests (AWS Signature Version 4)
<https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html>
in
the *Amazon Simple Storage Service API Reference*.

Thanks. Subu


On Tue, Jan 4, 2022 at 1:01 PM Subu Sankara Subramanian <
subu.zsked@xxxxxxxxx> wrote:

> Sorry for the late reply - vacation :/
>
> Seems there is some confusion here: the AWS GO SDK sets the format as ISO
> 8601 basic -
> https://github.com/aws/aws-sdk-go/blob/main/aws/signer/v4/v4.go#L84. So I
> don't know where the divergence is happening :(. FWIW the aws go sdk works
> fine against S3 and fails for ceph. A very straightforward repro can be had
> by running
> https://github.com/wasabi-tech/s3-benchmark/blob/master/s3-benchmark.go
> against ceph - Is it possible to see why this is? (FWIW, I have created an
> AWS support case for this internally - I THINK s3 processes both formats, I
> am not sure).
>
> Thanks. Subu
>
> On Sun, Dec 12, 2021 at 12:58 PM Robin H. Johnson <robbat2@xxxxxxxxxx>
> wrote:
>
>> On Tue, Dec 07, 2021 at 12:39:12PM -0500, Casey Bodley wrote:
>> > hi Subu,
>> >
>> > On Tue, Dec 7, 2021 at 12:10 PM Subu Sankara Subramanian
>> > <subu.zsked@xxxxxxxxx> wrote:
>> > >
>> > > Folks,
>> > >
>> > > Is there a bug in ceph RGW date parsing?
>> > > https://github.com/ceph/ceph/blob/master/src/rgw/rgw_auth_s3.cc#L223
>> - this
>> > > line parses the date in x-amz-date as RFC 2616. BUT the format
>> specified by
>> > > Amazon S3 is ISO 8601 basic - YYYYMMDDTHHMMSSZ (
>> > >
>> https://docs.aws.amazon.com/ses/latest/APIReference-V2/CommonParameters.html
>> ).
>> >
>> > this is a link to the Amazon Simple Email Service v2 API, it doesn't
>> > refer to aws v2 signatures. v2 signatures for s3 are documented at
>> >
>> https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAuthentication.html#RESTAuthenticationTimeStamp
>> ,
>> > which states that "The value of the x-amz-date header must be in one
>> > of the RFC 2616 formats (http://www.ietf.org/rfc/rfc2616.txt)."
>> Yes, there is a bug, but it's not the one you're thinking of.
>>
>> The S3 specification says one thing (RFC2616 dates [3]), and AWS's S3
>> implementation does something slightly different:
>> It accepts non-GMT time offsets, and correctly converts them to GMT/UTC.
>>
>> RGW on the other hand has a subtle failure:
>> 1. RFC2616 section 3.3.1 [1]
>>    Specifies that HTTP timestamps must be in GMT.
>> 2. Not all clients follow this, and may send it with other timezones!
>> 3. RGW uses strptime(s, "%a, %d %b %Y %H:%M:%S %z", t) to try and parse
>>    the time.
>> 4. glibc strptime accepts the %z specifier, but discards the value! [2]
>> 5. If the server is set to UTC, and the client sends a non-GMT date,
>>    it will be parsed as if it's in GMT, and thus potentially be offset
>>    by some time (usually a multiple of hours due to the geo-political
>>    nature of timezones).
>> 6. If making a SigV2 request, the timezone used 4th line of the string to
>>    sign (timestamp) is *not* GMT/0000 offset, e.g. "Sun, 12 Dec 2021
>>    12:52:48 -0800", RGW will respond with RequestTimeTooSkewed response.
>>
>> Partial demo for this bug at [4].
>>
>> [1] https://datatracker.ietf.org/doc/html/rfc2616#section-3.3.1
>> [2] https://man7.org/linux/man-pages/man3/strptime.3.html#NOTES
>> [3]
>> https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAuthentication.html#RESTAuthenticationTimeStamp
>> [4] https://gist.github.com/robbat2/930974e21dcdf2b31944f954c46dd904
>>
>> Credit to one of my co-workers, Max Kuznetsov, for finding the initial
>> conditions that lead this bug discovery.
>>
>> --
>> Robin Hugh Johnson
>> Gentoo Linux: Dev, Infra Lead, Foundation Treasurer
>> E-Mail   : robbat2@xxxxxxxxxx
>> GnuPG FP : 11ACBA4F 4778E3F6 E4EDF38E B27B944E 34884E85
>> GnuPG FP : 7D0B3CEB E9B85B1F 825BCECF EE05E6F6 A48F6136
>> _______________________________________________
>> ceph-users mailing list -- ceph-users@xxxxxxx
>> To unsubscribe send an email to ceph-users-leave@xxxxxxx
>>
>
_______________________________________________
ceph-users mailing list -- ceph-users@xxxxxxx
To unsubscribe send an email to ceph-users-leave@xxxxxxx



[Index of Archives]     [Information on CEPH]     [Linux Filesystem Development]     [Ceph Development]     [Ceph Large]     [Ceph Dev]     [Linux USB Development]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [xfs]


  Powered by Linux