Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

759 lines
18 KiB

  1. /*++
  2. Copyright (c) 1989 Microsoft Corporation
  3. Module Name:
  4. sep.h
  5. Abstract:
  6. This module contains the internal (private) declarations needed by the
  7. Kernel mode security routines.
  8. Author:
  9. Gary Kimura (GaryKi) 31-Mar-1989
  10. Jim Kelly (JimK) 2-Mar-1990
  11. Revision History:
  12. --*/
  13. #ifndef _SEP_
  14. #define _SEP_
  15. #include "ntos.h"
  16. #include <ntrmlsa.h>
  17. #include "seopaque.h"
  18. /////////////////////////////////////////////////////////////////////////
  19. // //
  20. // SE Diagnostics //
  21. // //
  22. /////////////////////////////////////////////////////////////////////////
  23. #if DBG
  24. #define SE_DIAGNOSTICS_ENABLED 1
  25. #endif // DBG
  26. //
  27. // These definitions are useful diagnostics aids
  28. //
  29. #if SE_DIAGNOSTICS_ENABLED
  30. //
  31. // Test for enabled diagnostic
  32. //
  33. #define IF_SE_GLOBAL( FlagName ) \
  34. if (SeGlobalFlag & (SE_DIAG_##FlagName))
  35. //
  36. // Diagnostics print statement
  37. //
  38. #define SeDiagPrint( FlagName, _Text_ ) \
  39. IF_SE_GLOBAL( FlagName ) \
  40. DbgPrint _Text_
  41. #else
  42. //
  43. // diagnostics not enabled - No diagnostics included in build
  44. //
  45. //
  46. // Test for diagnostics enabled
  47. //
  48. #define IF_SE_GLOBAL( FlagName ) if (FALSE)
  49. //
  50. // Diagnostics print statement (expands to no-op)
  51. //
  52. #define SeDiagPrint( FlagName, _Text_ ) ;
  53. #endif // SE_DIAGNOSTICS_ENABLED
  54. //
  55. // The following flags enable or disable various diagnostic
  56. // capabilities within SE code. These flags are set in
  57. // SeGlobalFlag (only available within a DBG system).
  58. //
  59. // SD_TRACKING - Display information about create/deletion of
  60. // shared security descriptors
  61. //
  62. //
  63. #define SE_DIAG_SD_TRACKING ((ULONG) 0x00000001L)
  64. //
  65. // Control flag manipulation macros
  66. //
  67. //
  68. // Macro to query whether or not control flags ALL on
  69. // or not (ie, returns FALSE if any of the flags are not set)
  70. //
  71. #define SepAreFlagsSet( Mask, Bits ) \
  72. ( \
  73. ((Mask) & ( Bits )) == ( Bits ) \
  74. )
  75. //
  76. // Macro to set the specified control bits in the given Security Descriptor
  77. //
  78. #define SepSetFlags( Mask, Bits ) \
  79. ( \
  80. ( Mask ) |= ( Bits ) \
  81. )
  82. //
  83. // Macro to clear the passed control bits in the given Security Descriptor
  84. //
  85. #define SepClearFlags( Mask, Bits ) \
  86. ( \
  87. ( Mask ) &= ~( Bits ) \
  88. )
  89. //
  90. // Macro to determine the size of a PRIVILEGE_SET
  91. //
  92. #define SepPrivilegeSetSize( PrivilegeSet ) \
  93. ( ( PrivilegeSet ) == NULL ? 0 : \
  94. ((( PrivilegeSet )->PrivilegeCount > 0) \
  95. ? \
  96. ((ULONG)sizeof(PRIVILEGE_SET) + \
  97. ( \
  98. (( PrivilegeSet )->PrivilegeCount - ANYSIZE_ARRAY) * \
  99. (ULONG)sizeof(LUID_AND_ATTRIBUTES) \
  100. ) \
  101. ) \
  102. : ((ULONG)sizeof(PRIVILEGE_SET) - (ULONG)sizeof(LUID_AND_ATTRIBUTES)) \
  103. ))
  104. //
  105. // Return the effective token from a SecurityContext
  106. //
  107. #define EffectiveToken( SubjectSecurityContext ) ( \
  108. (SubjectSecurityContext)->ClientToken ? \
  109. (SubjectSecurityContext)->ClientToken : \
  110. (SubjectSecurityContext)->PrimaryToken \
  111. ) \
  112. //
  113. // Return a pointer to the Sid of the User of a given token
  114. //
  115. #define SepTokenUserSid( Token ) ((PTOKEN)(Token))->UserAndGroups->Sid
  116. //
  117. // Return the AuthenticationId from a given token
  118. //
  119. #define SepTokenAuthenticationId( Token ) (((PTOKEN)(Token))->AuthenticationId)
  120. //
  121. //
  122. // BOOLEAN
  123. // SepBadImpersonationLevel(
  124. // IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
  125. // IN BOOLEAN ServerIsRemote
  126. // )
  127. //
  128. // Routine Description:
  129. //
  130. // Determine whether a client is trying to impersonate innappropriately
  131. // This routine should only be called if a thread requesting impersonation
  132. // is itself already impersonating a client of its own. This routine
  133. // indicates whether the client is attempting to violate the level of
  134. // impersonation granted to it by its client.
  135. //
  136. // Arguments:
  137. //
  138. // ImpersonationLevel - Is the impersonation level of the client's
  139. // effective token.
  140. //
  141. // ServerIsRemote - Is a boolean flag indicating whether the client
  142. // is requesting impersonation services to a remote system. TRUE
  143. // indicates the session is a remote session, FALSE indicates the
  144. // session is a local session. Delegation level is necessary to
  145. // achieve a remote session.
  146. //
  147. // Return Value:
  148. //
  149. // TRUE - Indicates that the impersonation level of the client's client
  150. // token is innapropriate for the attempted impersonation.
  151. // An error (STATUS_BAD_IMPERSONATION_LEVEL) should be generated.
  152. //
  153. // FALSE - Indicates the impersonation attempt is not bad, and should
  154. // be allowed.
  155. //
  156. //
  157. #define SepBadImpersonationLevel(IL,SIR) (( \
  158. ((IL) == SecurityAnonymous) || ((IL) == SecurityIdentification) || \
  159. ( (SIR) && ((IL) != SecurityDelegation) ) \
  160. ) ? TRUE : FALSE )
  161. //++
  162. //
  163. // BOOL
  164. // IsValidElementCount(
  165. // IN ULONG Count,
  166. // IN <STRUCTURE>
  167. // );
  168. //
  169. //--
  170. #define IsValidElementCount( Count, STRUCTURE ) \
  171. ( Count < ( (ULONG_PTR) ( (PUCHAR) ( (PUCHAR) (LONG_PTR)(LONG)0xFFFFFFFF - (PUCHAR) MM_SYSTEM_RANGE_START ) + 1 ) \
  172. / sizeof( STRUCTURE ) ) )
  173. #define SEP_MAX_PRIVILEGE_COUNT (SE_MAX_WELL_KNOWN_PRIVILEGE-SE_MIN_WELL_KNOWN_PRIVILEGE+32)
  174. #define IsValidPrivilegeCount( count ) ((count == 0) || \
  175. ((count > 0) && \
  176. (count <= SEP_MAX_PRIVILEGE_COUNT)))
  177. //
  178. // the object type list limit is chosen arbitrarily
  179. //
  180. #define SEP_MAX_OBJECT_TYPE_LIST_COUNT 4096
  181. #define IsValidObjectTypeListCount( count ) \
  182. ((count == 0) || \
  183. (count <= SEP_MAX_OBJECT_TYPE_LIST_COUNT))
  184. #define IsInRange(item,min_val,max_val) \
  185. (((item) >= min_val) && ((item) <= max_val))
  186. //
  187. // see msaudite.mc for def. of valid category-id
  188. //
  189. #define IsValidCategoryId(c) \
  190. (IsInRange((c), SE_ADT_MIN_CATEGORY_ID, SE_ADT_MAX_CATEGORY_ID))
  191. //
  192. // see msaudite.mc for def. of valid audit-id
  193. //
  194. #define IsValidAuditId(a) \
  195. (IsInRange((a), SE_ADT_MIN_AUDIT_ID, SE_ADT_MAX_AUDIT_ID))
  196. //
  197. // check for reasonable value of parameter count. we must have atleast
  198. // 2 parameters in the audit-params array. Thus the min limit is 3.
  199. // The max limit is determined by the value in ntlsa.h
  200. //
  201. #define IsValidParameterCount(p) \
  202. (IsInRange((p), 2, SE_MAX_AUDIT_PARAMETERS))
  203. ///////////////////////////////////////////////////////////////////////////
  204. // //
  205. // Constants //
  206. // //
  207. ///////////////////////////////////////////////////////////////////////////
  208. #define SEP_MAX_GROUP_COUNT 4096
  209. ///////////////////////////////////////////////////////////////////////////
  210. // //
  211. // Private Data types //
  212. // //
  213. ///////////////////////////////////////////////////////////////////////////
  214. extern HANDLE SepLsaHandle;
  215. //extern BOOLEAN SepAuditShutdownEvents;
  216. //
  217. // Spinlock protecting the queue of work being passed to LSA
  218. //
  219. extern ERESOURCE SepLsaQueueLock;
  220. extern ULONG SepLsaQueueLength;
  221. //
  222. // Doubly linked list of work items queued to worker threads.
  223. //
  224. extern LIST_ENTRY SepLsaQueue;
  225. extern LONG SepTokenPolicyCounter[POLICY_AUDIT_EVENT_TYPE_COUNT];
  226. // #define SepAcquireTokenReadLock(T) KeEnterCriticalRegion(); \
  227. // ExAcquireResourceSharedLite(&SepTokenLock, TRUE)
  228. #define SepLockLsaQueue() KeEnterCriticalRegion(); \
  229. ExAcquireResourceExclusiveLite(&SepLsaQueueLock, TRUE)
  230. #define SepUnlockLsaQueue() ExReleaseResourceLite(&SepLsaQueueLock); \
  231. KeLeaveCriticalRegion()
  232. #define SepWorkListHead() ((PSEP_LSA_WORK_ITEM)(&SepLsaQueue)->Flink)
  233. #define SepWorkListEmpty() (IsListEmpty (&SepLsaQueue))
  234. #ifndef ExAllocatePool
  235. #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,' eS')
  236. #endif
  237. #ifndef ExAllocatePoolWithQuota
  238. #define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,' eS')
  239. #endif
  240. typedef
  241. VOID
  242. (*PSEP_LSA_WORKER_CLEANUP_ROUTINE)(
  243. IN PVOID Parameter
  244. );
  245. typedef enum _SEP_LSA_WORK_ITEM_TAG {
  246. SepDeleteLogon,
  247. SepAuditRecord
  248. } SEP_LSA_WORK_ITEM_TAG, *PSEP_LSA_WORK_ITEM_TAG;
  249. typedef struct _SEP_LSA_WORK_ITEM {
  250. //
  251. // This field must be the first field of this structure
  252. //
  253. LIST_ENTRY List;
  254. //
  255. // Command Params Memory type
  256. //
  257. SEP_RM_LSA_MEMORY_TYPE CommandParamsMemoryType;
  258. //
  259. // Tag describing what kind of structure we've got
  260. //
  261. SEP_LSA_WORK_ITEM_TAG Tag;
  262. //
  263. // The following union contains the data to be passed
  264. // to LSA.
  265. //
  266. union {
  267. PVOID BaseAddress;
  268. LUID LogonId;
  269. } CommandParams;
  270. //
  271. // These fields must be filled in by the caller of SepRmCallLsa
  272. //
  273. LSA_COMMAND_NUMBER CommandNumber;
  274. ULONG CommandParamsLength;
  275. PVOID ReplyBuffer;
  276. ULONG ReplyBufferLength;
  277. //
  278. // CleanupFunction (if specified) will be called with CleanupParameter
  279. // as its argument before the SEP_LSA_WORK_ITEM is freed by SepRmCallLsa
  280. //
  281. PSEP_LSA_WORKER_CLEANUP_ROUTINE CleanupFunction;
  282. PVOID CleanupParameter;
  283. } SEP_LSA_WORK_ITEM, *PSEP_LSA_WORK_ITEM;
  284. typedef struct _SEP_WORK_ITEM {
  285. WORK_QUEUE_ITEM WorkItem;
  286. } SEP_WORK_ITEM, *PSEP_WORK_ITEM;
  287. //
  288. // Each logon session active in the system has a corresponding record of
  289. // the following type...
  290. //
  291. typedef struct _SEP_LOGON_SESSION_REFERENCES {
  292. struct _SEP_LOGON_SESSION_REFERENCES *Next;
  293. LUID LogonId;
  294. ULONG ReferenceCount;
  295. ULONG Flags;
  296. PDEVICE_MAP pDeviceMap;
  297. #if DBG || TOKEN_LEAK_MONITOR
  298. LIST_ENTRY TokenList;
  299. #endif
  300. } SEP_LOGON_SESSION_REFERENCES, *PSEP_LOGON_SESSION_REFERENCES;
  301. extern SEP_WORK_ITEM SepExWorkItem;
  302. ///////////////////////////////////////////////////////////////////////////
  303. // //
  304. // Private Routines //
  305. // //
  306. ///////////////////////////////////////////////////////////////////////////
  307. BOOLEAN
  308. SepDevelopmentTest( VOID ); //Used only for development testing
  309. BOOLEAN
  310. SepInitializationPhase0( VOID );
  311. BOOLEAN
  312. SepInitializationPhase1( VOID );
  313. BOOLEAN
  314. SepVariableInitialization( VOID );
  315. NTSTATUS
  316. SepCreateToken(
  317. OUT PHANDLE TokenHandle,
  318. IN KPROCESSOR_MODE RequestorMode,
  319. IN ACCESS_MASK DesiredAccess,
  320. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  321. IN TOKEN_TYPE TokenType,
  322. IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel OPTIONAL,
  323. IN PLUID AuthenticationId,
  324. IN PLARGE_INTEGER ExpirationTime,
  325. IN PSID_AND_ATTRIBUTES User,
  326. IN ULONG GroupCount,
  327. IN PSID_AND_ATTRIBUTES Groups,
  328. IN ULONG GroupsLength,
  329. IN ULONG PrivilegeCount,
  330. IN PLUID_AND_ATTRIBUTES Privileges,
  331. IN PSID Owner OPTIONAL,
  332. IN PSID PrimaryGroup,
  333. IN PACL DefaultDacl OPTIONAL,
  334. IN PTOKEN_SOURCE TokenSource,
  335. IN BOOLEAN SystemToken,
  336. IN PSECURITY_TOKEN_PROXY_DATA ProxyData OPTIONAL,
  337. IN PSECURITY_TOKEN_AUDIT_DATA AuditData OPTIONAL
  338. );
  339. NTSTATUS
  340. SepReferenceLogonSession(
  341. IN PLUID LogonId,
  342. OUT PSEP_LOGON_SESSION_REFERENCES *ReturnSession
  343. );
  344. VOID
  345. SepDeReferenceLogonSession(
  346. IN PLUID LogonId
  347. );
  348. #define TOKEN_LEAK_MONITOR 0
  349. #if DBG || TOKEN_LEAK_MONITOR
  350. VOID
  351. SepAddTokenLogonSession(
  352. IN PACCESS_TOKEN Token
  353. );
  354. VOID
  355. SepRemoveTokenLogonSession(
  356. IN PACCESS_TOKEN Token
  357. );
  358. extern LONG SepTokenLeakMethodCount;
  359. extern LONG SepTokenLeakBreakCount;
  360. extern LONG SepTokenLeakMethodWatch;
  361. extern PVOID SepTokenLeakToken;
  362. extern HANDLE SepTokenLeakProcessCid;
  363. extern BOOLEAN SepTokenLeakTracking;
  364. #endif
  365. VOID
  366. SepLockSubjectContext(
  367. IN PSECURITY_SUBJECT_CONTEXT SubjectContext
  368. );
  369. VOID
  370. SepFreeSubjectContext(
  371. IN PSECURITY_SUBJECT_CONTEXT SubjectContext
  372. );
  373. VOID
  374. SepGetDefaultsSubjectContext(
  375. IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
  376. OUT PSID *Owner,
  377. OUT PSID *Group,
  378. OUT PSID *ServerOwner,
  379. OUT PSID *ServerGroup,
  380. OUT PACL *Dacl
  381. );
  382. BOOLEAN
  383. SepValidOwnerSubjectContext(
  384. IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
  385. IN PSID Owner,
  386. IN BOOLEAN ServerObject
  387. );
  388. BOOLEAN
  389. SepIdAssignableAsGroup(
  390. IN PACCESS_TOKEN Token,
  391. IN PSID Group
  392. );
  393. BOOLEAN
  394. SepCheckAcl (
  395. IN PACL Acl,
  396. IN ULONG Length
  397. );
  398. BOOLEAN
  399. SepAuditAlarm (
  400. IN PUNICODE_STRING SubsystemName,
  401. IN PVOID HandleId,
  402. IN PUNICODE_STRING ObjectTypeName,
  403. IN PUNICODE_STRING ObjectName,
  404. IN PSECURITY_DESCRIPTOR SecurityDescriptor,
  405. IN ACCESS_MASK DesiredAccess,
  406. IN BOOLEAN ObjectCreation,
  407. IN ACCESS_MASK GrantedAccess,
  408. OUT PBOOLEAN GenerateOnClose
  409. );
  410. BOOLEAN
  411. SepSinglePrivilegeCheck (
  412. LUID DesiredPrivilege,
  413. IN PACCESS_TOKEN EffectiveToken,
  414. IN KPROCESSOR_MODE PreviousMode
  415. );
  416. NTSTATUS
  417. SepRmCallLsa(
  418. PSEP_WORK_ITEM SepWorkItem
  419. );
  420. BOOLEAN
  421. SepInitializeWorkList(
  422. VOID
  423. );
  424. BOOLEAN
  425. SepRmInitPhase0(
  426. );
  427. VOID
  428. SepConcatenatePrivileges(
  429. IN PPRIVILEGE_SET TargetPrivilegeSet,
  430. IN ULONG TargetBufferSize,
  431. IN PPRIVILEGE_SET SourcePrivilegeSet
  432. );
  433. BOOLEAN
  434. SepTokenIsOwner(
  435. IN PACCESS_TOKEN Token,
  436. IN PSECURITY_DESCRIPTOR SecurityDescriptor,
  437. IN BOOLEAN TokenLocked
  438. );
  439. #if DBG
  440. VOID
  441. SepPrintAcl (
  442. IN PACL Acl
  443. );
  444. VOID
  445. SepPrintSid(
  446. IN PSID Sid
  447. );
  448. VOID
  449. SepDumpSecurityDescriptor(
  450. IN PSECURITY_DESCRIPTOR SecurityDescriptor,
  451. IN PSZ TitleString
  452. );
  453. BOOLEAN
  454. SepSidTranslation(
  455. PSID Sid,
  456. PSTRING AccountName
  457. );
  458. VOID
  459. SepDumpTokenInfo(
  460. IN PACCESS_TOKEN Token
  461. );
  462. VOID
  463. SepDumpString(
  464. IN PUNICODE_STRING String
  465. );
  466. #endif //DBG
  467. BOOLEAN
  468. SepSidInToken (
  469. IN PACCESS_TOKEN Token,
  470. IN PSID PrincipalSelfSid,
  471. IN PSID Sid,
  472. IN BOOLEAN DenyAce
  473. );
  474. VOID
  475. SepExamineSacl(
  476. IN PACL Sacl,
  477. IN PACCESS_TOKEN Token,
  478. IN ACCESS_MASK DesiredAccess,
  479. IN BOOLEAN AccessGranted,
  480. OUT PBOOLEAN GenerateAudit,
  481. OUT PBOOLEAN GenerateAlarm
  482. );
  483. VOID
  484. SepCopyString (
  485. IN PUNICODE_STRING SourceString,
  486. OUT PUNICODE_STRING *DestString
  487. );
  488. VOID
  489. SepAssemblePrivileges(
  490. IN ULONG PrivilegeCount,
  491. IN BOOLEAN SystemSecurity,
  492. IN BOOLEAN WriteOwner,
  493. OUT PPRIVILEGE_SET *Privileges
  494. );
  495. PUNICODE_STRING
  496. SepQueryTypeString(
  497. IN PVOID Object
  498. );
  499. POBJECT_NAME_INFORMATION
  500. SepQueryNameString(
  501. IN PVOID Object
  502. );
  503. BOOLEAN
  504. SepFilterPrivilegeAudits(
  505. IN PPRIVILEGE_SET PrivilegeSet
  506. );
  507. BOOLEAN
  508. SepQueueWorkItem(
  509. IN PSEP_LSA_WORK_ITEM LsaWorkItem,
  510. IN BOOLEAN ForceQueue
  511. );
  512. PSEP_LSA_WORK_ITEM
  513. SepDequeueWorkItem(
  514. VOID
  515. );
  516. VOID
  517. SepAdtGenerateDiscardAudit(
  518. VOID
  519. );
  520. BOOLEAN
  521. SepAdtValidateAuditBounds(
  522. ULONG Upper,
  523. ULONG Lower
  524. );
  525. NTSTATUS
  526. SepAdtInitializeCrashOnFail(
  527. VOID
  528. );
  529. BOOLEAN
  530. SepAdtInitializePrivilegeAuditing(
  531. VOID
  532. );
  533. NTSTATUS
  534. SepCopyProxyData (
  535. OUT PSECURITY_TOKEN_PROXY_DATA * DestProxyData,
  536. IN PSECURITY_TOKEN_PROXY_DATA SourceProxyData
  537. );
  538. VOID
  539. SepFreeProxyData (
  540. IN PSECURITY_TOKEN_PROXY_DATA ProxyData
  541. );
  542. NTSTATUS
  543. SepProbeAndCaptureQosData(
  544. IN PSECURITY_ADVANCED_QUALITY_OF_SERVICE CapturedSecurityQos
  545. );
  546. VOID
  547. SepAuditAssignPrimaryToken(
  548. IN PEPROCESS Process,
  549. IN PACCESS_TOKEN NewAccessToken
  550. );
  551. BOOLEAN
  552. SepAdtAuditThisEventWithContext(
  553. IN POLICY_AUDIT_EVENT_TYPE Category,
  554. IN BOOLEAN AccessGranted,
  555. IN BOOLEAN AccessDenied,
  556. IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL
  557. );
  558. #endif // _SEP_