|
| 1 | +From 98bfb71cb38899333deb58dd2562037450fd7fa8 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Joshua Baergen <jbaergen@digitalocean.com> |
| 3 | +Date: Wed, 17 May 2023 12:17:09 -0600 |
| 4 | +Subject: [PATCH] rgw: Fix bucket validation against POST policies |
| 5 | + |
| 6 | +It's possible that user could provide a form part as a part of a POST |
| 7 | +object upload that uses 'bucket' as a key; in this case, it was |
| 8 | +overriding what was being set in the validation env (which is the real |
| 9 | +bucket being modified). The result of this is that a user could actually |
| 10 | +upload to any bucket accessible by the specified access key by matching |
| 11 | +the bucket in the POST policy in said POST form part. |
| 12 | + |
| 13 | +Fix this simply by setting the bucket to the correct value after the |
| 14 | +POST form parts are processed, ignoring the form part above if |
| 15 | +specified. |
| 16 | + |
| 17 | +Fixes: https://tracker.ceph.com/issues/63004 |
| 18 | + |
| 19 | +Signed-off-by: Joshua Baergen <jbaergen@digitalocean.com> |
| 20 | +Signed-off-by: Henry Beberman <henry.beberman@microsoft.com> |
| 21 | +diff -Naur a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc |
| 22 | +--- a/src/rgw/rgw_rest_s3.cc 2022-07-21 17:28:56.000000000 +0000 |
| 23 | ++++ b/src/rgw/rgw_rest_s3.cc 2024-05-17 19:45:54.373135874 +0000 |
| 24 | +@@ -2661,10 +2661,6 @@ |
| 25 | + |
| 26 | + map_qs_metadata(s); |
| 27 | + |
| 28 | +- ldpp_dout(this, 20) << "adding bucket to policy env: " << s->bucket->get_name() |
| 29 | +- << dendl; |
| 30 | +- env.add_var("bucket", s->bucket->get_name()); |
| 31 | +- |
| 32 | + bool done; |
| 33 | + do { |
| 34 | + struct post_form_part part; |
| 35 | +@@ -2715,6 +2711,10 @@ |
| 36 | + env.add_var(part.name, part_str); |
| 37 | + } while (!done); |
| 38 | + |
| 39 | ++ ldpp_dout(this, 20) << "adding bucket to policy env: " << s->bucket->get_name() |
| 40 | ++ << dendl; |
| 41 | ++ env.add_var("bucket", s->bucket->get_name()); |
| 42 | ++ |
| 43 | + string object_str; |
| 44 | + if (!part_str(parts, "key", &object_str)) { |
| 45 | + err_msg = "Key not specified"; |
0 commit comments