Fix race condition during Windows directory creation

This commit is contained in:
shreyamalviya 2021-06-10 15:04:56 +05:30
parent b282e5276b
commit 54f5524760
2 changed files with 18 additions and 14 deletions

View File

@ -8,6 +8,8 @@ def is_windows_os() -> bool:
if is_windows_os(): if is_windows_os():
import win32file
import monkey_island.cc.environment.windows_permissions as windows_permissions import monkey_island.cc.environment.windows_permissions as windows_permissions
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -15,11 +17,13 @@ LOG = logging.getLogger(__name__)
def create_secure_directory(path: str, create_parent_dirs: bool): def create_secure_directory(path: str, create_parent_dirs: bool):
if not os.path.isdir(path): if not os.path.isdir(path):
_create_secure_directory(path, create_parent_dirs) if is_windows_os():
set_secure_permissions(path) _create_secure_directory_windows(path)
else:
_create_secure_directory_linux(path, create_parent_dirs)
def _create_secure_directory(path: str, create_parent_dirs: bool): def _create_secure_directory_linux(path: str, create_parent_dirs: bool):
try: try:
if create_parent_dirs: if create_parent_dirs:
# Don't split directory creation and permission setting # Don't split directory creation and permission setting
@ -35,10 +39,13 @@ def _create_secure_directory(path: str, create_parent_dirs: bool):
raise ex raise ex
def set_secure_permissions(dir_path: str): def _create_secure_directory_windows(path: str):
security_descriptor = windows_permissions.get_sd_for_owner_only_perms()
try: try:
if is_windows_os(): win32file.CreateDirectory(path, security_descriptor)
windows_permissions.set_perms_to_owner_only(folder_path=dir_path)
except Exception as ex: except Exception as ex:
LOG.error(f"Permissions could not be set successfully for {dir_path}: {str(ex)}") LOG.error(
f'Could not create a directory at "{path}" (maybe environmental variables could not be '
f"resolved?): {str(ex)}"
)
raise ex raise ex

View File

@ -4,12 +4,10 @@ import win32con
import win32security import win32security
def set_perms_to_owner_only(folder_path: str) -> None: def get_sd_for_owner_only_perms() -> None:
user = get_user_pySID_object() user = get_user_pySID_object()
security_descriptor = win32security.SECURITY_DESCRIPTOR()
security_descriptor = win32security.GetFileSecurity(
folder_path, win32security.DACL_SECURITY_INFORMATION
)
dacl = win32security.ACL() dacl = win32security.ACL()
dacl.AddAccessAllowedAce( dacl.AddAccessAllowedAce(
win32security.ACL_REVISION, win32security.ACL_REVISION,
@ -17,9 +15,8 @@ def set_perms_to_owner_only(folder_path: str) -> None:
user, user,
) )
security_descriptor.SetSecurityDescriptorDacl(1, dacl, 0) security_descriptor.SetSecurityDescriptorDacl(1, dacl, 0)
win32security.SetFileSecurity(
folder_path, win32security.DACL_SECURITY_INFORMATION, security_descriptor return security_descriptor
)
def get_user_pySID_object(): def get_user_pySID_object():