////////////////////////////////////////////////////////////////////////// // WARNING - WARNING - WARNING - WARNING - WARNING - WARNING - WARNING // // // // This test file is not current with the security implementation. // // This file contains references to data types and APIs that do not // // exist. // // // ////////////////////////////////////////////////////////////////////////// /*++ Copyright (c) 1989 Microsoft Corporation Module Name: tse.c Abstract: Test program for the SE subcomponent of the NTOS project Author: Gary Kimura (garyki) 20-Nov-1989 Revision History: --*/ #include #include "sep.h" #include BOOLEAN SeTest(); #include "ttoken.c" int main( int argc, char *argv[] ) { VOID KiSystemStartup(); TestFunction = SeTest; KiSystemStartup(); return( 0 ); } BOOLEAN SeTest() { BOOLEAN TestMakeSystemToken(); BOOLEAN TestTokenCopy(); BOOLEAN TestTokenSize(); BOOLEAN TestDefaultObjectMethod(); BOOLEAN TestCaptureSecurityDescriptor(); BOOLEAN TestAssignSecurity(); BOOLEAN TestAccessCheck(); BOOLEAN TestGenerateMessage(); DbgPrint("Start SeTest()\n"); if (!TestMakeSystemToken()) { DbgPrint("TestMakeSystemToken() Error\n"); return FALSE; } if (!TestTokenCopy()) { DbgPrint("TestTokenCopy() Error\n"); return FALSE; } if (!TestTokenSize()) { DbgPrint("TestTokenSize() Error\n"); return FALSE; } if (!TestDefaultObjectMethod()) { DbgPrint("TestDefaultObjectMethod() Error\n"); return FALSE; } if (!TestCaptureSecurityDescriptor()) { DbgPrint("TestCaptureSecurityDescriptor() Error\n"); return FALSE; } if (!TestAssignSecurity()) { DbgPrint("TestAssignSecurity() Error\n"); return FALSE; } if (!TestAccessCheck()) { DbgPrint("TestAccessCheck() Error\n"); return FALSE; } if (!TestGenerateMessage()) { DbgPrint("TestGenerateMessage() Error\n"); return FALSE; } DbgPrint("End SeTest()\n"); return TRUE; } BOOLEAN TestMakeSystemToken() { PACCESS_TOKEN Token; // // Make the system token // Token = (PACCESS_TOKEN)SeMakeSystemToken( PagedPool ); // // and check its contents // if (!SepIsSystemToken( Token, ((ACCESS_TOKEN *)Token)->Size )) { DbgPrint("SepIsSystemToken Error\n"); return FALSE; } ExFreePool( Token ); return TRUE; } BOOLEAN TestTokenCopy() { PACCESS_TOKEN InToken; PACCESS_TOKEN OutToken; NTSTATUS Status; ULONG i; // // Allocate Buffers, and build a token // InToken = (PACCESS_TOKEN)ExAllocatePool(PagedPool, 512); OutToken = (PACCESS_TOKEN)ExAllocatePool(PagedPool, 512); BuildToken( Fred, InToken ); // // Make a copy of the token // if (!NT_SUCCESS(Status = SeTokenCopy( InToken, OutToken, 512))) { DbgPrint("SeTokenCopy Error: %8lx\n", Status); return FALSE; } // // check both tokens for equality // for (i = 0; i < ((ACCESS_TOKEN *)InToken)->Size; i += 1) { if (*((PUCHAR)InToken + 1) != *((PUCHAR)OutToken + 1)) { DbgPrint("Token copy error\n"); return FALSE; } } ExFreePool( InToken ); ExFreePool( OutToken ); return TRUE; } BOOLEAN TestTokenSize() { PACCESS_TOKEN Token; // // Allocate and build a token // Token = (PACCESS_TOKEN)ExAllocatePool(PagedPool, 512); BuildToken( Wilma, Token ); // // Get the token size // if (SeTokenSize(Token) != ((ACCESS_TOKEN *)Token)->Size) { DbgPrint("SeTokenSize error\n"); return FALSE; } ExFreePool( Token ); return TRUE; } BOOLEAN TestDefaultObjectMethod() { SECURITY_DESCRIPTOR SecurityDescriptor; PSECURITY_DESCRIPTOR Buffer; PACL Acl; NTSTATUS Status; PSECURITY_DESCRIPTOR ObjectsSecurityDescriptor; ULONG Length; Acl = (PACL)ExAllocatePool( PagedPool, 1024 ); Buffer = (PSECURITY_DESCRIPTOR)ExAllocatePool( PagedPool, 1024 ); BuildAcl( Fred, Acl, 1024 ); DiscretionarySecurityDescriptor( &SecurityDescriptor, Acl ); ObjectsSecurityDescriptor = NULL; // // Set the descriptor // if (!NT_SUCCESS(Status = SeDefaultObjectMethod( NULL, SetSecurityDescriptor, &SecurityDescriptor, 0, NULL, &ObjectsSecurityDescriptor, PagedPool ))) { DbgPrint("SeDefaultObjectMethod setting error: %8lx\n", Status ); return FALSE; } // // Query the descriptor // if (!NT_SUCCESS(Status = SeDefaultObjectMethod( NULL, QuerySecurityDescriptor, Buffer, AllAclInformation, &Length, &ObjectsSecurityDescriptor, PagedPool ))) { DbgPrint("SeDefaultObjectMethod reading error: %8lx\n", Status ); return FALSE; } // // Replace the descriptor // BuildAcl( Wilma, Acl, 1024 ); if (!NT_SUCCESS(Status = SeDefaultObjectMethod( NULL, SetSecurityDescriptor, &SecurityDescriptor, AllAclInformation, &Length, &ObjectsSecurityDescriptor, PagedPool ))) { DbgPrint("SeDefaultObjectMethod reading error: %8lx\n", Status ); return FALSE; } // // Delete the descriptor // if (!NT_SUCCESS(Status = SeDefaultObjectMethod( NULL, DeleteSecurityDescriptor, NULL, 0, NULL, &ObjectsSecurityDescriptor, PagedPool ))) { DbgPrint("SeDefaultObjectMethod deleting error: %8lx\n", Status ); return FALSE; } ExFreePool(Acl); ExFreePool(Buffer); return TRUE; } BOOLEAN TestCaptureSecurityDescriptor() { SECURITY_DESCRIPTOR SecurityDescriptor; PACL Sacl; PACL Dacl; PSECURITY_DESCRIPTOR NewDescriptor; NTSTATUS Status; Sacl = (PACL)ExAllocatePool( PagedPool, 1024 ); Dacl = (PACL)ExAllocatePool( PagedPool, 1024 ); BuildAcl( Pebbles, Sacl, 1024 ); BuildAcl( Barney, Dacl, 1024 ); DiscretionarySecurityDescriptor( &SecurityDescriptor, Dacl ); SecurityDescriptor.SecurityInformationClass = AllAclInformation; SecurityDescriptor.SystemAcl = Sacl; // // Capture kernel mode and don't force // if (!NT_SUCCESS(Status = SeCaptureSecurityDescriptor( &SecurityDescriptor, KernelMode, PagedPool, FALSE, &NewDescriptor ))) { DbgPrint("SeCapture Error, KernelMode, FALSE : %8lx\n", Status ); return FALSE; } // // Capture kernel mode and force // if (!NT_SUCCESS(Status = SeCaptureSecurityDescriptor( &SecurityDescriptor, KernelMode, PagedPool, TRUE, &NewDescriptor ))) { DbgPrint("SeCapture Error, KernelMode, TRUE : %8lx\n", Status ); return FALSE; } else { ExFreePool( NewDescriptor ); } // // Capture user mode // if (!NT_SUCCESS(Status = SeCaptureSecurityDescriptor( &SecurityDescriptor, UserMode, PagedPool, TRUE, &NewDescriptor ))) { DbgPrint("SeCapture Error, UserMode, FALSE : %8lx\n", Status ); return FALSE; } else { ExFreePool( NewDescriptor ); } return TRUE; } BOOLEAN TestAssignSecurity() { SECURITY_DESCRIPTOR SecurityDescriptor; PACL Acl; PACCESS_TOKEN Token; GENERIC_MAPPING GenericMapping; PSECURITY_DESCRIPTOR NewDescriptor; NTSTATUS Status; Acl = (PACL)ExAllocatePool( PagedPool, 1024 ); BuildAcl( Fred, Acl, 1024 ); Token = (PACCESS_TOKEN)ExAllocatePool( PagedPool, 512 ); BuildToken( Fred, Token ); DiscretionarySecurityDescriptor( &SecurityDescriptor, Acl ); // // Kernel mode, non dir, and no new // NewDescriptor = NULL; if (!NT_SUCCESS(Status = SeAssignSecurity( &SecurityDescriptor, &NewDescriptor, FALSE, Token, &GenericMapping, KernelMode ))) { DbgPrint("SeAssign Error NoNew, NoDir, Kernel : %8lx\n", Status ); return FALSE; } // // Kernel mode, non dir, and new // if (!NT_SUCCESS(Status = SeAssignSecurity( &SecurityDescriptor, &NewDescriptor, FALSE, Token, &GenericMapping, KernelMode ))) { DbgPrint("SeAssign Error New, NoDir, Kernel : %8lx\n", Status ); return FALSE; } // // Kernel mode, dir, and no new // NewDescriptor = NULL; if (!NT_SUCCESS(Status = SeAssignSecurity( &SecurityDescriptor, &NewDescriptor, TRUE, Token, &GenericMapping, KernelMode ))) { DbgPrint("SeAssign Error NoNew, Dir, Kernel : %8lx\n", Status ); return FALSE; } // // Kernel mode, dir, and new // if (!NT_SUCCESS(Status = SeAssignSecurity( &SecurityDescriptor, &NewDescriptor, TRUE, Token, &GenericMapping, KernelMode ))) { DbgPrint("SeAssign Error New, Dir, Kernel : %8lx\n", Status ); return FALSE; } // // User mode, non dir, and no new // NewDescriptor = NULL; if (!NT_SUCCESS(Status = SeAssignSecurity( &SecurityDescriptor, &NewDescriptor, FALSE, Token, &GenericMapping, UserMode ))) { DbgPrint("SeAssign Error NoNew, NoDir, User : %8lx\n", Status ); return FALSE; } // // User mode, non dir, and new // if (!NT_SUCCESS(Status = SeAssignSecurity( &SecurityDescriptor, &NewDescriptor, FALSE, Token, &GenericMapping, UserMode ))) { DbgPrint("SeAssign Error New, NoDir, User : %8lx\n", Status ); return FALSE; } // // User mode, dir, and no new // NewDescriptor = NULL; if (!NT_SUCCESS(Status = SeAssignSecurity( &SecurityDescriptor, &NewDescriptor, TRUE, Token, &GenericMapping, UserMode ))) { DbgPrint("SeAssign Error NoNew, Dir, User : %8lx\n", Status ); return FALSE; } // // User mode, dir, and new // if (!NT_SUCCESS(Status = SeAssignSecurity( &SecurityDescriptor, &NewDescriptor, TRUE, Token, &GenericMapping, UserMode ))) { DbgPrint("SeAssign Error New, Dir, User : %8lx\n", Status ); return FALSE; } return TRUE; } BOOLEAN TestAccessCheck() { SECURITY_DESCRIPTOR SecurityDescriptor; PACL Acl; PACCESS_TOKEN Token; Acl = (PACL)ExAllocatePool( PagedPool, 1024 ); BuildAcl( Fred, Acl, 1024 ); Token = (PACCESS_TOKEN)ExAllocatePool( PagedPool, 512 ); BuildToken( Fred, Token ); DiscretionarySecurityDescriptor( &SecurityDescriptor, Acl ); // // Test should be successful based on aces // if (!SeAccessCheck( &SecurityDescriptor, Token, 0x00000001, NULL, UserMode )) { DbgPrint("SeAccessCheck Error should allow access\n"); return FALSE; } // // Test should be successful based on owner // if (!SeAccessCheck( &SecurityDescriptor, Token, READ_CONTROL, &FredGuid, UserMode )) { DbgPrint("SeAccessCheck Error should allow owner\n"); return FALSE; } // // Test should be unsuccessful based on aces // if (SeAccessCheck( &SecurityDescriptor, Token, 0x0000000f, &FredGuid, UserMode )) { DbgPrint("SeAccessCheck Error shouldn't allow access\n"); return FALSE; } // // Test should be unsuccessful based on non owner // if (SeAccessCheck( &SecurityDescriptor, Token, READ_CONTROL, &BarneyGuid, UserMode )) { DbgPrint("SeAccessCheck Error shouldn't allow non owner access\n"); return FALSE; } return TRUE; } BOOLEAN TestGenerateMessage() { return TRUE; }