AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Corona-App mit Delphi und fehlende Zertifikatsprüfung
Thema durchsuchen
Ansicht
Themen-Optionen

Corona-App mit Delphi und fehlende Zertifikatsprüfung

Ein Thema von Bbommel · begonnen am 2. Apr 2020 · letzter Beitrag vom 3. Apr 2020
Antwort Antwort
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#1

Corona-App mit Delphi und fehlende Zertifikatsprüfung

  Alt 2. Apr 2020, 13:37
Hallo zusammen,

es gab in den letzten Tagen rund um Delphi gute und schlechte Nachrichten zugleich und eine Frage, die sich für meine eigene Entwicklung daraus ergibt:

Vielleicht habt ihr ja auch gelesen, dass es jetzt eine Corona-App gibt, mit der die Übermittlung der Testergebnisse deutlich beschleunigt werden soll. Bei Facebook bin ich gerade darüber gestolpert, dass diese App offenbar mit Delphi entwickelt wurde - cool. Post von Idera dazu, Post in der Facebook-Gruppe "Delphi developer" dazu.

Leider stellte sich dann raus, dass diese App unsicher ist, weil sie zwar (natürlich) verschlüsselt über HTTPS mit ihrem Server spricht, dabei aber das Zertifikat nicht prüft und somit problemlos ein Men-In-The-Middle-Angriff möglich ist. Das gab es ausführlich bei Heise.

Daraus ergibt sich für mich folgende Frage: ich nutze auch mehr und mehr Web-Services, eigene oder von Partnerunternehmen, per HTTPS - mal SOAP, mal REST. Ich habe mir zugegebenermaßen bisher auch über Zertifikate keine Gedanken gemacht, weil ich davon ausgehe, dass die SOAP- und REST-Bibliotheken von Delphi und die Net-Bibliotheken, die diese wiederum nutzen, sich schon selbst um die Zertifikate kümmern. Das heißt, ich ging eigentlich davon aus, dass ich eine Exception geworfen bekomme, wenn ich per https auf eine Ressource im Netz zugreifen will und das Zertifikat passt nicht.

Mache ich da gerade den gleichen Fehler wie die Leute von BS Software? Oder haben die (mutmaßlich!) etwas anderes genutzt als die Standard-Bibliotheken von Delphi und müssten daher ihre Zertifikate selber prüfen? Vielleicht liest hier ja jemand mit und kann uns sogar an der Erkenntnis bzw. der potentiellen Falle teilhaben lassen.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Corona-App mit Delphi und fehlende Zertifikatsprüfung

  Alt 2. Apr 2020, 13:49
Die Delphi HTTP-Komponenten, welche seit einigen Zeit auch den Unterbau der REST-Komponenten darstellen, prüfen die Gültigkeit eines serverseitigen Zertifikates. Basis ist der jeweilige Zertifikats-Speicher des Betriebssystems. Falls diese Prüfung ergibt, dass das Zertifikat nicht gültig ist, wird das Ereignis "OnValidateServerCewrtificate" ausgelöst, damit der Entwickler eine passende Reaktion geben kann.

Siehe auch:
http://docwiki.embarcadero.com/RADSt...er_Zertifikate
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#3

AW: Corona-App mit Delphi und fehlende Zertifikatsprüfung

  Alt 2. Apr 2020, 13:55
Danke für die schnelle Antwort. Aber was ist, wenn dieses Ereignis nicht implementiert ist? Wird dann standardmäßig die Verbindung abgelehnt oder akzeptiert?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.445 Beiträge
 
Delphi 12 Athens
 
#4

AW: Corona-App mit Delphi und fehlende Zertifikatsprüfung

  Alt 2. Apr 2020, 14:48
In dem Fall wird eine Exception ausgelöst.
Delphi-Quellcode:
procedure THTTPClient.DoValidateServerCertificate(LRequest: THTTPRequest);
var
  LServerCertAccepted: Boolean;
  LServerCertificate: TCertificate;
begin
  LServerCertAccepted := False;
  if Assigned(FValidateServerCertificateCallback) or Assigned(FValidateServerCertificateEvent) then
  begin
    LServerCertificate := DoGetSSLCertificateFromServer(LRequest);
    if not LServerCertificate.IsDefined then
      raise ENetHTTPCertificateException.CreateRes(@SNetHttpGetServerCertificate);
    if Assigned(FValidateServerCertificateCallback) then
      FValidateServerCertificateCallback(Self, LRequest, LServerCertificate, LServerCertAccepted)
    else
      FValidateServerCertificateEvent(Self, LRequest, LServerCertificate, LServerCertAccepted);
  end
  else
    raise ENetHTTPCertificateException.CreateRes(@SNetHttpInvalidServerCertificate);
  if not LServerCertAccepted then
    raise ENetHTTPCertificateException.CreateRes(@SNetHttpServerCertificateNotAccepted)
  else
    DoServerCertificateAccepted(LRequest);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
146 Beiträge
 
#5

AW: Corona-App mit Delphi und fehlende Zertifikatsprüfung

  Alt 2. Apr 2020, 22:59
Hallo,

Basis ist der jeweilige Zertifikats-Speicher des Betriebssystems.
und genau da geht es los Vielleicht hat die Firma, in der man arbeitet, eine eigene CA generiert und diese dann per GPO zu den vertrauenswürdigen Zertifizierungsstellen hinzugefügt? Dann würde keine Exception geworfen werden, das CA-Zertifikat ist vetrauenswürdig und ein MITM "Angriff" wäre damit quasi unbemerkt möglich. Das wird gerne bei Firewalls für Content Scanning gemacht.

