In C++ geschriebene Selbstaktualisierungsdemonstration. Enthält die Loader-, Client-, Server- und Signaturtools zur sicheren Bereitstellung automatischer Updates für Win32-Desktopanwendungen.
Native Win32-Desktopanwendungen verfügen nicht über den Luxus eines systemintegrierten Paketmanagers zur Verwaltung automatischer Updates. Dieses Framework bietet eine funktionierende Demonstration, wie Updates sicher und effizient bereitgestellt und verarbeitet werden können.
Ein sich selbst aktualisierendes System sollte den Sicherheitszielen Integrität und Authentizität genügen. Dieses Framework verwendet 4096-Bit-RSA-Schlüssel, um die SHA-256-Signatur für die Update-Daten zu signieren und zu überprüfen. Der öffentliche Schlüssel wird zur Überprüfung in die Client-Binärdatei eingebettet. Unter der Annahme, dass die Erstauslieferung der Software über eine vertrauenswürdige Quelle erfolgt, sind die einzigen gültigen Herausgeber von Updates diejenigen, die Zugriff auf den privaten Schlüssel haben.
Update-Daten werden über UDP übertragen. Der Hauptfaktor bei dieser Entscheidung war die Reduzierung des Serverspeicher-Overheads durch TCP-Verbindungen (mit reduzierter CPU-Last als Bonus). Der erwartete Speicheraufwand beträgt ungefähr:
(Update File Size) + (Max Connections) * 80 bytes
Die Aktualisierungsdaten werden direkt im Speicher gespeichert, um einen Zugriff auf die Festplatte zu vermeiden. Der Client und der Server überprüfen den Besitz der IP, indem sie kryptografische 64-Bit-Tokens austauschen. Jeder Verbindung wird eine begrenzte Menge an Netzwerkbandbreite zugewiesen, bevor sie gedrosselt wird. Jede IP-Adresse ist auf eine maximale Anzahl gleichzeitiger Verbindungen beschränkt. Diese Funktionen schwächen eine Reihe häufiger Netzwerkangriffe ab:
Die Verhinderung von Man-in-the-Middle-Angriffen basiert auf den Authentizitätsgarantien des Update-Systems.
Auf dem Server müssen keine umfangreichen kryptografischen Funktionen ausgeführt werden (wie bei HTTPS), da Vertraulichkeit kein Sicherheitsziel für Software-Updates ist – die Update-Daten sind nicht vertraulich.
Auf der Client-Seite werden keine Anstrengungen unternommen, die Download-Geschwindigkeit zu begrenzen. Bei der Integration in Ihre Anwendung sollten Anstrengungen unternommen werden, um die Senderate basierend auf verworfenen Paketen und Verbindungslatenz dynamisch anzupassen.
Die Demo-Server-Architektur läuft auf einem einzelnen Port/einzelnen Thread. Mehrere Serverinstanzen könnten pro Thread auf unterschiedlichen Ports oder unterschiedlichen Systemen ausgeführt werden (wobei die Aushandlung bei einem Lastausgleichsmodul erfolgt, mit dem sich der Client zuerst verbindet (für die Bereitstellung umfangreicher Updates).
Aktualisierungsdaten werden für eine einzelne Datei unverändert gesendet. Wenn Sie Unterstützung für das Patchen mehrerer Dateien, Delta-Updates oder Komprimierung benötigen, sollten Sie eine ausführbare Datei mit den Dienstprogrammen und Daten zur Handhabung dieser Funktionen bereitstellen (und sie vom Update-System selbst entkoppeln).
Die Sicherheitsgarantien gelten nur so lange, wie der private Schlüssel sicher bleibt. Im Rahmen des Frameworks ist keine Methode zum Widerrufen von Schlüsseln enthalten (da diese eine externe Überprüfung und Vertrauen von einem anderen Anbieter erfordern würde).
updater.sln
.Release
.client.dll
und benennen Sie es in update.dll
umsigntool.exe
aus, um pub.h
, pub.key
, pri.key
und update.sig
zu generieren.public_key
Daten in client_updater.cpp
durch den Inhalt aus der generierten pub.h
server.exe
und loader.exe
um das Update zu demonstrieren.