1 /* $Id: priv.c,v 1.10 2003/10/12 17:05:50 hbirr Exp $
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;
103 SepPrivilegeCheck (PACCESS_TOKEN Token
,
104 PLUID_AND_ATTRIBUTES Privileges
,
105 ULONG PrivilegeCount
,
106 ULONG PrivilegeControl
,
107 KPROCESSOR_MODE PreviousMode
)
113 DPRINT ("SepPrivilegeCheck() called\n");
115 if (PreviousMode
== KernelMode
)
121 if (PrivilegeCount
> 0)
123 for (i
= 0; i
< Token
->PrivilegeCount
; i
++)
125 for (j
= 0; j
< PrivilegeCount
; j
++)
127 if (Token
->Privileges
[i
].Luid
.LowPart
== Privileges
[j
].Luid
.LowPart
&&
128 Token
->Privileges
[i
].Luid
.HighPart
== Privileges
[j
].Luid
.HighPart
)
130 DPRINT ("Found privilege\n");
131 DPRINT ("Privilege attributes %lx\n",
132 Token
->Privileges
[i
].Attributes
);
134 if (Token
->Privileges
[i
].Attributes
& SE_PRIVILEGE_ENABLED
)
136 Privileges
[j
].Attributes
|= SE_PRIVILEGE_USED_FOR_ACCESS
;
144 if ((PrivilegeControl
& PRIVILEGE_SET_ALL_NECESSARY
) &&
151 !(PrivilegeControl
& PRIVILEGE_SET_ALL_NECESSARY
))
161 SeCaptureLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Src
,
162 ULONG PrivilegeCount
,
163 KPROCESSOR_MODE PreviousMode
,
164 PLUID_AND_ATTRIBUTES AllocatedMem
,
165 ULONG AllocatedLength
,
168 PLUID_AND_ATTRIBUTES
* Dest
,
171 PLUID_AND_ATTRIBUTES
* NewMem
;
174 if (PrivilegeCount
== 0)
178 return STATUS_SUCCESS
;
181 if (PreviousMode
== KernelMode
&& d
== 0)
184 return STATUS_SUCCESS
;
187 SrcLength
= ((PrivilegeCount
* sizeof(LUID_AND_ATTRIBUTES
)) + 3) & 0xfc;
189 if (AllocatedMem
== NULL
)
191 NewMem
= ExAllocatePool (PoolType
,
193 *Dest
= (PLUID_AND_ATTRIBUTES
)NewMem
;
196 return STATUS_UNSUCCESSFUL
;
201 if (SrcLength
> AllocatedLength
)
203 return STATUS_UNSUCCESSFUL
;
205 *Dest
= AllocatedMem
;
207 memmove (*Dest
, Src
, SrcLength
);
209 return STATUS_SUCCESS
;
214 SeReleaseLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Privilege
,
215 KPROCESSOR_MODE PreviousMode
,
218 ExFreePool (Privilege
);
223 NtPrivilegeCheck (IN HANDLE ClientToken
,
224 IN PPRIVILEGE_SET RequiredPrivileges
,
227 PLUID_AND_ATTRIBUTES Privilege
;
229 ULONG PrivilegeCount
;
230 ULONG PrivilegeControl
;
234 Status
= ObReferenceObjectByHandle (ClientToken
,
240 if (!NT_SUCCESS(Status
))
245 if (Token
->TokenType
== TokenImpersonation
&&
246 Token
->ImpersonationLevel
< SecurityAnonymous
)
248 ObDereferenceObject (Token
);
249 return STATUS_UNSUCCESSFUL
;
252 PrivilegeCount
= RequiredPrivileges
->PrivilegeCount
;
253 PrivilegeControl
= RequiredPrivileges
->Control
;
255 Status
= SeCaptureLuidAndAttributesArray (RequiredPrivileges
->Privilege
,
264 if (!NT_SUCCESS(Status
))
266 ObDereferenceObject (Token
);
267 return STATUS_UNSUCCESSFUL
;
270 *Result
= SepPrivilegeCheck (Token
,
276 memmove (RequiredPrivileges
->Privilege
,
280 SeReleaseLuidAndAttributesArray (Privilege
,
284 return STATUS_SUCCESS
;
292 SePrivilegeCheck (PPRIVILEGE_SET Privileges
,
293 PSECURITY_SUBJECT_CONTEXT SubjectContext
,
294 KPROCESSOR_MODE PreviousMode
)
296 PACCESS_TOKEN Token
= NULL
;
298 if (SubjectContext
->ClientToken
== NULL
)
300 Token
= SubjectContext
->PrimaryToken
;
304 Token
= SubjectContext
->ClientToken
;
305 if (SubjectContext
->ImpersonationLevel
< 2)
311 return SepPrivilegeCheck (Token
,
312 Privileges
->Privilege
,
313 Privileges
->PrivilegeCount
,
323 SeSinglePrivilegeCheck (IN LUID PrivilegeValue
,
324 IN KPROCESSOR_MODE PreviousMode
)
326 SECURITY_SUBJECT_CONTEXT SubjectContext
;
330 SeCaptureSubjectContext (&SubjectContext
);
332 Priv
.PrivilegeCount
= 1;
333 Priv
.Control
= PRIVILEGE_SET_ALL_NECESSARY
;
334 Priv
.Privilege
[0].Luid
= PrivilegeValue
;
335 Priv
.Privilege
[0].Attributes
= SE_PRIVILEGE_ENABLED
;
337 Result
= SePrivilegeCheck (&Priv
,
341 if (PreviousMode
!= KernelMode
)
344 SePrivilegedServiceAuditAlarm (0,
350 SeReleaseSubjectContext (&SubjectContext
);