Мой клиент использует устаревшее программное обеспечение, написанное на c++
, работающее в нескольких версиях Windows. Это программное обеспечение ограничено API, доступными с Windows XP
, и использует именованный канал.
Например, Windows 10 Home
: целостность канала установлена как ненадежная, что позволяет произвольным пользователям получать доступ к именованному каналу. CreateNamedPipe()
возвращает ошибку 1314.
SECURITY_DESCRIPTOR sd;
SECURITY_ATTRIBUTES sa;
SECURITY_ATTRIBUTES *psa = NULL;
OSVERSIONINFO ovi = {0};
ovi.dwOSVersionInfoSize = sizeof(ovi);
GetVersionEx(&ovi);
if (ovi.dwMajorVersion > 5) {
// create SID S-1-16-0 (= untrusted)
int sl = 12;
char x[] = {1, 1, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0};
PSID UntrustedLabelSid = x;
PACL Sacl = (PACL)alloca(sl += sizeof(ACL) + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
InitializeAcl(Sacl, sl, ACL_REVISION);
if (AddAccessAllowedAce(Sacl, ACL_REVISION, 0, UntrustedLabelSid)) {
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
SetSecurityDescriptorSacl(&sd, true, Sacl, false);
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = &sd;
sa.bInheritHandle = false;
psa = &sa;
}
}
Pipe = CreateNamedPipe(TEXT(PipeName), PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT,
1, PipeLength, PipeLength, 10, psa);