From: Javier M. Mellid Date: Fri, 9 Oct 2015 09:46:07 +0000 (+0200) Subject: rgw: verify Content-MD5 is a valid base64 value X-Git-Tag: v10.1.0~351^2^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c32e5eaa8e94f95f49005126dada6665c5e3356a;p=ceph.git rgw: verify Content-MD5 is a valid base64 value Fixes: #10333 Signed-off-by: Javier M. Mellid --- diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 1f195b5925f0..af2de978b317 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2765,6 +2765,10 @@ int RGW_Auth_S3::authorize_v4_complete(RGWRados *store, struct req_state *s, str } +static inline bool is_base64_for_content_md5(unsigned char c) { + return (isalnum(c) || isspace(c) || (c == '+') || (c == '/') || (c == '=')); +} + /* * handle v4 signatures (rados auth only) */ @@ -3007,6 +3011,14 @@ int RGW_Auth_S3::authorize_v4(RGWRados *store, struct req_state *s) dout(10) << "error getting env var" << dendl; return -EINVAL; } + if (token_env == "HTTP_CONTENT_MD5") { + for (const char *p = t; *p; p++) { + if (!is_base64_for_content_md5(*p)) { + dout(0) << "NOTICE: bad content-md5 provided (not base64), aborting request p=" << *p << " " << (int)*p << dendl; + return -EPERM; + } + } + } string token_value = string(t); canonical_hdrs_map[token] = rgw_trim_whitespace(token_value); }