vinduer - Lav integritet til medium/høj integritet rør sikkerhedsbeskrivelse

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har problemer med at oprette sikkerhedsbeskrivelsen, når jeg opretter en NamedPipe. Jeg ønsker, at røret, der er oprettet i Windows-service (høj integritet), skal åbnes fra mellemstore og lave integritetsprocesser.


Jeg arbejder på Windows 7 x64. Jeg forstår ikke, hvad jeg gør her, men her er koden, jeg bruger til at oprette en sikkerhedsbeskrivelse for de rør, jeg opretter. Følgende kode giver mig ikke mulighed for at åbne rør skabt i både høj og medium integritet lever fra lav integritet processer:




    PSID psidWorldSid = NULL, pAdminSID = NULL, pLowSID = NULL, pHighSID = NULL;
    WCHAR wszIntegritySid[] = L"S-1-16-4096";
    WCHAR wszSystemSid[] = L"S-1-16-16384";
    PACL pACL = NULL;
    PSECURITY\_DESCRIPTOR pSD = NULL;
    SECURITY\_ATTRIBUTES sa;
    SID\_IDENTIFIER\_AUTHORITY SIDAuthNT = SECURITY\_NT\_AUTHORITY;
    SID\_IDENTIFIER\_AUTHORITY siaWorldSidAuthority = SECURITY\_WORLD\_SID\_AUTHORITY;
    EXPLICIT\_ACCESS ea[4];

    //  Create a security descriptor for the log file that allows
    //  access from both the privileged service and the non-privileged
    //  user mode programs

    AllocateAndInitializeSid(&siaWorldSidAuthority, 1,
        SECURITY\_WORLD\_RID,
        0, 0, 0, 0, 0, 0, 0,
        &psidWorldSid);

    ZeroMemory(&ea, sizeof(ea));
    ea[0].grfAccessPermissions = FILE\_ALL\_ACCESS | GENERIC\_WRITE | GENERIC\_READ;
    ea[0].grfAccessMode = SET\_ACCESS;
    ea[0].grfInheritance= NO\_INHERITANCE;
    ea[0].Trustee.TrusteeForm = TRUSTEE\_IS\_SID;
    ea[0].Trustee.TrusteeType = TRUSTEE\_IS\_WELL\_KNOWN\_GROUP;
    ea[0].Trustee.ptstrName  = (LPTSTR) psidWorldSid;

    // Create a SID for the BUILTINAdministrators group.
    AllocateAndInitializeSid(&SIDAuthNT, 2,
        SECURITY\_BUILTIN\_DOMAIN\_RID,
        DOMAIN\_ALIAS\_RID\_ADMINS,
        0, 0, 0, 0, 0, 0,
        &pAdminSID);

    // Initialize an EXPLICIT\_ACCESS structure for an ACE.
    // The ACE will allow the Administrators group full access to
    // the key.
    ea[1].grfAccessPermissions = FILE\_ALL\_ACCESS | GENERIC\_WRITE | GENERIC\_READ;
    ea[1].grfAccessMode = SET\_ACCESS;
    ea[1].grfInheritance= NO\_INHERITANCE;
    ea[1].Trustee.TrusteeForm = TRUSTEE\_IS\_SID;
    ea[1].Trustee.TrusteeType = TRUSTEE\_IS\_GROUP;
    ea[1].Trustee.ptstrName  = (LPTSTR) pAdminSID;

    AllocateAndInitializeSid(&siaWorldSidAuthority, 1,
        SECURITY\_MANDATORY\_LOW\_RID,
        0,
        0, 0, 0, 0, 0, 0,
        &pLowSID);

    ea[2].grfAccessPermissions = FILE\_ALL\_ACCESS | GENERIC\_WRITE | GENERIC\_READ;
    ea[2].grfAccessMode = SET\_ACCESS;
    ea[2].grfInheritance= NO\_INHERITANCE;
    ea[2].Trustee.TrusteeForm = TRUSTEE\_IS\_SID;
    ea[2].Trustee.TrusteeType = TRUSTEE\_IS\_WELL\_KNOWN\_GROUP;
    ea[2].Trustee.ptstrName  = (LPTSTR) pLowSID;

    AllocateAndInitializeSid(&siaWorldSidAuthority, 1,
        SECURITY\_MANDATORY\_HIGH\_RID,
        0,
        0, 0, 0, 0, 0, 0,
        &pHighSID);

    ea[3].grfAccessPermissions = FILE\_ALL\_ACCESS | GENERIC\_WRITE | GENERIC\_READ;
    ea[3].grfAccessMode = SET\_ACCESS;
    ea[3].grfInheritance= NO\_INHERITANCE;
    ea[3].Trustee.TrusteeForm = TRUSTEE\_IS\_SID;
    ea[3].Trustee.TrusteeType = TRUSTEE\_IS\_WELL\_KNOWN\_GROUP;
    ea[3].Trustee.ptstrName  = (LPTSTR) pHighSID;

    SetEntriesInAcl(4, ea, NULL, &pACL);

    pSD = (PSECURITY\_DESCRIPTOR)LocalAlloc(LPTR, SECURITY\_DESCRIPTOR\_MIN\_LENGTH); 
    InitializeSecurityDescriptor( pSD, SECURITY\_DESCRIPTOR\_REVISION);
    SetSecurityDescriptorDacl( pSD, TRUE, pACL, FALSE );
    ZeroMemory( &sa, sizeof(SECURITY\_ATTRIBUTES));


    sa.nLength              = sizeof(SECURITY\_ATTRIBUTES);
    sa.lpSecurityDescriptor = pSD;
    sa.bInheritHandle       = FALSE;

    m\_hPipe = CreateNamedPipeA(
                m\_szName.c\_str(),
                PIPE\_ACCESS\_DUPLEX,
                PIPE\_TYPE\_BYTE | PIPE\_READMODE\_BYTE | BlockFlag,
                PIPE\_UNLIMITED\_INSTANCES,
                BUFFER\_SIZE,
                BUFFER\_SIZE,
                NMPWAIT\_USE\_DEFAULT\_WAIT,
                &sa
                );

    if (psidWorldSid) 
        FreeSid(psidWorldSid);
    if (pAdminSID) 
        FreeSid(pAdminSID);
    if (pLowSID) 
        FreeSid(pLowSID);
    if (pHighSID) 
        FreeSid(pHighSID);
    if (pACL) 
        LocalFree(pACL);
    if (pSD) 
        LocalFree(pSD);


