Mit C versuche ich, eine Verbindung zwischen einem Prozess und einem untergeordneten Prozess herzustellen, während der untergeordnete Prozess eine niedrigere obligatorische (Integrität) Ebene (niedrig, während der übergeordnete Prozess ist hoch).SetSecurityInfo gibt Zugriff verweigert
ich das folgende Programm geschrieben (es ist eine vereinfachte Version, wenn es), aber es funktioniert nicht mit: ERROR_ACCESS_DENIED (0x5)
INT wmain(IN SIZE_T nArgc, IN PWSTR *pArgv)
{
SECURITY_ATTRIBUTES securityArrtibutes = { 0 };
HANDLE hPipeRead = NULL;
HANDLE hPipeWrite = NULL;
tSecurityArrtibutes.nLength = sizeof(tSecurityArrtibutes);
tSecurityArrtibutes.bInheritHandle = TRUE;
SetSeSecurityNamePrivilege();
CreatePipe(&hPipeRead, &hPipeWrite, &securityArrtibutes, 0);
ChangeMandatoryLabelHandle(hPipeRead);
}
VOID ChangeMandatoryLabelHandle(HANDLE hObject)
{
BOOL bRetval = FALSE;
DWORD dwError = 0;
PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
PACL ptSacl = NULL;
BOOL bSaclPresent = FALSE;
BOOL bSaclDefaulted = FALSE;
PWSTR pSDDL = NULL;
SDDL = L"S:(ML;;LW;;;NW)";
bRetval = ConvertStringSecurityDescriptorToSecurityDescriptorW(pSDDL, SDDL_REVISION_1, &pSecurityDescriptor, NULL);
if (FALSE == bRetval)
... // Handle failure
bRetval = GetSecurityDescriptorSacl(pSecurityDescriptor, &bSaclPresent, &ptSacl, &bSaclDefaulted);
if (FALSE == bRetval)
... // Handle failure
// getting ERROR_ACCESS_DENIED (0x5)
dwErr = SetSecurityInfo(hObject, SE_KERNEL_OBJECT, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, ptSacl);
if (ERROR_SUCCESS != dwErr)
... // Handle failure
... // Cleanup
}
Ich folgte https://msdn.microsoft.com/en-us/library/windows/desktop/aa379588(v=vs.85).aspx und die Bemerkung, dass To set the SACL of an object, the caller must have the SE_SECURITY_NAME privilege enabled.
:
BOOL SetSeSecurityNamePrivilege()
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_IMPERSONATE, &hToken)
return FALSE
if (!LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &luid))
return FALSE;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
return FALSE;
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
return FALSE;
return TRUE;
}
note: Ich bekomme das gleiche Ergebnis, wenn ich versuche, es mit Dateien auszuführen, mit CreateFile
anstelle von CreatePipe
. Zusätzlich, wenn ich versuche, das mit Dateien zu tun, und ich SetSecurityInfo
durch SetNamedSecurityInfoW
ersetzen, und geben Sie den vollständigen Pfad der Datei, es funktioniert super.
Hat jemand eine Idee, wie es funktioniert? Vielen Dank!
Wie RbMm in seiner Antwort erklärt, hat die Änderung der Sicherheitsbeschreibung wahrscheinlich keine Auswirkungen auf das Problem, das Sie hier eigentlich lösen wollen. Sobald Sie sich davon überzeugt haben, schlage ich vor, dass Sie eine weitere Frage stellen, die sich auf Ihr tatsächliches Problem konzentriert. –