1 /* $Id: semgr.c,v 1.15 2000/01/26 10:07:30 dwelch Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Security manager
6 * FILE: kernel/se/semgr.c
9 * 26/07/98: Added stubs for security functions
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
16 #include <internal/debug.h>
18 /* FUNCTIONS ***************************************************************/
20 VOID
SepReferenceLogonSession(PLUID AuthenticationId
)
25 VOID
SepDeReferenceLogonSession(PLUID AuthenticationId
)
30 NTSTATUS STDCALL
NtPrivilegedServiceAuditAlarm(
31 IN PUNICODE_STRING SubsystemName
,
32 IN PUNICODE_STRING ServiceName
,
33 IN HANDLE ClientToken
,
34 IN PPRIVILEGE_SET Privileges
,
35 IN BOOLEAN AccessGranted
)
43 NtPrivilegeObjectAuditAlarm (
44 IN PUNICODE_STRING SubsystemName
,
46 IN HANDLE ClientToken
,
47 IN ULONG DesiredAccess
,
48 IN PPRIVILEGE_SET Privileges
,
49 IN BOOLEAN AccessGranted
58 NtOpenObjectAuditAlarm (
59 IN PUNICODE_STRING SubsystemName
,
61 IN POBJECT_ATTRIBUTES ObjectAttributes
,
62 IN HANDLE ClientToken
,
63 IN ULONG DesiredAccess
,
64 IN ULONG GrantedAccess
,
65 IN PPRIVILEGE_SET Privileges
,
66 IN BOOLEAN ObjectCreation
,
67 IN BOOLEAN AccessGranted
,
68 OUT PBOOLEAN GenerateOnClose
76 NtAccessCheckAndAuditAlarm (
77 IN PUNICODE_STRING SubsystemName
,
78 IN PHANDLE ObjectHandle
,
79 IN POBJECT_ATTRIBUTES ObjectAttributes
,
80 IN ACCESS_MASK DesiredAccess
,
81 IN PGENERIC_MAPPING GenericMapping
,
82 IN BOOLEAN ObjectCreation
,
83 OUT PULONG GrantedAccess
,
84 OUT PBOOLEAN AccessStatus
,
85 OUT PBOOLEAN GenerateOnClose
96 PULONG Version
, // ???
104 NTSTATUS STDCALL
NtCloseObjectAuditAlarm(IN PUNICODE_STRING SubsystemName
,
106 IN BOOLEAN GenerateOnClose
)
111 NTSTATUS STDCALL
NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
112 IN HANDLE ClientToken
,
113 IN ACCESS_MASK DesiredAccess
,
114 IN PGENERIC_MAPPING GenericMapping
,
115 OUT PPRIVILEGE_SET PrivilegeSet
,
116 OUT PULONG ReturnLength
,
117 OUT PULONG GrantedAccess
,
118 OUT PBOOLEAN AccessStatus
)
126 NtDeleteObjectAuditAlarm (
127 IN PUNICODE_STRING SubsystemName
,
129 IN BOOLEAN GenerateOnClose
137 VOID STDCALL
SeReleaseSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext
)
139 ObDereferenceObject(SubjectContext
->PrimaryToken
);
140 if (SubjectContext
->ClientToken
!= NULL
)
142 ObDereferenceObject(SubjectContext
->ClientToken
);
146 VOID STDCALL
SeCaptureSubjectContext (PSECURITY_SUBJECT_CONTEXT SubjectContext
)
152 Process
= PsGetCurrentThread()->ThreadsProcess
;
154 SubjectContext
->ProcessAuditId
= Process
;
155 SubjectContext
->ClientToken
=
156 PsReferenceImpersonationToken(PsGetCurrentThread(),
159 &SubjectContext
->ImpersonationLevel
);
160 SubjectContext
->PrimaryToken
= PsReferencePrimaryToken(Process
);
163 NTSTATUS STDCALL
SeDeassignSecurity(PSECURITY_DESCRIPTOR
* SecurityDescriptor
)
165 if ((*SecurityDescriptor
) != NULL
)
167 ExFreePool(*SecurityDescriptor
);
168 (*SecurityDescriptor
) = NULL
;
170 return(STATUS_SUCCESS
);
174 VOID
SepGetDefaultsSubjectContext(PSECURITY_SUBJECT_CONTEXT SubjectContext
,
178 PSID
* ProcessPrimaryGroup
,
183 if (SubjectContext
->ClientToken
!= NULL
)
185 Token
= SubjectContext
->ClientToken
;
189 Token
= SubjectContext
->PrimaryToken
;
191 *Owner
= Token
->UserAndGroups
[Token
->DefaultOwnerIndex
].Sid
;
192 *PrimaryGroup
= Token
->PrimaryGroup
;
193 *DefaultDacl
= Token
->DefaultDacl
;
194 *ProcessOwner
= SubjectContext
->PrimaryToken
->
195 UserAndGroups
[Token
->DefaultOwnerIndex
].Sid
;
196 *ProcessPrimaryGroup
= SubjectContext
->PrimaryToken
->PrimaryGroup
;
199 NTSTATUS
SepInheritAcl(PACL Acl
,
200 BOOLEAN IsDirectoryObject
,
206 PGENERIC_MAPPING GenericMapping
)
210 return(STATUS_UNSUCCESSFUL
);
212 if (Acl
->AclRevision
!= 2 &&
213 Acl
->AclRevision
!= 3 )
215 return(STATUS_UNSUCCESSFUL
);
221 NTSTATUS STDCALL
SeAssignSecurity(PSECURITY_DESCRIPTOR ParentDescriptor
,
222 PSECURITY_DESCRIPTOR ExplicitDescriptor
,
223 PSECURITY_DESCRIPTOR
* NewDescriptor
,
224 BOOLEAN IsDirectoryObject
,
225 PSECURITY_SUBJECT_CONTEXT SubjectContext
,
226 PGENERIC_MAPPING GenericMapping
,
230 PSECURITY_DESCRIPTOR Descriptor
;
235 PSID ProcessPrimaryGroup
;
238 if (ExplicitDescriptor
== NULL
)
240 RtlCreateSecurityDescriptor(&Descriptor
, 1);
244 Descriptor
= ExplicitDescriptor
;
246 SeLockSubjectContext(SubjectContext
);
247 SepGetDefaultsSubjectContext(SubjectContext
,
252 &ProcessPrimaryGroup
);
253 if (Descriptor
->Control
& SE_SACL_PRESENT
||
254 Descriptor
->Control
& SE_SACL_DEFAULTED
)
256 if (ParentDescriptor
== NULL
)
259 if (Descriptor
->Control
& SE_SACL_PRESENT
||
260 Descriptor
->Sacl
== NULL
||)
266 Sacl
= Descriptor
->Sacl
;
267 if (Descriptor
->Control
& SE_SELF_RELATIVE
)
269 Sacl
= (PACL
)(((PVOID
)Sacl
) + (PVOID
)Descriptor
);
285 BOOLEAN
SepSidInToken(PACCESS_TOKEN Token
,
290 if (Token
->UserAndGroupCount
== 0)
295 for (i
=0; i
<Token
->UserAndGroupCount
; i
++)
297 if (RtlEqualSid(Sid
, Token
->UserAndGroups
[i
].Sid
))
300 (!(Token
->UserAndGroups
[i
].Attributes
& SE_GROUP_ENABLED
)))
310 BOOLEAN STDCALL
SeAccessCheck (IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
311 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext
,
312 IN BOOLEAN SubjectContextLocked
,
313 IN ACCESS_MASK DesiredAccess
,
314 IN ACCESS_MASK PreviouslyGrantedAccess
,
315 OUT PPRIVILEGE_SET
* Privileges
,
316 IN PGENERIC_MAPPING GenericMapping
,
317 IN KPROCESSOR_MODE AccessMode
,
318 OUT PACCESS_MODE GrantedAccess
,
319 OUT PNTSTATUS AccessStatus
)
321 * FUNCTION: Determines whether the requested access rights can be granted
322 * to an object protected by a security descriptor and an object owner
324 * SecurityDescriptor = Security descriptor protecting the object
325 * SubjectSecurityContext = Subject's captured security context
326 * SubjectContextLocked = Indicates the user's subject context is locked
327 * DesiredAccess = Access rights the caller is trying to acquire
328 * PreviouslyGrantedAccess = Specified the access rights already granted
330 * GenericMapping = Generic mapping associated with the object
331 * AccessMode = Access mode used for the check
332 * GrantedAccess (OUT) = On return specifies the access granted
333 * AccessStatus (OUT) = Status indicating why access was denied
334 * RETURNS: If access was granted, returns TRUE
344 ACCESS_MASK CurrentAccess
;
346 CurrentAccess
= PreviouslyGrantedAccess
;
349 * Ignore the SACL for now
355 Status
= RtlGetDaclSecurityDescriptor(SecurityDescriptor
,
359 if (!NT_SUCCESS(Status
))
364 CurrentAce
= (PACE
)(Dacl
+ 1);
365 for (i
= 0; i
< Dacl
->AceCount
; i
++)
367 Sid
= (PSID
)(CurrentAce
+ 1);
368 if (CurrentAce
->Header
.AceType
== ACCESS_DENIED_ACE_TYPE
)
370 if (SepSidInToken(SubjectSecurityContext
->ClientToken
, Sid
))
372 *AccessStatus
= STATUS_ACCESS_DENIED
;
374 return(STATUS_SUCCESS
);
377 if (CurrentAce
->Header
.AceType
== ACCESS_ALLOWED_ACE_TYPE
)
379 if (SepSidInToken(SubjectSecurityContext
->ClientToken
, Sid
))
381 CurrentAccess
= CurrentAccess
|
382 CurrentAce
->Header
.AccessMask
;
386 if (!(CurrentAccess
& DesiredAccess
) &&
387 !((~CurrentAccess
) & DesiredAccess
))
389 *AccessStatus
= STATUS_ACCESS_DENIED
;
393 *AccessStatus
= STATUS_SUCCESS
;
395 *GrantedAccess
= CurrentAccess
;
397 return(STATUS_SUCCESS
);