mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
apparmor: Fix wrong dentry in RENAME_EXCHANGE uid check
In apparmor_path_rename(), when handling RENAME_EXCHANGE, the
cond_exchange structure is supposed to carry the attributes of the
*new* dentry (since it is used to authorize moving new_dentry to the
old location). However, line 412 reads:
vfsuid = i_uid_into_vfsuid(idmap, d_backing_inode(old_dentry));
This fetches the uid of old_dentry instead of new_dentry. As a result,
the RENAME_EXCHANGE permission check uses the wrong file owner, which
can allow a rename that should be denied (if old_dentry's owner has
more privileges) or deny one that should be allowed.
Note that cond_exchange.mode on the line above correctly uses
new_dentry. Only the uid lookup is wrong.
Fix by changing old_dentry to new_dentry in the i_uid_into_vfsuid call.
Fixes: 5e26a01e56 ("apparmor: use type safe idmapping helpers")
Reviewed-by: Georgia Garcia <georgia.garcia@canonical.com>
Signed-off-by: Dudu Lu <phx0fer@gmail.com>
Signed-off-by: John Johansen <john.johansen@canonical.com>
This commit is contained in:
parent
72971e6f74
commit
ef78fdc472
|
|
@ -410,7 +410,7 @@ static int apparmor_path_rename(const struct path *old_dir, struct dentry *old_d
|
|||
struct path_cond cond_exchange = {
|
||||
.mode = d_backing_inode(new_dentry)->i_mode,
|
||||
};
|
||||
vfsuid = i_uid_into_vfsuid(idmap, d_backing_inode(old_dentry));
|
||||
vfsuid = i_uid_into_vfsuid(idmap, d_backing_inode(new_dentry));
|
||||
cond_exchange.uid = vfsuid_into_kuid(vfsuid);
|
||||
|
||||
error = aa_path_perm(OP_RENAME_SRC, current_cred(),
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user