AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zurgiffsrechte bestimmen bzw. testen

Ein Thema von LokutusvB · begonnen am 16. Okt 2008 · letzter Beitrag vom 15. Nov 2010
Antwort Antwort
Seite 2 von 2     12   
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#11

Re: Zurgiffsrechte bestimmen bzw. testen

  Alt 17. Okt 2008, 15:29
Naja, der Code ist für normale Zwecke gut geeignet.
Der Vorteil eines Threadtokens besteht darin, dass man unabhängig von den Privilegien des Prozesstokens arbeiten kann. So kann kein anderer Thread Privilegien ändern, so dass im aktuellen Thread eine Ausführung deshalb scheitert.

Das Problem, dass ich jedoch hier sehe, ist dass jemand "Unerfahrener", diesen Code in einem Service einsetzt, der vorher einen Benutzer personifiziert. D.h. also, dass der Code im Service mit ImpersonateSelf das gesetze Threadtoken durch das SYSTEM Token ersetzt und so andere Zugänge schafft.

Ich weiß, dass es sich um ein Beispiel handelt. Aber ich weiß auch, dass (auf den ersten Blick) funktionierende Beispiele immer gern 1:1 übernommen werden ohne weiter darüber nachzudenken.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Zurgiffsrechte bestimmen bzw. testen

  Alt 17. Okt 2008, 17:48
Zitat von Dezipaitor:
Das Problem, dass ich jedoch hier sehe, ist dass jemand "Unerfahrener", diesen Code in einem Service einsetzt, [...]
Ich gehe einfach davon aus, dass Entwickler, die einen Systemdienst schreiben, wissen was sie tun
Zudem gibt es genug Beispiele dafür, wie man auf Serverseite als Client "handelt".
http://msdn.microsoft.com/en-us/libr...48(VS.85).aspx
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#13

Re: Zurgiffsrechte bestimmen bzw. testen

  Alt 17. Okt 2008, 18:13
Mir ist grad eingefallen, dass das ClientToken vom Typ "impersonate/thread token" sein muss. Sonst schlägt AccessCheck fehl (1309). D.h. man müsste das Prozesstoken erstmal duplizieren (impersonate) und dann an AccessCheck übergeben. ImpersonateSelf macht aber genau das und zudem verändert es das ThreadToken. D.h. nach dem AccessCheck müsste man es wieder zurücksetzen, sonst fährt man z.B. mit SYSTEM. D.h. ein Zurücksetzen sollte nur gemacht werden, wenn vorher kein Threadtoken existierte.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#14

Re: Zurgiffsrechte bestimmen bzw. testen

  Alt 19. Okt 2008, 18:01
Ich habe das mal angepasst, so dass man durch setzen des Threadtokens ein AccessCheck machen kann.

Delphi-Quellcode:
uses
  JwaWindows;

var
  GenericFileMapping : TGenericMapping = (
    GenericRead: FILE_GENERIC_READ;
    GenericWrite: FILE_GENERIC_WRITE;
    GenericExecute: FILE_GENERIC_EXECUTE;
    GenericAll: FILE_ALL_ACCESS
    );

function CheckAccessToFile(DesiredAccess: DWORD; const FileName: WideString;
    const OpenAsSelf : Boolean = true): Boolean;

var
  LengthNeeded : DWORD;
  SecurityDescriptor : PSecurityDescriptor;
  ClientToken2,
  ClientToken : THandle;
  AccessMask : DWORD;
  PrivilegeSet : TPrivilegeSet;
  PrivilegeSetLength : DWORD;
  GrantedAccess : DWORD;
  AccessStatus : BOOL;
begin
  Result := False;
  SetLastError(0);

  if not GetFileSecurityW(PWideChar(FileName), OWNER_SECURITY_INFORMATION or
    GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, nil, 0,
    LengthNeeded) and (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
    Exit;

  GetMem(SecurityDescriptor, LengthNeeded);
  try
    if not GetFileSecurityW(PWideChar(FileName), OWNER_SECURITY_INFORMATION or
      GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION,
      SecurityDescriptor, LengthNeeded, LengthNeeded) then
      Exit;

    //first try token assigned to the current thread
    if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY or
        TOKEN_IMPERSONATE or TOKEN_DUPLICATE, OpenAsSelf, ClientToken) then
    begin
      //otherwise use process token
      if (GetLastError() = ERROR_NO_TOKEN) and
         (not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY or
        TOKEN_IMPERSONATE or TOKEN_DUPLICATE, ClientToken)) then
        Exit;

      //convert to thread token.
      if not DuplicateToken(ClientToken, SecurityImpersonation, @ClientToken2) then
        exit;

      //close process token and switch them for further processing
      CloseHandle(ClientToken);

      ClientToken := ClientToken2;
    end;

    AccessMask := DesiredAccess;
    MapGenericMask(AccessMask, GenericFileMapping);
    PrivilegeSetLength := SizeOf(TPrivilegeSet);

    if AccessCheck(SecurityDescriptor, ClientToken, AccessMask,
      GenericFileMapping, PrivilegeSet, PrivilegeSetLength, GrantedAccess,
      AccessStatus) then
      Result := AccessStatus;

    CloseHandle(ClientToken);
  finally
    FreeMem(SecurityDescriptor);
  end;
end;
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#15

AW: Re: Zurgiffsrechte bestimmen bzw. testen

  Alt 15. Nov 2010, 14:37
Delphi-Quellcode:
function CheckAccessToFile(DesiredAccess: DWORD; const FileName: WideString;
    const OpenAsSelf : Boolean = true): Boolean;
Hallo, ich habe mal eine Frage zu dem Quelltext.

Welche Funktion genau hat OpenAsSelf.

Aus der Beschreibung im MSDN werde ich nicht ganz schlau:

True - Rechte vom Prozess werden ausgelesen
False - Rechte vom Thread werden ausgelesen

Aber mit der Beschreibung darunter kann ich nichts anfangen.
Ohne diesen Parameter (also Parameter = False -> Rechte vom Thread) kann er nicht auf das access Token des Theads zugreifen ???
Bahnhof

Zitat:
OpenAsSelf [in]
TRUE if the access check is to be made against the process-level security context.

FALSE if the access check is to be made against the current security context of the thread calling the OpenThreadToken function.

The OpenAsSelf parameter allows the caller of this function to open the access token of a specified thread when the caller is impersonating a token at SecurityIdentification level. Without this parameter, the calling thread cannot open the access token on the specified thread because it is impossible to open executive-level objects by using the SecurityIdentification impersonation level.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz