Einzelnen Beitrag anzeigen

CodeX

Registriert seit: 30. Okt 2004
471 Beiträge
 
Delphi 12 Athens
 
#1

Hinweis: Wenig bekanntes Sicherheitsproblem mit Services durch Delphi SvcMgr

  Alt 27. Aug 2014, 12:08
Ich war gerade ganz schön erstaunt, als ich festgestellt habe, dass bei der Installation eines mit Delphi erstellten Services der Pfad zur Datei keine Anführungszeichen enthält:
Code:
C:\program files (x86)\meineanwendung\meinservice.exe
Das führt dazu, dass wenn man eine Datei C:\program.exe erstellt, diese statt des Services mit entsprechenden Rechten ausgeführt wird! Ganz nebenbei funktioniert dann der eigene Service natürlich auch nicht mehr.

Auf der Suche danach, ob das Problem bekannt ist, bin ich lediglich auf diese beiden Einträge gestoßen:
http://qc.embarcadero.com/wc/qcmain.aspx?d=5728
http://qc.embarcadero.com/wc/qcmain.aspx?d=90093
Allerdings scheint sich danach nichts gerührt zu haben. Ich kann natürlich nur für Delphi bis XE sprechen, aber es kann gerne jemand mal in den neueren Versionen nachschauen.

Grundsätzlich liegt das Problem darin, dass SvcMgr.pas: TServiceApplication.RegisterServices intern CreateService(...) lediglich mit Path := ParamStr(0) aufruft, ohne das Ganze mit Anführungszeichen zu umschließen. Selber patchen wäre hier natürlich kein Problem, aber ich rate davon ab, denn nachher vergisst man den Patch wieder und das Problem kommt mit der nächsten Delphi-Installation wieder.

Stattdessen wäre folgender Workaround eine Lösung, indem der Service seinen Pfad direkt nach der Installation selbst korrigiert:
Delphi-Quellcode:
procedure TMyService.ServiceAfterInstall(Sender: TService);
var
  reg: TRegistry;
begin
  reg := TRegistry.Create(KEY_READ or KEY_WRITE);
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name, false) then
    begin
      // Vulnerability-Fix: In case the path contains spaces a file like c:\program.exe might be launched with system privileges
      reg.WriteString('ImagePath', '"' + GetModuleName(HInstance) + '"');

      // Description for the service is optional but highly recommended
      reg.WriteString('Description', 'Kurze Beschreibung');
  
      reg.CloseKey;
    end;
  finally
    reg.Free;
  end;
end;
Ich empfehle dringend jedem, der einen Service mit Delphis SvcMgr erstellt hat, diesen Fix einzubauen!
Nur Delphi schafft es, einem ein Lächeln zu schenken, wenn man sich beim Schreiben von := vertippt und stattdessen ein :) erscheint.
  Mit Zitat antworten Zitat