Det ser ud til at fungere næsten fint, når jeg opretter en sikkerhedsbeskrivelse fra streng:


ConvertStringSecurityDescriptorToSecurityDescriptorW( L"S:(ML;;NW;;;LW)", SDDL\_REVISION\_1, &pSD, NULL);


Når jeg opretter sikkerhedsbeskrivelse fra strengen som ovenfor, kan jeg i det mindste åbne rør skabt med medium integritet tilladelser fra lav integritet processer.


Tak for eventuelle forslag.


Hilsen,
Kuba

Bedste reference


Koden, du viser, synes at være at oprette en sikkerhedsbeskrivelse og oprette sin diskretionære adgangskontrol liste (DACL). DACL har intet at gøre med integritetsstyringsmekanismen.


For at lave integritetsprocesser skal åbne et håndtag, som skal skrives til dit navngivne rør, skal den navngivne rørobjekt markeres med lav integritet i dens obligatoriske integritetsmærkning. Denne etiket lever i System Access Control List (SACL), ikke i DACL. Det er hvad præfiks S:(... betyder i SDDL-strengrepræsentationen af ​​sikkerhedsbeskrivelsen, som du plejede at oprette SD via ConvertStringSecurityDescriptorToSecurityDescriptorW.


Hvis du vil gøre denne lange hånd uden at starte fra SDDL-repræsentationen, skal du oprette en ACE af den korrekte type, SYSTEM\_MANDATORY\_LABEL\_ACE, initialiseret med SID for lav integritet (S-1-16-4096) og en passende integritetspolitik (f.eks. SYSTEM\_MANDATORY\_LABEL\_NO\_WRITE\_UP) og derefter indsæt den i SACL via SetSecurityDescriptorSacl.

Andre referencer 1


Jeg kunne løse problemet. Som Chris påpegede, blev røret oprettet ordentligt med lav integritet tilladelser, selvom jeg savnede den del, hvor jeg gjorde den tilgængelig for brugerne.


Jeg har løst dette ved at indstille SDDL sådan: S:(ML;;NW;;;LW)D:(A;;0x12019f;;;WD)
Dette vil indstille tilladelser til Everyone brugeren, så han kan åbne, skrive, læse røret. Jeg har tjekket og nu kan røret få adgang til globalt fra ethvert integritetsniveau og fra enhver konto.


Det ville være bedre at oprette 0x12019b tilladelser til 'Alle', da det giver alle brugere adgang til røret uden tilladelser til at tilføje nye forekomster til røret. Derefter skal du tilføre 0x12019f tilladelser kun til den bruger, der opretter rørene, men jeg havde ingen idé om, hvordan man kunne få ID til den aktuelle bruger.


I min situation passer det fint, da jeg kun rapporterer dataoplysninger fra andre processer til parsing af systemtjenesten, men hvis du bruger rør til at styre systemtjenesten, kan du måske ikke oprette sikkerhedsbeskrivelse på en anden måde. Det er meget vigtigt at være forsigtig med eventuelle buffer/bunke overløb, når du sender data til systemtjenesten gennem rør, da det kan medføre en sikkerhedsfejl, der efterlader en sårbarhed, der kan tillade lokale privilegier eskalering.


Jeg håber, at dette spørgsmål hjælper en anden.


Roger, ud!