00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
#include "sep.h"
00031
#include "seopaque.h"
00032
#include "tokenp.h"
00033
00034
00035
#ifdef ALLOC_PRAGMA
00036
#pragma alloc_text(PAGE,SeCaptureSubjectContext)
00037
#pragma alloc_text(PAGE,SeLockSubjectContext)
00038
#pragma alloc_text(PAGE,SeUnlockSubjectContext)
00039
#pragma alloc_text(PAGE,SeReleaseSubjectContext)
00040
#pragma alloc_text(PAGE,SepGetDefaultsSubjectContext)
00041
#pragma alloc_text(PAGE,SepValidOwnerSubjectContext)
00042
#endif
00043
00044
00045
VOID
00046 SeCaptureSubjectContext (
00047 OUT
PSECURITY_SUBJECT_CONTEXT SubjectContext
00048 )
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 {
00082
00083
PEPROCESS CurrentProcess;
00084
00085
00086
00087 BOOLEAN IgnoreCopyOnOpen;
00088 BOOLEAN IgnoreEffectiveOnly;
00089
00090
PAGED_CODE();
00091
00092 CurrentProcess =
PsGetCurrentProcess();
00093 SubjectContext->ProcessAuditId =
PsProcessAuditId( CurrentProcess );
00094
00095
00096
00097
00098
00099 SubjectContext->ClientToken =
PsReferenceImpersonationToken(
00100
PsGetCurrentThread(),
00101 &IgnoreCopyOnOpen,
00102 &IgnoreEffectiveOnly,
00103 &(SubjectContext->ImpersonationLevel)
00104 );
00105
00106 SubjectContext->PrimaryToken =
PsReferencePrimaryToken(CurrentProcess);
00107
00108
return;
00109
00110 }
00111
00112
00113
00114
VOID
00115 SeLockSubjectContext(
00116 IN
PSECURITY_SUBJECT_CONTEXT SubjectContext
00117 )
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 {
00144
PAGED_CODE();
00145
00146
SepAcquireTokenReadLock((
PTOKEN)(SubjectContext->PrimaryToken));
00147
00148
if (ARGUMENT_PRESENT(SubjectContext->ClientToken)) {
00149
00150
SepAcquireTokenReadLock((
PTOKEN)(SubjectContext->ClientToken));
00151 }
00152
00153
return;
00154 }
00155
00156
00157
00158
VOID
00159 SeUnlockSubjectContext(
00160 IN
PSECURITY_SUBJECT_CONTEXT SubjectContext
00161 )
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180 {
00181
PAGED_CODE();
00182
00183
SepReleaseTokenReadLock((
PTOKEN)(SubjectContext->PrimaryToken));
00184
00185
if (ARGUMENT_PRESENT(SubjectContext->ClientToken)) {
00186
00187
SepReleaseTokenReadLock((
PTOKEN)(SubjectContext->ClientToken));
00188 }
00189
00190
00191 }
00192
00193
00194
00195
VOID
00196 SeReleaseSubjectContext (
00197 IN
PSECURITY_SUBJECT_CONTEXT SubjectContext
00198 )
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219 {
00220
PAGED_CODE();
00221
00222
PsDereferencePrimaryToken( SubjectContext->PrimaryToken );
00223 SubjectContext->PrimaryToken =
NULL;
00224
00225
00226
PsDereferenceImpersonationToken( SubjectContext->ClientToken );
00227 SubjectContext->ClientToken =
NULL;
00228
00229
return;
00230
00231 }
00232
00233
VOID
00234 SepGetDefaultsSubjectContext(
00235 IN
PSECURITY_SUBJECT_CONTEXT SubjectContext,
00236 OUT PSID *Owner,
00237 OUT PSID *Group,
00238 OUT PSID *ServerOwner,
00239 OUT PSID *ServerGroup,
00240 OUT PACL *Dacl
00241 )
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277 {
00278
PTOKEN EffectiveToken;
00279
PTOKEN PrimaryToken;
00280
00281
PAGED_CODE();
00282
00283
if (ARGUMENT_PRESENT(SubjectContext->ClientToken)) {
00284
EffectiveToken = (
PTOKEN)SubjectContext->ClientToken;
00285 }
else {
00286
EffectiveToken = (
PTOKEN)SubjectContext->PrimaryToken;
00287 }
00288
00289 (*Owner) =
EffectiveToken->UserAndGroups[
EffectiveToken->DefaultOwnerIndex].Sid;
00290
00291 (*Group) =
EffectiveToken->PrimaryGroup;
00292
00293 (*Dacl) =
EffectiveToken->DefaultDacl;
00294
00295
PrimaryToken = (
PTOKEN)SubjectContext->PrimaryToken;
00296
00297 *ServerOwner =
PrimaryToken->UserAndGroups[
PrimaryToken->DefaultOwnerIndex].Sid;
00298
00299 *ServerGroup =
PrimaryToken->PrimaryGroup;
00300
00301
return;
00302 }
00303
00304
00305 BOOLEAN
00306 SepIdAssignableAsGroup(
00307 IN PACCESS_TOKEN AToken,
00308 IN PSID Group
00309 )
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334 {
00335 ULONG
Index;
00336 BOOLEAN Found =
FALSE;
00337
PTOKEN Token;
00338
00339
PAGED_CODE();
00340
00341
Token = (
PTOKEN)AToken;
00342
00343
00344
00345
00346
00347
00348
if (
Group ==
NULL) {
00349
return(
FALSE );
00350 }
00351
00352
SepAcquireTokenReadLock(
Token );
00353
00354
00355
00356
00357
00358
00359
Index = 0;
00360
while (
Index <
Token->UserAndGroupCount) {
00361
00362 Found =
RtlEqualSid(
00363
Group,
00364
Token->UserAndGroups[
Index].Sid
00365 );
00366
00367
if ( Found ) {
00368
break;
00369 }
00370
00371
Index += 1;
00372 }
00373
00374
SepReleaseTokenReadLock(
Token );
00375
00376
return Found;
00377 }
00378
00379
00380 BOOLEAN
00381 SepValidOwnerSubjectContext(
00382 IN
PSECURITY_SUBJECT_CONTEXT SubjectContext,
00383 IN PSID Owner,
00384 IN BOOLEAN ServerObject
00385 )
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408 {
00409
00410 ULONG
Index;
00411 BOOLEAN Found;
00412
PTOKEN EffectiveToken;
00413 BOOLEAN Rc =
FALSE;
00414
00415
PAGED_CODE();
00416
00417
00418
00419
00420
00421
00422
if (
Owner ==
NULL) {
00423
return(
FALSE );
00424 }
00425
00426
00427
00428
00429
00430
if (!ServerObject && ARGUMENT_PRESENT(SubjectContext->ClientToken)) {
00431
EffectiveToken = (
PTOKEN)SubjectContext->ClientToken;
00432 }
else {
00433
EffectiveToken = (
PTOKEN)SubjectContext->PrimaryToken;
00434 }
00435
00436
00437
00438
00439
00440
00441
00442
00443
if (
EffectiveToken->TokenType == TokenImpersonation) {
00444
00445
if (
EffectiveToken->ImpersonationLevel < SecurityImpersonation) {
00446
00447
return(
FALSE );
00448
00449 }
00450 }
00451
00452
SepAcquireTokenReadLock(
EffectiveToken );
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
Index = 0;
00464
while (
Index <
EffectiveToken->UserAndGroupCount) {
00465
00466
00467 Found =
RtlEqualSid(
00468
Owner,
00469
EffectiveToken->UserAndGroups[
Index].Sid
00470 );
00471
00472
if ( Found ) {
00473
00474
00475
00476
00477
00478
00479
if (
SepIdAssignableAsOwner(
EffectiveToken,
Index) ) {
00480
00481
SepReleaseTokenReadLock(
EffectiveToken );
00482 Rc =
TRUE;
00483
goto exit;
00484
00485 }
else {
00486
00487
00488
00489
00490
00491
SepReleaseTokenReadLock(
EffectiveToken );
00492
goto exit;
00493
00494 }
00495
00496
00497 }
00498
00499
00500
Index += 1;
00501
00502 }
00503
00504
00505
SepReleaseTokenReadLock(
EffectiveToken );
00506
00507
exit:
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
if ( Rc ==
FALSE ) {
00520 Rc =
SeSinglePrivilegeCheck(
SeRestorePrivilege,
UserMode );
00521 }
00522
00523
return Rc;
00524 }
00525
00526
00527
00528
NTSTATUS
00529 SeQueryAuthenticationIdSubjectContext(
00530 IN
PSECURITY_SUBJECT_CONTEXT SubjectContext,
00531 OUT PLUID AuthenticationId
00532 )
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551 {
00552
NTSTATUS Status;
00553
00554
SeLockSubjectContext( SubjectContext );
00555
00556
00557
Status =
SeQueryAuthenticationIdToken(
00558
EffectiveToken(SubjectContext),
00559 AuthenticationId
00560 );
00561
00562
SeUnlockSubjectContext( SubjectContext );
00563
00564
return(
Status );
00565
00566
00567 }