ReactOS 0.4.16-dev-1946-g52006dd
CmSecurity.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPLv2+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite NPFS security test
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8#include <kmt_test.h>
9#include "../ntos_se/se.h"
10
11#define CheckKeySecurity(name, AceCount, ...) CheckKeySecurity_(name, AceCount, __FILE__, __LINE__, ##__VA_ARGS__)
12#define CheckKeySecurity_(name, AceCount, file, line, ...) CheckKeySecurity__(name, AceCount, file ":" KMT_STRINGIZE(line), ##__VA_ARGS__)
13static
14VOID
17 _In_ ULONG AceCount,
18 _In_ PCSTR FileAndLine,
19 ...)
20{
22 UNICODE_STRING KeyNameString;
26 ULONG SecurityDescriptorSize;
27 PSID Owner;
28 PSID Group;
29 PACL Dacl;
30 PACL Sacl;
31 BOOLEAN Present;
32 BOOLEAN Defaulted;
33 va_list Arguments;
34
35 RtlInitUnicodeString(&KeyNameString, KeyName);
37 &KeyNameString,
39 NULL,
40 NULL);
41 Status = ZwOpenKey(&KeyHandle,
45 if (skip(NT_SUCCESS(Status), "No key (%ls)\n", KeyName))
46 {
47 return;
48 }
49
50 Status = ZwQuerySecurityObject(KeyHandle,
52 NULL,
53 0,
54 &SecurityDescriptorSize);
56 if (skip(Status == STATUS_BUFFER_TOO_SMALL, "No security size (%ls)\n", KeyName))
57 {
59 return;
60 }
61
63 SecurityDescriptorSize,
64 'dSmK');
65 ok(SecurityDescriptor != NULL, "Failed to allocate %lu bytes\n", SecurityDescriptorSize);
66 if (skip(SecurityDescriptor != NULL, "No memory for descriptor (%ls)\n", KeyName))
67 {
69 return;
70 }
71
72 Status = ZwQuerySecurityObject(KeyHandle,
75 SecurityDescriptorSize,
76 &SecurityDescriptorSize);
78 if (NT_SUCCESS(Status))
79 {
80 Owner = NULL;
82 &Owner,
83 &Defaulted);
85 ok(Defaulted == FALSE, "Owner defaulted for %ls\n", KeyName);
86
87 Group = NULL;
89 &Group,
90 &Defaulted);
92 ok(Defaulted == FALSE, "Group defaulted for %ls\n", KeyName);
93
94 Dacl = NULL;
96 &Present,
97 &Dacl,
98 &Defaulted);
100 ok(Present == TRUE, "DACL not present for %ls\n", KeyName);
101 ok(Defaulted == FALSE, "DACL defaulted for %ls\n", KeyName);
102 va_start(Arguments, FileAndLine);
103 VCheckAcl__(Dacl, AceCount, FileAndLine, Arguments);
104 va_end(Arguments);
105
106 /* Windows 8+ has SACLs for:
107 * \REGISTRY\MACHINE\SAM
108 * \REGISTRY\MACHINE\SECURITY
109 * \REGISTRY\MACHINE\SOFTWARE
110 * \REGISTRY\MACHINE\SYSTEM
111 * \REGISTRY\USER\.DEFAULT
112 * \REGISTRY\USER\S-1-5-18
113 * \REGISTRY\USER\S-1-5-20
114 *
115 * TODO: Investigate these SACLs and test accordingly.
116 */
118 {
119 Sacl = NULL;
121 &Present,
122 &Sacl,
123 &Defaulted);
125 ok(Present == FALSE, "SACL present for %ls\n", KeyName);
126 ok(Defaulted == FALSE, "SACL defaulted for %ls\n", KeyName);
127 ok(Sacl == NULL, "Sacl is %p for %ls\n", Sacl, KeyName);
128 }
129 }
132}
133
134static void CmSecurity_WS03(PSID TerminalServerSid)
135{
136 CheckKeySecurity(L"\\REGISTRY",
141
142 CheckKeySecurity(L"\\REGISTRY\\MACHINE",
147
148 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\HARDWARE",
153
154 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SAM",
159
160 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SECURITY",
163
164 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SOFTWARE",
180 ACCESS_ALLOWED_ACE_TYPE, 0, TerminalServerSid, KEY_READ | KEY_WRITE | DELETE,
183
184 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SYSTEM",
200
201 CheckKeySecurity(L"\\REGISTRY\\USER",
206
207 CheckKeySecurity(L"\\REGISTRY\\USER\\.DEFAULT",
223
224 CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-18",
240
241 CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-20",
258}
259
260static void CmSecurity_Vista(PSID TerminalServerSid)
261{
262 CheckKeySecurity(L"\\REGISTRY",
267
268 CheckKeySecurity(L"\\REGISTRY\\MACHINE",
273
274 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\HARDWARE",
279
280 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SAM",
293
294 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SECURITY",
297
298 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SOFTWARE",
311
312 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SYSTEM",
325
326 CheckKeySecurity(L"\\REGISTRY\\USER",
331
332 CheckKeySecurity(L"\\REGISTRY\\USER\\.DEFAULT",
345
346 CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-18",
359
360 CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-20",
369}
370
371static void CmSecurity_Win8(PSID TerminalServerSid)
372{
373 CheckKeySecurity(L"\\REGISTRY",
379
380 CheckKeySecurity(L"\\REGISTRY\\MACHINE",
386
387 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\HARDWARE",
393
394 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SAM",
400
401 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SECURITY",
404
405 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SOFTWARE",
411
412 CheckKeySecurity(L"\\REGISTRY\\MACHINE\\SYSTEM",
418
419 CheckKeySecurity(L"\\REGISTRY\\USER",
425
426 CheckKeySecurity(L"\\REGISTRY\\USER\\.DEFAULT",
432
433 CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-18",
439
440 CheckKeySecurity(L"\\REGISTRY\\USER\\S-1-5-20",
450}
451
452START_TEST(CmSecurity)
453{
455 PSID TerminalServerSid;
456
457 TerminalServerSid = ExAllocatePoolWithTag(PagedPool,
459 'iSmK');
460 if (TerminalServerSid != NULL)
461 {
462 RtlInitializeSid(TerminalServerSid, &NtSidAuthority, 1);
463 *RtlSubAuthoritySid(TerminalServerSid, 0) = SECURITY_TERMINAL_SERVER_RID;
464 }
465
466 switch (GetNTVersion())
467 {
469 CmSecurity_WS03(TerminalServerSid);
470 break;
473 CmSecurity_Vista(TerminalServerSid);
474 break;
478 CmSecurity_Win8(TerminalServerSid);
479 break;
480 default:
482 {
483 trace("Unknown NT version (0x%X < 0x%X), running WS03 tests...\n", GetNTVersion(), _WIN32_WINNT_WS03);
484 CmSecurity_WS03(TerminalServerSid);
485 }
486 else
487 {
488 trace("Unknown NT version (0x%X > 0x%X), running latest tests...\n", GetNTVersion(), _WIN32_WINNT_WIN10);
489 CmSecurity_Win8(TerminalServerSid);
490 }
491 break;
492 }
493
494 if (TerminalServerSid != NULL)
495 {
496 ExFreePoolWithTag(TerminalServerSid, 'iSmK');
497 }
498}
static void CmSecurity_WS03(PSID TerminalServerSid)
Definition: CmSecurity.c:134
static void CmSecurity_Vista(PSID TerminalServerSid)
Definition: CmSecurity.c:260
static VOID CheckKeySecurity__(_In_ PCWSTR KeyName, _In_ ULONG AceCount, _In_ PCSTR FileAndLine,...)
Definition: CmSecurity.c:15
#define CheckKeySecurity(name, AceCount,...)
Definition: CmSecurity.c:11
static void CmSecurity_Win8(PSID TerminalServerSid)
Definition: CmSecurity.c:371
unsigned char BOOLEAN
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define ok_eq_hex(value, expected)
Definition: apitest.h:134
#define GetNTVersion()
Definition: apitest.h:17
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
LONG NTSTATUS
Definition: precomp.h:26
@ Group
Definition: help.c:22
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define GENERIC_READ
Definition: compat.h:135
#define L(x)
Definition: resources.c:13
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:25
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
VOID VCheckAcl__(_In_ PACL Acl, _In_ ULONG AceCount, _In_ PCSTR FileAndLine, _In_ va_list Arguments)
Definition: SeHelpers.c:128
#define NO_SIZE
Definition: se.h:29
#define CheckSid(Sid, SidSize, ExpectedSid)
Definition: se.h:31
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
#define KernelMode
Definition: asm.h:38
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL Dacl
Definition: rtlfuncs.h:1625
NTSYSAPI PULONG NTAPI RtlSubAuthoritySid(_In_ PSID Sid, _In_ ULONG SubAuthority)
NTSYSAPI ULONG NTAPI RtlLengthRequiredSid(IN ULONG SubAuthorityCount)
Definition: sid.c:54
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ SaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ OwnerSize PSID Owner
Definition: rtlfuncs.h:1629
NTSYSAPI NTSTATUS NTAPI RtlGetSaclSecurityDescriptor(_In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Out_ PBOOLEAN SaclPresent, _Out_ PACL *Sacl, _Out_ PBOOLEAN SaclDefaulted)
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ SaclSize PACL Sacl
Definition: rtlfuncs.h:1627
NTSYSAPI NTSTATUS NTAPI RtlGetDaclSecurityDescriptor(_In_ PSECURITY_DESCRIPTOR SecurityDescriptor, _Out_ PBOOLEAN DaclPresent, _Out_ PACL *Dacl, _Out_ PBOOLEAN DaclDefaulted)
#define _In_
Definition: no_sal2.h:158
#define WRITE_DAC
Definition: nt_native.h:59
#define ACCESS_SYSTEM_SECURITY
Definition: nt_native.h:77
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define KEY_READ
Definition: nt_native.h:1026
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define GENERIC_ALL
Definition: nt_native.h:92
#define DELETE
Definition: nt_native.h:57
#define KEY_WRITE
Definition: nt_native.h:1034
#define READ_CONTROL
Definition: nt_native.h:58
#define GENERIC_WRITE
Definition: nt_native.h:90
NTSYSAPI NTSTATUS NTAPI RtlGetGroupSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, OUT PSID *Group, OUT PBOOLEAN GroupDefaulted)
Definition: sd.c:280
NTSYSAPI NTSTATUS NTAPI RtlGetOwnerSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor, OUT PSID *Owner, OUT PBOOLEAN OwnerDefaulted)
Definition: sd.c:257
NTSYSAPI NTSTATUS NTAPI RtlInitializeSid(IN OUT PSID Sid, IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, IN UCHAR SubAuthorityCount)
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
static SID_IDENTIFIER_AUTHORITY NtSidAuthority
Definition: samrpc.c:14
#define _WIN32_WINNT_WIN10
Definition: sdkddkver.h:32
#define _WIN32_WINNT_WS03
Definition: sdkddkver.h:23
#define _WIN32_WINNT_WINBLUE
Definition: sdkddkver.h:30
#define _WIN32_WINNT_WIN8
Definition: sdkddkver.h:29
#define _WIN32_WINNT_WIN7
Definition: sdkddkver.h:28
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
PSE_EXPORTS SeExports
Definition: semgr.c:21
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
PSID SeAliasAdminsSid
Definition: setypes.h:1242
PSID SeAllAppPackagesSid
Definition: setypes.h:1274
PSID SeAliasUsersSid
Definition: setypes.h:1243
PSID SeCreatorOwnerSid
Definition: setypes.h:1234
PSID SeRestrictedSid
Definition: setypes.h:1251
PSID SeNetworkServiceSid
Definition: setypes.h:1257
PSID SeWorldSid
Definition: setypes.h:1232
PSID SeAliasPowerUsersSid
Definition: setypes.h:1245
PSID SeLocalSystemSid
Definition: setypes.h:1241
const uint16_t * PCWSTR
Definition: typedefs.h:57
const char * PCSTR
Definition: typedefs.h:52
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2705
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH _In_opt_ PEPROCESS _In_opt_ PETHREAD _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor
Definition: wsk.h:191
#define CONTAINER_INHERIT_ACE
Definition: setypes.h:747
#define INHERIT_ONLY_ACE
Definition: setypes.h:749
#define DACL_SECURITY_INFORMATION
Definition: setypes.h:125
#define ACCESS_ALLOWED_ACE_TYPE
Definition: setypes.h:717
#define OWNER_SECURITY_INFORMATION
Definition: setypes.h:123
#define SECURITY_NT_AUTHORITY
Definition: setypes.h:554
#define OBJECT_INHERIT_ACE
Definition: setypes.h:746
#define SECURITY_TERMINAL_SERVER_RID
Definition: setypes.h:570
#define GROUP_SECURITY_INFORMATION
Definition: setypes.h:124
#define SACL_SECURITY_INFORMATION
Definition: setypes.h:126