mirror of
https://github.com/samba-team/samba.git
synced 2025-08-02 00:22:11 +03:00
CVE-2015-5299: s3-shadow-copy2: fix missing access check on snapdir
Fix originally from <partha@exablox.com> https://bugzilla.samba.org/show_bug.cgi?id=11529 Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: David Disseldorp <ddiss@samba.org>
This commit is contained in:
committed by
Stefan Metzmacher
parent
cc137fa386
commit
acbb4ddb68
@ -30,6 +30,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
|
#include "smbd/smbd.h"
|
||||||
#include "system/filesys.h"
|
#include "system/filesys.h"
|
||||||
#include "include/ntioctl.h"
|
#include "include/ntioctl.h"
|
||||||
#include "util_tdb.h"
|
#include "util_tdb.h"
|
||||||
@ -1180,6 +1181,42 @@ static char *have_snapdir(struct vfs_handle_struct *handle,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool check_access_snapdir(struct vfs_handle_struct *handle,
|
||||||
|
const char *path)
|
||||||
|
{
|
||||||
|
struct smb_filename smb_fname;
|
||||||
|
int ret;
|
||||||
|
NTSTATUS status;
|
||||||
|
|
||||||
|
ZERO_STRUCT(smb_fname);
|
||||||
|
smb_fname.base_name = talloc_asprintf(talloc_tos(),
|
||||||
|
"%s",
|
||||||
|
path);
|
||||||
|
if (smb_fname.base_name == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = SMB_VFS_NEXT_STAT(handle, &smb_fname);
|
||||||
|
if (ret != 0 || !S_ISDIR(smb_fname.st.st_ex_mode)) {
|
||||||
|
TALLOC_FREE(smb_fname.base_name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = smbd_check_access_rights(handle->conn,
|
||||||
|
&smb_fname,
|
||||||
|
false,
|
||||||
|
SEC_DIR_LIST);
|
||||||
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
|
DEBUG(0,("user does not have list permission "
|
||||||
|
"on snapdir %s\n",
|
||||||
|
smb_fname.base_name));
|
||||||
|
TALLOC_FREE(smb_fname.base_name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
TALLOC_FREE(smb_fname.base_name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the snapshot directory (if any) for the given
|
* Find the snapshot directory (if any) for the given
|
||||||
* filename (which is relative to the share).
|
* filename (which is relative to the share).
|
||||||
@ -1329,6 +1366,7 @@ static int shadow_copy2_get_shadow_copy_data(
|
|||||||
const char *snapdir;
|
const char *snapdir;
|
||||||
struct dirent *d;
|
struct dirent *d;
|
||||||
TALLOC_CTX *tmp_ctx = talloc_stackframe();
|
TALLOC_CTX *tmp_ctx = talloc_stackframe();
|
||||||
|
bool ret;
|
||||||
|
|
||||||
snapdir = shadow_copy2_find_snapdir(tmp_ctx, handle, fsp->fsp_name);
|
snapdir = shadow_copy2_find_snapdir(tmp_ctx, handle, fsp->fsp_name);
|
||||||
if (snapdir == NULL) {
|
if (snapdir == NULL) {
|
||||||
@ -1338,6 +1376,13 @@ static int shadow_copy2_get_shadow_copy_data(
|
|||||||
talloc_free(tmp_ctx);
|
talloc_free(tmp_ctx);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
ret = check_access_snapdir(handle, snapdir);
|
||||||
|
if (!ret) {
|
||||||
|
DEBUG(0,("access denied on listing snapdir %s\n", snapdir));
|
||||||
|
errno = EACCES;
|
||||||
|
talloc_free(tmp_ctx);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
p = SMB_VFS_NEXT_OPENDIR(handle, snapdir, NULL, 0);
|
p = SMB_VFS_NEXT_OPENDIR(handle, snapdir, NULL, 0);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user