mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-09 14:49:25 +00:00
feat: Add permission verification for account creation (#1401)
Co-authored-by: loverustfs <hello@rustfs.com>
This commit is contained in:
@@ -112,8 +112,6 @@ impl Operation for AddServiceAccount {
|
||||
return Err(s3_error!(InvalidRequest, "iam not init"));
|
||||
};
|
||||
|
||||
let deny_only = constant_time_eq(&cred.access_key, &target_user) || constant_time_eq(&cred.parent_user, &target_user);
|
||||
|
||||
if !iam_store
|
||||
.is_allowed(&Args {
|
||||
account: &cred.access_key,
|
||||
@@ -130,7 +128,7 @@ impl Operation for AddServiceAccount {
|
||||
is_owner: owner,
|
||||
object: "",
|
||||
claims: cred.claims.as_ref().unwrap_or(&HashMap::new()),
|
||||
deny_only,
|
||||
deny_only: false, // Always require explicit Allow permission
|
||||
})
|
||||
.await
|
||||
{
|
||||
|
||||
@@ -118,12 +118,14 @@ impl Operation for AddUser {
|
||||
return Err(s3_error!(InvalidArgument, "access key is not utf8"));
|
||||
}
|
||||
|
||||
let deny_only = ak == cred.access_key;
|
||||
// Security fix: Always require explicit Allow permission for CreateUser
|
||||
// Do not use deny_only to bypass permission checks, even when creating for self
|
||||
// This ensures consistent security semantics and prevents privilege escalation
|
||||
validate_admin_request(
|
||||
&req.headers,
|
||||
&cred,
|
||||
owner,
|
||||
deny_only,
|
||||
false, // Always require explicit Allow permission
|
||||
vec![Action::AdminAction(AdminAction::CreateUserAdminAction)],
|
||||
req.extensions.get::<Option<RemoteAddr>>().and_then(|opt| opt.map(|a| a.0)),
|
||||
)
|
||||
@@ -375,12 +377,14 @@ impl Operation for GetUserInfo {
|
||||
let (cred, owner) =
|
||||
check_key_valid(get_session_token(&req.uri, &req.headers).unwrap_or_default(), &input_cred.access_key).await?;
|
||||
|
||||
let deny_only = ak == cred.access_key;
|
||||
// Security fix: Always require explicit Allow permission for GetUser
|
||||
// Users should have explicit GetUser permission to view account information
|
||||
// This ensures consistent security semantics across all admin operations
|
||||
validate_admin_request(
|
||||
&req.headers,
|
||||
&cred,
|
||||
owner,
|
||||
deny_only,
|
||||
false, // Always require explicit Allow permission
|
||||
vec![Action::AdminAction(AdminAction::GetUserAdminAction)],
|
||||
req.extensions.get::<Option<RemoteAddr>>().and_then(|opt| opt.map(|a| a.0)),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user