3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/se/priv.c
6 * PURPOSE: Security manager
8 * PROGRAMMERS: No programmer listed.
11 /* INCLUDES *****************************************************************/
15 #include <internal/debug.h>
18 /* GLOBALS *******************************************************************/
20 LUID SeCreateTokenPrivilege
;
21 LUID SeAssignPrimaryTokenPrivilege
;
22 LUID SeLockMemoryPrivilege
;
23 LUID SeIncreaseQuotaPrivilege
;
24 LUID SeUnsolicitedInputPrivilege
;
26 LUID SeSecurityPrivilege
;
27 LUID SeTakeOwnershipPrivilege
;
28 LUID SeLoadDriverPrivilege
;
29 LUID SeCreatePagefilePrivilege
;
30 LUID SeIncreaseBasePriorityPrivilege
;
31 LUID SeSystemProfilePrivilege
;
32 LUID SeSystemtimePrivilege
;
33 LUID SeProfileSingleProcessPrivilege
;
34 LUID SeCreatePermanentPrivilege
;
35 LUID SeBackupPrivilege
;
36 LUID SeRestorePrivilege
;
37 LUID SeShutdownPrivilege
;
38 LUID SeDebugPrivilege
;
39 LUID SeAuditPrivilege
;
40 LUID SeSystemEnvironmentPrivilege
;
41 LUID SeChangeNotifyPrivilege
;
42 LUID SeRemoteShutdownPrivilege
;
43 LUID SeUndockPrivilege
;
44 LUID SeSyncAgentPrivilege
;
45 LUID SeEnableDelegationPrivilege
;
48 /* FUNCTIONS ***************************************************************/
53 SepInitPrivileges (VOID
)
55 SeCreateTokenPrivilege
.LowPart
= SE_CREATE_TOKEN_PRIVILEGE
;
56 SeCreateTokenPrivilege
.HighPart
= 0;
57 SeAssignPrimaryTokenPrivilege
.LowPart
= SE_ASSIGNPRIMARYTOKEN_PRIVILEGE
;
58 SeAssignPrimaryTokenPrivilege
.HighPart
= 0;
59 SeLockMemoryPrivilege
.LowPart
= SE_LOCK_MEMORY_PRIVILEGE
;
60 SeLockMemoryPrivilege
.HighPart
= 0;
61 SeIncreaseQuotaPrivilege
.LowPart
= SE_INCREASE_QUOTA_PRIVILEGE
;
62 SeIncreaseQuotaPrivilege
.HighPart
= 0;
63 SeUnsolicitedInputPrivilege
.LowPart
= SE_UNSOLICITED_INPUT_PRIVILEGE
;
64 SeUnsolicitedInputPrivilege
.HighPart
= 0;
65 SeTcbPrivilege
.LowPart
= SE_TCB_PRIVILEGE
;
66 SeTcbPrivilege
.HighPart
= 0;
67 SeSecurityPrivilege
.LowPart
= SE_SECURITY_PRIVILEGE
;
68 SeSecurityPrivilege
.HighPart
= 0;
69 SeTakeOwnershipPrivilege
.LowPart
= SE_TAKE_OWNERSHIP_PRIVILEGE
;
70 SeTakeOwnershipPrivilege
.HighPart
= 0;
71 SeLoadDriverPrivilege
.LowPart
= SE_LOAD_DRIVER_PRIVILEGE
;
72 SeLoadDriverPrivilege
.HighPart
= 0;
73 SeSystemProfilePrivilege
.LowPart
= SE_SYSTEM_PROFILE_PRIVILEGE
;
74 SeSystemProfilePrivilege
.HighPart
= 0;
75 SeSystemtimePrivilege
.LowPart
= SE_SYSTEMTIME_PRIVILEGE
;
76 SeSystemtimePrivilege
.HighPart
= 0;
77 SeProfileSingleProcessPrivilege
.LowPart
= SE_PROF_SINGLE_PROCESS_PRIVILEGE
;
78 SeProfileSingleProcessPrivilege
.HighPart
= 0;
79 SeIncreaseBasePriorityPrivilege
.LowPart
= SE_INC_BASE_PRIORITY_PRIVILEGE
;
80 SeIncreaseBasePriorityPrivilege
.HighPart
= 0;
81 SeCreatePagefilePrivilege
.LowPart
= SE_CREATE_PAGEFILE_PRIVILEGE
;
82 SeCreatePagefilePrivilege
.HighPart
= 0;
83 SeCreatePermanentPrivilege
.LowPart
= SE_CREATE_PERMANENT_PRIVILEGE
;
84 SeCreatePermanentPrivilege
.HighPart
= 0;
85 SeBackupPrivilege
.LowPart
= SE_BACKUP_PRIVILEGE
;
86 SeBackupPrivilege
.HighPart
= 0;
87 SeRestorePrivilege
.LowPart
= SE_RESTORE_PRIVILEGE
;
88 SeRestorePrivilege
.HighPart
= 0;
89 SeShutdownPrivilege
.LowPart
= SE_SHUTDOWN_PRIVILEGE
;
90 SeShutdownPrivilege
.HighPart
= 0;
91 SeDebugPrivilege
.LowPart
= SE_DEBUG_PRIVILEGE
;
92 SeDebugPrivilege
.HighPart
= 0;
93 SeAuditPrivilege
.LowPart
= SE_AUDIT_PRIVILEGE
;
94 SeAuditPrivilege
.HighPart
= 0;
95 SeSystemEnvironmentPrivilege
.LowPart
= SE_SYSTEM_ENVIRONMENT_PRIVILEGE
;
96 SeSystemEnvironmentPrivilege
.HighPart
= 0;
97 SeChangeNotifyPrivilege
.LowPart
= SE_CHANGE_NOTIFY_PRIVILEGE
;
98 SeChangeNotifyPrivilege
.HighPart
= 0;
99 SeRemoteShutdownPrivilege
.LowPart
= SE_REMOTE_SHUTDOWN_PRIVILEGE
;
100 SeRemoteShutdownPrivilege
.HighPart
= 0;
101 SeUndockPrivilege
.LowPart
= SE_UNDOCK_PRIVILEGE
;
102 SeUndockPrivilege
.HighPart
= 0;
103 SeSyncAgentPrivilege
.LowPart
= SE_SYNC_AGENT_PRIVILEGE
;
104 SeSyncAgentPrivilege
.HighPart
= 0;
105 SeEnableDelegationPrivilege
.LowPart
= SE_ENABLE_DELEGATION_PRIVILEGE
;
106 SeEnableDelegationPrivilege
.HighPart
= 0;
112 SepPrivilegeCheck (PTOKEN Token
,
113 PLUID_AND_ATTRIBUTES Privileges
,
114 ULONG PrivilegeCount
,
115 ULONG PrivilegeControl
,
116 KPROCESSOR_MODE PreviousMode
)
122 DPRINT ("SepPrivilegeCheck() called\n");
126 if (PreviousMode
== KernelMode
)
132 if (PrivilegeCount
> 0)
134 for (i
= 0; i
< Token
->PrivilegeCount
; i
++)
136 for (j
= 0; j
< PrivilegeCount
; j
++)
138 if (Token
->Privileges
[i
].Luid
.LowPart
== Privileges
[j
].Luid
.LowPart
&&
139 Token
->Privileges
[i
].Luid
.HighPart
== Privileges
[j
].Luid
.HighPart
)
141 DPRINT ("Found privilege\n");
142 DPRINT ("Privilege attributes %lx\n",
143 Token
->Privileges
[i
].Attributes
);
145 if (Token
->Privileges
[i
].Attributes
& SE_PRIVILEGE_ENABLED
)
147 Privileges
[j
].Attributes
|= SE_PRIVILEGE_USED_FOR_ACCESS
;
155 if ((PrivilegeControl
& PRIVILEGE_SET_ALL_NECESSARY
) &&
162 !(PrivilegeControl
& PRIVILEGE_SET_ALL_NECESSARY
))
173 SeCaptureLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Src
,
174 ULONG PrivilegeCount
,
175 KPROCESSOR_MODE PreviousMode
,
176 PLUID_AND_ATTRIBUTES AllocatedMem
,
177 ULONG AllocatedLength
,
180 PLUID_AND_ATTRIBUTES
* Dest
,
183 PLUID_AND_ATTRIBUTES
* NewMem
;
188 if (PrivilegeCount
== 0)
192 return STATUS_SUCCESS
;
195 if (PreviousMode
== KernelMode
&& d
== 0)
198 return STATUS_SUCCESS
;
201 SrcLength
= ((PrivilegeCount
* sizeof(LUID_AND_ATTRIBUTES
)) + 3) & 0xfc;
203 if (AllocatedMem
== NULL
)
205 NewMem
= ExAllocatePool (PoolType
,
207 *Dest
= (PLUID_AND_ATTRIBUTES
)NewMem
;
210 return STATUS_UNSUCCESSFUL
;
215 if (SrcLength
> AllocatedLength
)
217 return STATUS_UNSUCCESSFUL
;
219 *Dest
= AllocatedMem
;
221 memmove (*Dest
, Src
, SrcLength
);
223 return STATUS_SUCCESS
;
229 SeReleaseLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Privilege
,
230 KPROCESSOR_MODE PreviousMode
,
235 ExFreePool (Privilege
);
240 NtPrivilegeCheck (IN HANDLE ClientToken
,
241 IN PPRIVILEGE_SET RequiredPrivileges
,
244 PLUID_AND_ATTRIBUTES Privilege
;
246 ULONG PrivilegeCount
;
247 ULONG PrivilegeControl
;
253 Status
= ObReferenceObjectByHandle (ClientToken
,
259 if (!NT_SUCCESS(Status
))
264 if (Token
->TokenType
== TokenImpersonation
&&
265 Token
->ImpersonationLevel
< SecurityAnonymous
)
267 ObDereferenceObject (Token
);
268 return STATUS_UNSUCCESSFUL
;
271 PrivilegeCount
= RequiredPrivileges
->PrivilegeCount
;
272 PrivilegeControl
= RequiredPrivileges
->Control
;
274 Status
= SeCaptureLuidAndAttributesArray (RequiredPrivileges
->Privilege
,
283 if (!NT_SUCCESS(Status
))
285 ObDereferenceObject (Token
);
286 return STATUS_UNSUCCESSFUL
;
289 *Result
= SepPrivilegeCheck (Token
,
295 memmove (RequiredPrivileges
->Privilege
,
299 SeReleaseLuidAndAttributesArray (Privilege
,
303 return STATUS_SUCCESS
;
311 SePrivilegeCheck (PPRIVILEGE_SET Privileges
,
312 PSECURITY_SUBJECT_CONTEXT SubjectContext
,
313 KPROCESSOR_MODE PreviousMode
)
315 PACCESS_TOKEN Token
= NULL
;
319 if (SubjectContext
->ClientToken
== NULL
)
321 Token
= SubjectContext
->PrimaryToken
;
325 Token
= SubjectContext
->ClientToken
;
326 if (SubjectContext
->ImpersonationLevel
< 2)
332 return SepPrivilegeCheck (Token
,
333 Privileges
->Privilege
,
334 Privileges
->PrivilegeCount
,
344 SeSinglePrivilegeCheck (IN LUID PrivilegeValue
,
345 IN KPROCESSOR_MODE PreviousMode
)
347 SECURITY_SUBJECT_CONTEXT SubjectContext
;
353 SeCaptureSubjectContext (&SubjectContext
);
355 Priv
.PrivilegeCount
= 1;
356 Priv
.Control
= PRIVILEGE_SET_ALL_NECESSARY
;
357 Priv
.Privilege
[0].Luid
= PrivilegeValue
;
358 Priv
.Privilege
[0].Attributes
= SE_PRIVILEGE_ENABLED
;
360 Result
= SePrivilegeCheck (&Priv
,
364 if (PreviousMode
!= KernelMode
)
367 SePrivilegedServiceAuditAlarm (0,
373 SeReleaseSubjectContext (&SubjectContext
);