|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
From: Cole Robinson <crobinso@redhat.com>
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
Date: Wed, 9 Mar 2016 12:20:37 -0500
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
Subject: [PATCH] util: virfile: Only setuid for virFileRemove if on NFS
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
NFS with root-squash is the only reason we need to do setuid/setgid
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
crazyness in virFileRemove, so limit that behavior to the NFS case.
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
(cherry picked from commit adefc561cc4c6a007529769c3df286f2ed461684)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
---
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
src/util/virfile.c | 11 +++++++++--
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
1 file changed, 9 insertions(+), 2 deletions(-)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
diff --git a/src/util/virfile.c b/src/util/virfile.c
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
index a913903..0bba850 100644
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
--- a/src/util/virfile.c
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+++ b/src/util/virfile.c
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
@@ -2315,6 +2315,7 @@ virFileOpenAs(const char *path, int openflags, mode_t mode,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
/* virFileRemoveNeedsSetuid:
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+ * @path: file we plan to remove
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
* @uid: file uid to check
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
* @gid: file gid to check
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
*
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
@@ -2322,7 +2323,7 @@ virFileOpenAs(const char *path, int openflags, mode_t mode,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
* owned by the passed uid/gid pair. Needed for NFS with root-squash
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
*/
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
static bool
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
-virFileRemoveNeedsSetuid(uid_t uid, gid_t gid)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+virFileRemoveNeedsSetuid(const char *path, uid_t uid, gid_t gid)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
{
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
/* If running unprivileged, setuid isn't going to work */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
if (geteuid() != 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
@@ -2336,6 +2337,12 @@ virFileRemoveNeedsSetuid(uid_t uid, gid_t gid)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
if (uid == geteuid() && gid == getegid())
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
return false;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+ /* Only perform the setuid stuff for NFS, which is the only case
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+ that may actually need it. This can error, but just be safe and
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+ only check for a clear negative result. */
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+ if (virFileIsSharedFSType(path, VIR_FILE_SHFS_NFS) == 0)
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+ return false;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
return true;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
}
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
@@ -2361,7 +2368,7 @@ virFileRemove(const char *path,
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
gid_t *groups;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
int ngroups;
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
- if (!virFileRemoveNeedsSetuid(uid, gid)) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
+ if (!virFileRemoveNeedsSetuid(path, uid, gid)) {
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
if (virFileIsDir(path))
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
return rmdir(path);
|
|
![](https://seccdn.libravatar.org/avatar/4340cf6494ecc1cee077e78c982aaa258e8ca64ea8e9dc9ff84c26ce8a43f8b1?s=16&d=retro) |
d6cc78 |
else
|