Ich habe selber eine Anwendung im Einsatz, in der auf den Fingerprint des Zertifikates geprüft wird - es wird NUR dieses eine Zertifikat akzeptiert. Das hat natürlich den Nachteil, dass ich eine neue (EXE-) Version mit jedem Zertifikatswechsel ausrollen muss. Alternativ könnte man natürlich den Fingerprint des Intermediate oder des Root-Zertifikates prüfen - bei einem Renew müsste man dann aber bei dem gleichen Aussteller bleiben (gibt es eigentlich für einen Aussteller auch ggf. mehrere Root-Zertifikate?)

Was ich ad-hoc nicht weiss ist, ob man prüfen kann, ob sich ein CA-Zertifikat in den (von Windows mitgelieferten) "Vertrauenswürdigen Stammzertifizierungsstellen" oder in "Eigene Zertifikate" des Windows-Zertifikatsspeichers befindet. Alternativ könnte man natürlich auf alle Fingerprints der (von Windows mitgelieferten) "Vertrauenswürdigen Stammzertifizierungsstellen" prüfen. Das sollte auf alle Fälle klappen.

Grüße
Sebastian

Nachtrag: zum Thema Content-Scanning - der Heise Artikel schreibt sogar, dass dem so ist ("das nicht von einer einer vertrauenswürdigen CA stammt").
Nachtrag 2: Es ist ja gar nicht schlimm, das Zertifikat muss ja nicht zwingend von einer vertrauenswürdigen CA kommen, es sollte aber kryptografisch aktuell sein und die App sollte den Fingerprint prüfen. Wenn die CA geprüft wird, wäre sogar ein Wechsel des Zertifikates kein Problem; CAs haben ja i.d.R. eine deutlich längere Gültigkeit. Es wäre ja denkbar ein Zertifikat für api.example.org mit meiner eigenen CA zu signieren und im Programm auf den Fingerprint der CA zu prüfen. Solange das sauber implementiert ist, kann keiner mitlesen und es spielt keine Rolle, ob das von einer vertrauenswürdigen CA kommt...
Nachtrag 3: Damit habe ich mich noch nicht beschäftigt, aber man könnte auch den Fingerprint des Zertifikates im DNS hinterlegen und die DNS-Abfragen mittels DNSSec sichern. Auch das sollte MITM Attacken vermeiden, eine kurze Google Recherche ergab das hier: https://kb.mailbox.org/display/MBOKB...SL-Zertifikate

Geändert von slemke76 ( 2. Apr 2020 um 23:16 Uhr) Grund: Nachtrag ergänzt
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.087 Beiträge
 
Delphi 12 Athens
 
#6

AW: Corona-App mit Delphi und fehlende Zertifikatsprüfung

  Alt 3. Apr 2020, 08:05
Interessante Frage.
Der Event liefert dies als Zertifikats-Daten
http://docwiki.embarcadero.com/Libra...t.TCertificate

Wie holt man sich denn daraus den Fingerprint, muss ich das gesondert in einem HTTP-Request machen, oder steht Alles zur Verifikation schon hier in dem Record drin ?

Falls man irgendwas holen muss, ich bin ja während der Abfrage noch im OnValidateServerCertificate Event, und kann das nicht asynchron machen.

Oder bekomme ich den richtigen Fingerprint irgendwie lokal vom OS geliefert ?
Ich denke bei iOS/Android wird es da (wie immer) ziemliche Hürden geben.
  Mit Zitat antworten Zitat
slemke76

Registriert seit: 29. Mär 2005
Ort: Quakenbrück
146 Beiträge
 
#7

AW: Corona-App mit Delphi und fehlende Zertifikatsprüfung

  Alt 3. Apr 2020, 08:46
Guten Morgen,

das kann ich dir leider nicht ohne weiteres beantworten, aber bei einem schnellen Blick kommt bei System.Net.URLClient.TCertificate ja nicht allzuviel zurück.
Ich benutze (bereits seit Jahren) die Secureblackbox Komponenten. Auch dort gibt es ein .OnCertificateValidate - die Funktion, die aufgerufen wird, hat folgende Parameter:

Delphi-Quellcode:
procedure TMyClass.SSLHandlerCertificateValidate(
  Sender: TObject; Certificate: TElX509Certificate; var Validity: TSBCertificateValidity; var Reason: TSBCertificateValidityReason);
In dem Event empfiehlt der Hersteller, die (SecureBlackbox) Funktion "TElX509CertificateValidator" zu nutzen. Die stellt sicher, dass die Zertifikatskette gültig ist und kein Zertifikat zurück gerufen worden ist - es wird also auch die CRL abgerufen - haben wir noch gar nicht erwähnt, ist aber auch wichtig!

Wenn du die Eigenschaften des Zertifikates (also ob es sich genau um *dieses eine* Zertifikat handelt) prüfen möchtest, brauchst du "TElX509CertificateValidator" im Prinzip nicht, die notwendigen Daten sind in dem Certificate-Objekt enthalten.

Du musst für dich erst einmal eine Grundsatzentscheidung treffen, wie du die Kommunikation sichern willst:
1. Willst du "nur" eine gültige Kette sicherstellen?
2. Willst du auf ein bestimmtes Zertifikat prüfen (ggf. in Ergänzung zu 1.)
3. Was willst du in der Zertifikatskette prüfen?


Quellen:
https://www.secureblackbox.com/kb/he...evalidate.html
https://www.secureblackbox.com/kb/he...validator.html

Grüße
Sebastian

Nachtrag:
Ich meine, dass das OnCertificateValidate Event bei den Secureblackbox Komponenten mehrfach gefeuert wird - für jedes Zertifikat in der Kette. Ganz 100% bin ich mir aber nicht mehr.
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:43 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