2016-11-29 4 views
1

Ich verwende ConvertStringSecurityDescriptorToSecurityDescriptor, um eine Sicherheitsbeschreibung zu erstellen, die ich dann mit CreateFile verwenden kann, da es viel einfacher und viel lesbarer ist.Sicherheits-Deskriptor einrichten, um Lesezugriff auf erhöhten Benutzer zu geben

Meine Absicht ist, dass die Datei von ihrem Besitzer/Ersteller vollständig steuerbar und nur durch erhöhte Prozesse lesbar ist.

Ich kam also mit dem folgenden SSDL Strings:

SSDL := 
    'O:'+ SIDAsString +     // owner is user 
    'D:' +         // Discretionary ACL 
    'P' +         // protected 
    '(A;NP;FA;;;' + SIDAsString + ')' + // Full control to owner 
    // Read only access to administrators 
    '(A;NP;FR;;;LA)' + 
    '(A;NP;FR;;;BA)'; 

SIDAsString ein gültiges SID, wie S-1-5-18 zum Beispiel enthält.

ConvertStringSecurityDescriptorToSecurityDescriptor gibt eine gültige Sicherheitsbeschreibung zurück und die Datei wird mit den erwarteten Rechten erstellt.

Allerdings können erhöhte Prozesse (z. B. ein Deinstallationsprogramm) die Datei nicht lesen, sie erhalten einen Zugriff verweigert-Fehler. Wenn der Prozess, der versucht, die Datei zu lesen, über die Option run as administrator gestartet wird, erhält er den erwarteten Zugriff.

Ich versuchte auf der Suche nach dem erhöhten Benutzer SID, aber ich konnte keine Erwähnung finden, die mich zu der Annahme führt, dass es so etwas nicht gibt.

Gibt es keine Möglichkeit, einen SSDL-String anzugeben, der Lesezugriff auf einen Prozess gewährt, der mit erhöhten Rechten ausgeführt wird?

+0

Elevation ändert nicht die SID- oder Gruppenzuordnungen eines Benutzers, sondern nur seine Token-Berechtigungen. Derselbe Benutzer kann erhöhte und nicht erhöhte Prozesse ausführen. AFAIK, Sie können keinen Sicherheitsdeskriptor verwenden, um den Zugriff basierend auf dem Elevationsstatus zu gewähren/zu widerrufen. Ich denke, du musst darüber nachdenken, was die Höhe ist und wie sie funktioniert. Vielleicht kann die Lese-App versuchen, die Berechtigung "SE_BACKUP_NAME" für sich selbst zu aktivieren und dann die Datei mit dem aktivierten Flag "FILE_FLAG_BACKUP_SEMANTICS" zu öffnen. Das könnte den Lesezugriff gewähren, nach dem Sie suchen. –

+0

@RemyLebeau - wenn der Prozess nicht unter UAC ausgeführt wurde - er hat 'Administratoren' (' S-1-5-32-544') aber mit 'SE_GROUP_USE_FOR_DENY_ONLY' Attribut. wenn der Prozess erhöht gestartet wurde - er hat 'Administratoren' (' S-1-5-32-544') mit 'SE_GROUP_ENABLED' - also existieren wirklich andere Gruppenverbände. wenn wir Zugriff nur für 'Administratoren' erlauben (' S-1-5-32-544') - der erhöhte Prozess wird Zugriff haben, aber nicht erhöht sein - nein – RbMm

+0

"Allerdings können erhöhte Prozesse die Datei nicht lesen" - vs "Wenn die Prozess wurde über die Option Als Administrator ausführen gestartet, er erhält den Zugriff wie erwartet. " - Kann also Prozess lesen Datei lesen oder nicht? und '(A; NP; FR ;;; LA)' oder kann Notwendigkeit sein '(A; NP; FRFX ;;; LA) 'für die Aktivierung des Zugriffs auf die Datei auch? – RbMm

Antwort

0

habe ich versucht, für die erhöhte Benutzer suchen SID

diese SID ist S-1-5-32-544 (Administrators). Jeder Prozess hat Token, Token mit TOKEN_GROUPS, die SID_AND_ATTRIBUTES Array enthält. für denselben Admin-Benutzer, wenn es gestartet oder nicht erhöht gestartet wurde - dieses Array ist anders. beide (erhöhte und nicht erhöhte) Admins haben S-1-5-32-544 aber mit anderen Attributen! erhöhte Admin haben es mit SE_GROUP_ENABLED aber nicht erhöht (restricted) Admin mit SE_GROUP_USE_FOR_DENY_ONLY

A SID mit diesem Attribut ist eine Deny-nur SID. Wenn das System eine Zugriffsprüfung durchführt, sucht es nach Zugriffs-verweigerten ACEs, die für die SID gelten, ignoriert jedoch Zugriff-erlaubte ACEs für die SID.

so ist dieser entscheidende Punkt - wir SD erstellen müssen mit DACL, wo wir einen geeigneten Zugang zu S-1-5-32-544 (Administrators) ermöglichen nur (und sprich zu system auch) - als Ergebnis erhöhter Prozess Zugriff auf Datei sein wird, wenn sie nicht erhöht - nein.

demo: wir SD mit dem nächsten Zugriff in DACL Regeln erstellen:

001F01FF S-1-5-18 SYSTEM 
001200A9 S-1-5-32-544 Administrators 

so Zugriff auf alle SYSTEM und lesen/ausführen zu Administrators - Datei mit diesem DACL nicht erhöht Prozess (sagen Notizblock) kann nicht einmal öffnen für schreibgeschützt. wenn erhöhter Notizblock - kann öffnen und lesen.aber kann nicht schreiben oder

Notiz löschen: für Set SYSTEM als Besitzer brauchen wir SE_RESTORE_PRIVILEGE

void TestX() 
{ 
    SECURITY_ATTRIBUTES sa = { sizeof(sa) }; 

    if (ConvertStringSecurityDescriptorToSecurityDescriptor(
     L"O:SYD:P(A;NP;FA;;;SY)(A;NP;FRFX;;;BA)", 
     SDDL_REVISION_1, &sa.lpSecurityDescriptor, 0)) 
    { 
     HANDLE hToken; 
     if (OpenProcessToken(NtCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 
     { 
      static ::TOKEN_PRIVILEGES tp = { 
       1, { { { SE_RESTORE_PRIVILEGE }, SE_PRIVILEGE_ENABLED|SE_PRIVILEGE_ENABLED_BY_DEFAULT } } 
      }; 
      AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), 0, 0); 
      CloseHandle(hToken); 
     } 

     HANDLE hFile = CreateFile(L"c:\\windows\\1.txt", FILE_GENERIC_WRITE, 0, &sa, CREATE_NEW, 0, 0); 

     if (hFile != INVALID_HANDLE_VALUE) 
     { 
      ULONG cb; 
      WriteFile(hFile, "1234567890", 10, &cb, 0); 
      CloseHandle(hFile); 
     } 

     LocalFree(sa.lpSecurityDescriptor); 
    } 
} 

Sie können testen, wie hoch/nicht-Prozess erhöht (zB notepad.exe) öffnen Sie diese Datei.

Verwandte Themen