From e9be6c3b6fe3c643fcc9563975e5e85a575d55b6 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 04:18:04 +0000 Subject: [PATCH 1/2] Refactor `synthetic_ancestor_acl_rejects_untrusted_modification` test Extract the setup logic (CurrentUser, PSID initialization, and synthetic ACL creation) into a reusable helper function `check_synthetic_ancestor_acl`. This drastically reduces boilerplate code in the main test function and improves readability without altering test coverage. Co-authored-by: undivisible <136312656+undivisible@users.noreply.github.com> --- src/windows_acl.rs | 163 +++++++++++++++++---------------------------- 1 file changed, 60 insertions(+), 103 deletions(-) diff --git a/src/windows_acl.rs b/src/windows_acl.rs index d48f558..befdddb 100644 --- a/src/windows_acl.rs +++ b/src/windows_acl.rs @@ -8,37 +8,37 @@ use std::path::{Path, PathBuf}; use std::ptr; use fs2::FileExt; +use windows::core::{w, PWSTR}; use windows::Win32::Foundation::{ - CloseHandle, ERROR_SUCCESS, GENERIC_ALL, GENERIC_WRITE, HANDLE, HLOCAL, LocalFree, WIN32_ERROR, + CloseHandle, LocalFree, ERROR_SUCCESS, GENERIC_ALL, GENERIC_WRITE, HANDLE, HLOCAL, WIN32_ERROR, }; use windows::Win32::Security::Authorization::{ - ConvertStringSidToSidW, EXPLICIT_ACCESS_W, GetSecurityInfo, SE_FILE_OBJECT, SET_ACCESS, - SetEntriesInAclW, SetSecurityInfo, TRUSTEE_IS_SID, TRUSTEE_IS_USER, TRUSTEE_W, + ConvertStringSidToSidW, GetSecurityInfo, SetEntriesInAclW, SetSecurityInfo, EXPLICIT_ACCESS_W, + SET_ACCESS, SE_FILE_OBJECT, TRUSTEE_IS_SID, TRUSTEE_IS_USER, TRUSTEE_W, }; use windows::Win32::Security::{ - ACCESS_ALLOWED_ACE, ACE_FLAGS, ACE_HEADER, ACL, ACL_SIZE_INFORMATION, AclSizeInformation, - CONTAINER_INHERIT_ACE, DACL_SECURITY_INFORMATION, EqualSid, GetAce, GetAclInformation, - GetSecurityDescriptorControl, GetSecurityDescriptorLength, GetTokenInformation, - INHERIT_ONLY_ACE, IsValidAcl, IsValidSecurityDescriptor, IsValidSid, IsWellKnownSid, - OBJECT_INHERIT_ACE, OWNER_SECURITY_INFORMATION, PROTECTED_DACL_SECURITY_INFORMATION, - PSECURITY_DESCRIPTOR, PSID, SE_DACL_PROTECTED, TOKEN_QUERY, TOKEN_USER, TokenUser, - WinBuiltinAdministratorsSid, WinLocalSystemSid, + AclSizeInformation, EqualSid, GetAce, GetAclInformation, GetSecurityDescriptorControl, + GetSecurityDescriptorLength, GetTokenInformation, IsValidAcl, IsValidSecurityDescriptor, + IsValidSid, IsWellKnownSid, TokenUser, WinBuiltinAdministratorsSid, WinLocalSystemSid, + ACCESS_ALLOWED_ACE, ACE_FLAGS, ACE_HEADER, ACL, ACL_SIZE_INFORMATION, CONTAINER_INHERIT_ACE, + DACL_SECURITY_INFORMATION, INHERIT_ONLY_ACE, OBJECT_INHERIT_ACE, OWNER_SECURITY_INFORMATION, + PROTECTED_DACL_SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, PSID, SE_DACL_PROTECTED, + TOKEN_QUERY, TOKEN_USER, }; use windows::Win32::Storage::FileSystem::{ - BY_HANDLE_FILE_INFORMATION, CreateFileW, DELETE, FILE_ADD_FILE, FILE_ADD_SUBDIRECTORY, - FILE_ALL_ACCESS, FILE_APPEND_DATA, FILE_ATTRIBUTE_DIRECTORY, FILE_ATTRIBUTE_REPARSE_POINT, - FILE_DELETE_CHILD, FILE_FLAG_BACKUP_SEMANTICS, FILE_FLAG_OPEN_REPARSE_POINT, - FILE_FLAG_WRITE_THROUGH, FILE_READ_ATTRIBUTES, FILE_RENAME_INFO, FILE_SHARE_DELETE, - FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_WRITE_DATA, FileRenameInfoEx, - GetFileInformationByHandle, OPEN_EXISTING, READ_CONTROL, ReOpenFile, - SetFileInformationByHandle, WRITE_DAC, WRITE_OWNER, + CreateFileW, FileRenameInfoEx, GetFileInformationByHandle, ReOpenFile, + SetFileInformationByHandle, BY_HANDLE_FILE_INFORMATION, DELETE, FILE_ADD_FILE, + FILE_ADD_SUBDIRECTORY, FILE_ALL_ACCESS, FILE_APPEND_DATA, FILE_ATTRIBUTE_DIRECTORY, + FILE_ATTRIBUTE_REPARSE_POINT, FILE_DELETE_CHILD, FILE_FLAG_BACKUP_SEMANTICS, + FILE_FLAG_OPEN_REPARSE_POINT, FILE_FLAG_WRITE_THROUGH, FILE_READ_ATTRIBUTES, FILE_RENAME_INFO, + FILE_SHARE_DELETE, FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_WRITE_DATA, OPEN_EXISTING, + READ_CONTROL, WRITE_DAC, WRITE_OWNER, }; use windows::Win32::System::SystemServices::{ACCESS_ALLOWED_ACE_TYPE, ACCESS_DENIED_ACE_TYPE}; use windows::Win32::System::Threading::{GetCurrentProcess, OpenProcessToken}; use windows::Win32::System::WindowsProgramming::{ FILE_RENAME_FLAG_POSIX_SEMANTICS, FILE_RENAME_FLAG_REPLACE_IF_EXISTS, }; -use windows::core::{PWSTR, w}; struct OwnedHandle(HANDLE); @@ -882,8 +882,11 @@ mod tests { assert!(ancestor_access_can_replace(GENERIC_WRITE.0, false, true)); } - #[test] - fn synthetic_ancestor_acl_rejects_untrusted_modification() { + fn check_synthetic_ancestor_acl( + mask: u32, + ace_type: Option, + final_target: bool, + ) -> io::Result<()> { let user = CurrentUser::load().expect("current user"); let mut sid = PSID::default(); unsafe { @@ -902,109 +905,63 @@ mod tests { windows::Win32::Security::AddAccessAllowedAce( acl, windows::Win32::Security::ACL_REVISION, - FILE_DELETE_CHILD.0, + mask, sid, ) .expect("add ace"); + if let Some(ace_type) = ace_type { + let mut raw_ace = ptr::null_mut(); + GetAce(acl, 0, &mut raw_ace).expect("get synthetic ace"); + (*raw_ace.cast::()).AceType = ace_type; + } } - assert_eq!( - validate_ancestor_acl( - acl, - storage.as_ptr().cast(), - storage.len() * std::mem::size_of::(), - &user, - false, - false, - ) - .expect_err("reject untrusted replacement grant") - .kind(), - io::ErrorKind::PermissionDenied - ); - let mut raw_ace = ptr::null_mut(); - unsafe { - GetAce(acl, 0, &mut raw_ace).expect("get synthetic ace"); - (*raw_ace.cast::()).Mask = FILE_WRITE_DATA.0; - } - validate_ancestor_acl( + let result = validate_ancestor_acl( acl, storage.as_ptr().cast(), storage.len() * std::mem::size_of::(), &user, false, - false, - ) - .expect("allow untrusted create-only grant on trusted ancestor"); + final_target, + ); + drop(allocation); + result + } + + #[test] + fn synthetic_ancestor_acl_rejects_untrusted_modification() { assert_eq!( - validate_ancestor_acl( - acl, - storage.as_ptr().cast(), - storage.len() * std::mem::size_of::(), - &user, - false, - true, - ) - .expect_err("reject untrusted final write grant") - .kind(), + check_synthetic_ancestor_acl(FILE_DELETE_CHILD.0, None, false) + .expect_err("reject untrusted replacement grant") + .kind(), io::ErrorKind::PermissionDenied ); - unsafe { - (*raw_ace.cast::()).Mask = FILE_APPEND_DATA.0; - } + check_synthetic_ancestor_acl(FILE_WRITE_DATA.0, None, false) + .expect("allow untrusted create-only grant on trusted ancestor"); assert_eq!( - validate_ancestor_acl( - acl, - storage.as_ptr().cast(), - storage.len() * std::mem::size_of::(), - &user, - false, - true, - ) - .expect_err("reject untrusted final append grant") - .kind(), + check_synthetic_ancestor_acl(FILE_WRITE_DATA.0, None, true) + .expect_err("reject untrusted final write grant") + .kind(), io::ErrorKind::PermissionDenied ); - unsafe { - (*raw_ace.cast::()).Mask = GENERIC_WRITE.0; - } assert_eq!( - validate_ancestor_acl( - acl, - storage.as_ptr().cast(), - storage.len() * std::mem::size_of::(), - &user, - false, - true, - ) - .expect_err("reject untrusted final generic write grant") - .kind(), + check_synthetic_ancestor_acl(FILE_APPEND_DATA.0, None, true) + .expect_err("reject untrusted final append grant") + .kind(), io::ErrorKind::PermissionDenied ); - unsafe { - (*raw_ace.cast::()).Mask = READ_CONTROL.0; - } - validate_ancestor_acl( - acl, - storage.as_ptr().cast(), - storage.len() * std::mem::size_of::(), - &user, - false, - true, - ) - .expect("allow untrusted read-only ace"); - unsafe { (*raw_ace.cast::()).AceType = u8::MAX }; assert_eq!( - validate_ancestor_acl( - acl, - storage.as_ptr().cast(), - storage.len() * std::mem::size_of::(), - &user, - false, - true, - ) - .expect_err("reject unknown ace") - .kind(), + check_synthetic_ancestor_acl(GENERIC_WRITE.0, None, true) + .expect_err("reject untrusted final generic write grant") + .kind(), + io::ErrorKind::PermissionDenied + ); + check_synthetic_ancestor_acl(READ_CONTROL.0, None, true) + .expect("allow untrusted read-only ace"); + assert_eq!( + check_synthetic_ancestor_acl(READ_CONTROL.0, Some(u8::MAX), true) + .expect_err("reject unknown ace") + .kind(), io::ErrorKind::PermissionDenied ); - drop(allocation); } } From eb5b69cdd1a223d922d19d56fe01e84769851a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Carter=20=E7=A5=81=E6=98=8E=E6=80=9D?= Date: Fri, 11 Sep 2026 11:40:36 +0800 Subject: [PATCH 2/2] style: rustfmt windows_acl imports --- src/windows_acl.rs | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/windows_acl.rs b/src/windows_acl.rs index befdddb..fadd95e 100644 --- a/src/windows_acl.rs +++ b/src/windows_acl.rs @@ -8,37 +8,37 @@ use std::path::{Path, PathBuf}; use std::ptr; use fs2::FileExt; -use windows::core::{w, PWSTR}; use windows::Win32::Foundation::{ - CloseHandle, LocalFree, ERROR_SUCCESS, GENERIC_ALL, GENERIC_WRITE, HANDLE, HLOCAL, WIN32_ERROR, + CloseHandle, ERROR_SUCCESS, GENERIC_ALL, GENERIC_WRITE, HANDLE, HLOCAL, LocalFree, WIN32_ERROR, }; use windows::Win32::Security::Authorization::{ - ConvertStringSidToSidW, GetSecurityInfo, SetEntriesInAclW, SetSecurityInfo, EXPLICIT_ACCESS_W, - SET_ACCESS, SE_FILE_OBJECT, TRUSTEE_IS_SID, TRUSTEE_IS_USER, TRUSTEE_W, + ConvertStringSidToSidW, EXPLICIT_ACCESS_W, GetSecurityInfo, SE_FILE_OBJECT, SET_ACCESS, + SetEntriesInAclW, SetSecurityInfo, TRUSTEE_IS_SID, TRUSTEE_IS_USER, TRUSTEE_W, }; use windows::Win32::Security::{ - AclSizeInformation, EqualSid, GetAce, GetAclInformation, GetSecurityDescriptorControl, - GetSecurityDescriptorLength, GetTokenInformation, IsValidAcl, IsValidSecurityDescriptor, - IsValidSid, IsWellKnownSid, TokenUser, WinBuiltinAdministratorsSid, WinLocalSystemSid, - ACCESS_ALLOWED_ACE, ACE_FLAGS, ACE_HEADER, ACL, ACL_SIZE_INFORMATION, CONTAINER_INHERIT_ACE, - DACL_SECURITY_INFORMATION, INHERIT_ONLY_ACE, OBJECT_INHERIT_ACE, OWNER_SECURITY_INFORMATION, - PROTECTED_DACL_SECURITY_INFORMATION, PSECURITY_DESCRIPTOR, PSID, SE_DACL_PROTECTED, - TOKEN_QUERY, TOKEN_USER, + ACCESS_ALLOWED_ACE, ACE_FLAGS, ACE_HEADER, ACL, ACL_SIZE_INFORMATION, AclSizeInformation, + CONTAINER_INHERIT_ACE, DACL_SECURITY_INFORMATION, EqualSid, GetAce, GetAclInformation, + GetSecurityDescriptorControl, GetSecurityDescriptorLength, GetTokenInformation, + INHERIT_ONLY_ACE, IsValidAcl, IsValidSecurityDescriptor, IsValidSid, IsWellKnownSid, + OBJECT_INHERIT_ACE, OWNER_SECURITY_INFORMATION, PROTECTED_DACL_SECURITY_INFORMATION, + PSECURITY_DESCRIPTOR, PSID, SE_DACL_PROTECTED, TOKEN_QUERY, TOKEN_USER, TokenUser, + WinBuiltinAdministratorsSid, WinLocalSystemSid, }; use windows::Win32::Storage::FileSystem::{ - CreateFileW, FileRenameInfoEx, GetFileInformationByHandle, ReOpenFile, - SetFileInformationByHandle, BY_HANDLE_FILE_INFORMATION, DELETE, FILE_ADD_FILE, - FILE_ADD_SUBDIRECTORY, FILE_ALL_ACCESS, FILE_APPEND_DATA, FILE_ATTRIBUTE_DIRECTORY, - FILE_ATTRIBUTE_REPARSE_POINT, FILE_DELETE_CHILD, FILE_FLAG_BACKUP_SEMANTICS, - FILE_FLAG_OPEN_REPARSE_POINT, FILE_FLAG_WRITE_THROUGH, FILE_READ_ATTRIBUTES, FILE_RENAME_INFO, - FILE_SHARE_DELETE, FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_WRITE_DATA, OPEN_EXISTING, - READ_CONTROL, WRITE_DAC, WRITE_OWNER, + BY_HANDLE_FILE_INFORMATION, CreateFileW, DELETE, FILE_ADD_FILE, FILE_ADD_SUBDIRECTORY, + FILE_ALL_ACCESS, FILE_APPEND_DATA, FILE_ATTRIBUTE_DIRECTORY, FILE_ATTRIBUTE_REPARSE_POINT, + FILE_DELETE_CHILD, FILE_FLAG_BACKUP_SEMANTICS, FILE_FLAG_OPEN_REPARSE_POINT, + FILE_FLAG_WRITE_THROUGH, FILE_READ_ATTRIBUTES, FILE_RENAME_INFO, FILE_SHARE_DELETE, + FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_WRITE_DATA, FileRenameInfoEx, + GetFileInformationByHandle, OPEN_EXISTING, READ_CONTROL, ReOpenFile, + SetFileInformationByHandle, WRITE_DAC, WRITE_OWNER, }; use windows::Win32::System::SystemServices::{ACCESS_ALLOWED_ACE_TYPE, ACCESS_DENIED_ACE_TYPE}; use windows::Win32::System::Threading::{GetCurrentProcess, OpenProcessToken}; use windows::Win32::System::WindowsProgramming::{ FILE_RENAME_FLAG_POSIX_SEMANTICS, FILE_RENAME_FLAG_REPLACE_IF_EXISTS, }; +use windows::core::{PWSTR, w}; struct OwnedHandle(HANDLE);