3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Security manager
6 * FILE: kernel/se/priv.c
9 * 26/07/98: Added stubs for security functions
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/se.h>
18 #include <internal/debug.h>
21 /* GLOBALS *******************************************************************/
23 LUID SeCreateTokenPrivilege;
24 LUID SeAssignPrimaryTokenPrivilege;
25 LUID SeLockMemoryPrivilege;
26 LUID SeIncreaseQuotaPrivilege;
27 LUID SeUnsolicitedInputPrivilege;
29 LUID SeSecurityPrivilege;
30 LUID SeTakeOwnershipPrivilege;
31 LUID SeLoadDriverPrivilege;
32 LUID SeCreatePagefilePrivilege;
33 LUID SeIncreaseBasePriorityPrivilege;
34 LUID SeSystemProfilePrivilege;
35 LUID SeSystemtimePrivilege;
36 LUID SeProfileSingleProcessPrivilege;
37 LUID SeCreatePermanentPrivilege;
38 LUID SeBackupPrivilege;
39 LUID SeRestorePrivilege;
40 LUID SeShutdownPrivilege;
41 LUID SeDebugPrivilege;
42 LUID SeAuditPrivilege;
43 LUID SeSystemEnvironmentPrivilege;
44 LUID SeChangeNotifyPrivilege;
45 LUID SeRemoteShutdownPrivilege;
48 /* FUNCTIONS ***************************************************************/
51 SepInitPrivileges (VOID)
53 SeCreateTokenPrivilege.LowPart = SE_CREATE_TOKEN_PRIVILEGE;
54 SeCreateTokenPrivilege.HighPart = 0;
55 SeAssignPrimaryTokenPrivilege.LowPart = SE_ASSIGNPRIMARYTOKEN_PRIVILEGE;
56 SeAssignPrimaryTokenPrivilege.HighPart = 0;
57 SeLockMemoryPrivilege.LowPart = SE_LOCK_MEMORY_PRIVILEGE;
58 SeLockMemoryPrivilege.HighPart = 0;
59 SeIncreaseQuotaPrivilege.LowPart = SE_INCREASE_QUOTA_PRIVILEGE;
60 SeIncreaseQuotaPrivilege.HighPart = 0;
61 SeUnsolicitedInputPrivilege.LowPart = SE_UNSOLICITED_INPUT_PRIVILEGE;
62 SeUnsolicitedInputPrivilege.HighPart = 0;
63 SeTcbPrivilege.LowPart = SE_TCB_PRIVILEGE;
64 SeTcbPrivilege.HighPart = 0;
65 SeSecurityPrivilege.LowPart = SE_SECURITY_PRIVILEGE;
66 SeSecurityPrivilege.HighPart = 0;
67 SeTakeOwnershipPrivilege.LowPart = SE_TAKE_OWNERSHIP_PRIVILEGE;
68 SeTakeOwnershipPrivilege.HighPart = 0;
69 SeLoadDriverPrivilege.LowPart = SE_LOAD_DRIVER_PRIVILEGE;
70 SeLoadDriverPrivilege.HighPart = 0;
71 SeSystemProfilePrivilege.LowPart = SE_SYSTEM_PROFILE_PRIVILEGE;
72 SeSystemProfilePrivilege.HighPart = 0;
73 SeSystemtimePrivilege.LowPart = SE_SYSTEMTIME_PRIVILEGE;
74 SeSystemtimePrivilege.HighPart = 0;
75 SeProfileSingleProcessPrivilege.LowPart = SE_PROF_SINGLE_PROCESS_PRIVILEGE;
76 SeProfileSingleProcessPrivilege.HighPart = 0;
77 SeIncreaseBasePriorityPrivilege.LowPart = SE_INC_BASE_PRIORITY_PRIVILEGE;
78 SeIncreaseBasePriorityPrivilege.HighPart = 0;
79 SeCreatePagefilePrivilege.LowPart = SE_CREATE_PAGEFILE_PRIVILEGE;
80 SeCreatePagefilePrivilege.HighPart = 0;
81 SeCreatePermanentPrivilege.LowPart = SE_CREATE_PERMANENT_PRIVILEGE;
82 SeCreatePermanentPrivilege.HighPart = 0;
83 SeBackupPrivilege.LowPart = SE_BACKUP_PRIVILEGE;
84 SeBackupPrivilege.HighPart = 0;
85 SeRestorePrivilege.LowPart = SE_RESTORE_PRIVILEGE;
86 SeRestorePrivilege.HighPart = 0;
87 SeShutdownPrivilege.LowPart = SE_SHUTDOWN_PRIVILEGE;
88 SeShutdownPrivilege.HighPart = 0;
89 SeDebugPrivilege.LowPart = SE_DEBUG_PRIVILEGE;
90 SeDebugPrivilege.HighPart = 0;
91 SeAuditPrivilege.LowPart = SE_AUDIT_PRIVILEGE;
92 SeAuditPrivilege.HighPart = 0;
93 SeSystemEnvironmentPrivilege.LowPart = SE_SYSTEM_ENVIRONMENT_PRIVILEGE;
94 SeSystemEnvironmentPrivilege.HighPart = 0;
95 SeChangeNotifyPrivilege.LowPart = SE_CHANGE_NOTIFY_PRIVILEGE;
96 SeChangeNotifyPrivilege.HighPart = 0;
97 SeRemoteShutdownPrivilege.LowPart = SE_REMOTE_SHUTDOWN_PRIVILEGE;
98 SeRemoteShutdownPrivilege.HighPart = 0;
104 SepPrivilegeCheck (PACCESS_TOKEN Token,
105 PLUID_AND_ATTRIBUTES Privileges,
106 ULONG PrivilegeCount,
107 ULONG PrivilegeControl,
108 KPROCESSOR_MODE PreviousMode)
114 DPRINT ("SepPrivilegeCheck() called\n");
116 if (PreviousMode == KernelMode)
122 if (PrivilegeCount > 0)
124 for (i = 0; i < Token->PrivilegeCount; i++)
126 for (j = 0; j < PrivilegeCount; j++)
128 if (Token->Privileges[i].Luid.LowPart == Privileges[j].Luid.LowPart &&
129 Token->Privileges[i].Luid.HighPart == Privileges[j].Luid.HighPart)
131 DPRINT ("Found privilege\n");
132 DPRINT ("Privilege attributes %lx\n",
133 Token->Privileges[i].Attributes);
135 if (Token->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED)
137 Privileges[j].Attributes |= SE_PRIVILEGE_USED_FOR_ACCESS;
145 if ((PrivilegeControl & PRIVILEGE_SET_ALL_NECESSARY) &&
152 !(PrivilegeControl & PRIVILEGE_SET_ALL_NECESSARY))
162 SeCaptureLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Src,
163 ULONG PrivilegeCount,
164 KPROCESSOR_MODE PreviousMode,
165 PLUID_AND_ATTRIBUTES AllocatedMem,
166 ULONG AllocatedLength,
169 PLUID_AND_ATTRIBUTES* Dest,
172 PLUID_AND_ATTRIBUTES* NewMem;
175 if (PrivilegeCount == 0)
179 return STATUS_SUCCESS;
182 if (PreviousMode == KernelMode && d == 0)
185 return STATUS_SUCCESS;
188 SrcLength = ((PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES)) + 3) & 0xfc;
190 if (AllocatedMem == NULL)
192 NewMem = ExAllocatePool (PoolType,
194 *Dest = (PLUID_AND_ATTRIBUTES)NewMem;
197 return STATUS_UNSUCCESSFUL;
202 if (SrcLength > AllocatedLength)
204 return STATUS_UNSUCCESSFUL;
206 *Dest = AllocatedMem;
208 memmove (*Dest, Src, SrcLength);
210 return STATUS_SUCCESS;
215 SeReleaseLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Privilege,
216 KPROCESSOR_MODE PreviousMode,
219 ExFreePool (Privilege);
224 NtPrivilegeCheck (IN HANDLE ClientToken,
225 IN PPRIVILEGE_SET RequiredPrivileges,
228 PLUID_AND_ATTRIBUTES Privilege;
230 ULONG PrivilegeCount;
231 ULONG PrivilegeControl;
235 Status = ObReferenceObjectByHandle (ClientToken,
241 if (!NT_SUCCESS(Status))
246 if (Token->TokenType == TokenImpersonation &&
247 Token->ImpersonationLevel < SecurityAnonymous)
249 ObDereferenceObject (Token);
250 return STATUS_UNSUCCESSFUL;
253 PrivilegeCount = RequiredPrivileges->PrivilegeCount;
254 PrivilegeControl = RequiredPrivileges->Control;
256 Status = SeCaptureLuidAndAttributesArray (RequiredPrivileges->Privilege,
265 if (!NT_SUCCESS(Status))
267 ObDereferenceObject (Token);
268 return STATUS_UNSUCCESSFUL;
271 *Result = SepPrivilegeCheck (Token,
277 memmove (RequiredPrivileges->Privilege,
281 SeReleaseLuidAndAttributesArray (Privilege,
285 return STATUS_SUCCESS;
293 SePrivilegeCheck (PPRIVILEGE_SET Privileges,
294 PSECURITY_SUBJECT_CONTEXT SubjectContext,
295 KPROCESSOR_MODE PreviousMode)
297 PACCESS_TOKEN Token = NULL;
299 if (SubjectContext->ClientToken == NULL)
301 Token = SubjectContext->PrimaryToken;
305 Token = SubjectContext->ClientToken;
306 if (SubjectContext->ImpersonationLevel < 2)
312 return SepPrivilegeCheck (Token,
313 Privileges->Privilege,
314 Privileges->PrivilegeCount,
324 SeSinglePrivilegeCheck (IN LUID PrivilegeValue,
325 IN KPROCESSOR_MODE PreviousMode)
327 SECURITY_SUBJECT_CONTEXT SubjectContext;
331 SeCaptureSubjectContext (&SubjectContext);
333 Priv.PrivilegeCount = 1;
334 Priv.Control = PRIVILEGE_SET_ALL_NECESSARY;
335 Priv.Privilege[0].Luid = PrivilegeValue;
336 Priv.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED;
338 Result = SePrivilegeCheck (&Priv,
342 if (PreviousMode != KernelMode)
345 SePrivilegedServiceAuditAlarm (0,
351 SeReleaseSubjectContext (&SubjectContext);
356 #endif /* LIBCAPTIVE */