Lokale Software aktuell halten mit einem Auto-Updater
Hallo,
könnt Ihr bitte einmal kurz drüberschauen ob ich etwas vergessen habe.
Ich habe auf einigen verteilten PCs ohne Server eine Software.
Dafür würde ich gerne ein einfaches Auto-Update in Form eines Mini-Programmes (c#) erstellen.
Eine geplante Aufgabe beim Start, oder um 03:00 Uhr, startet das Programm c:\programme\zzz\autoupdate.exe
Download der Datei https://xxx.yyy.de/version.txt
Wenn die Versionsnummer in der Datei gleich ist wie die lokale Version der Exe-Datei dann Programm beenden
Sonst weiter
Download der Datei https://xxx.yyy.de/update.exe (Die Datei ist von mir digital signiert mit einem öffentlichen Code-Zertifikat)
Ist die Signatur gültig und von mir ausgestellt?
update.exe starten
Angriffsvektor A
Austausch der update.exe auf dem Web-Server.
Da Niemand eine Datei mit meiner Code-Signatur erstellen kann, passiert hier nix.
Angriffsvektor B
Austausch der c:\programme\zzz\autoupdate.exe.
Dazu benötigt man lokale Admin-Rechte.
Dann kann auch direkt ein RAT installieren.
Habe ich etwas übersehen?
Danke
Stefan
könnt Ihr bitte einmal kurz drüberschauen ob ich etwas vergessen habe.
Ich habe auf einigen verteilten PCs ohne Server eine Software.
Dafür würde ich gerne ein einfaches Auto-Update in Form eines Mini-Programmes (c#) erstellen.
Eine geplante Aufgabe beim Start, oder um 03:00 Uhr, startet das Programm c:\programme\zzz\autoupdate.exe
Download der Datei https://xxx.yyy.de/version.txt
Wenn die Versionsnummer in der Datei gleich ist wie die lokale Version der Exe-Datei dann Programm beenden
Sonst weiter
Download der Datei https://xxx.yyy.de/update.exe (Die Datei ist von mir digital signiert mit einem öffentlichen Code-Zertifikat)
Ist die Signatur gültig und von mir ausgestellt?
update.exe starten
Angriffsvektor A
Austausch der update.exe auf dem Web-Server.
Da Niemand eine Datei mit meiner Code-Signatur erstellen kann, passiert hier nix.
Angriffsvektor B
Austausch der c:\programme\zzz\autoupdate.exe.
Dazu benötigt man lokale Admin-Rechte.
Dann kann auch direkt ein RAT installieren.
Habe ich etwas übersehen?
Danke
Stefan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1889590704
Url: https://administrator.de/contentid/1889590704
Ausgedruckt am: 24.11.2024 um 05:11 Uhr
8 Kommentare
Neuester Kommentar
das hängt ja davon ab wie deine Software aufgebaut ist. Meine hat z.B. die Versionsnummer einfach im Code drinne und vergleicht die via Interface mit der Versionsnummer die ich aufm Server habe. Dabei gibt es 2 Optionen:
a) Optionales Update - wenn z.B. nur irgendwo nen Text geändert wurde
b) Notwendiges Update - wenn z.B. Interface-Strukturen geändert wurden
Wenn das zutrifft wird die neue Datei runtergeladen und die alte überschrieben.
Man könnte natürlich noch per Signatur das ganze verbessern - da ich aber dafür die Infra aktuell nicht habe passiert das (aktuell) noch nicht... Wobei da der Client eh egal wäre da der bei mir keine Daten gross speichert, der läuft eher als agent ...
a) Optionales Update - wenn z.B. nur irgendwo nen Text geändert wurde
b) Notwendiges Update - wenn z.B. Interface-Strukturen geändert wurden
Wenn das zutrifft wird die neue Datei runtergeladen und die alte überschrieben.
Man könnte natürlich noch per Signatur das ganze verbessern - da ich aber dafür die Infra aktuell nicht habe passiert das (aktuell) noch nicht... Wobei da der Client eh egal wäre da der bei mir keine Daten gross speichert, der läuft eher als agent ...
Mögliche Schwachstelle in autoupdate.exe und Austausch der version.txt.
Die autoupdate.exe und version.txt können durch ein einfaches Powershell-Skript eingespart werden, wenn man das jeweils letzte Update lokal liegen lässt und den HTTP-Zeitstempel mit dem lokalen vergleicht, um ggf. den Download auszulösen.
Grüße
Richard
Die autoupdate.exe und version.txt können durch ein einfaches Powershell-Skript eingespart werden, wenn man das jeweils letzte Update lokal liegen lässt und den HTTP-Zeitstempel mit dem lokalen vergleicht, um ggf. den Download auszulösen.
Grüße
Richard
Hallo,
ich habe mal was ähnliches gemacht, allerdings nur Firmenintern.
Hier ein paar Punkte die ich bei mir später dazugebaut habe und vielleicht als anregungen dienen:
1. In der version.txt könnte außer der Versionsnummer noch direkt der download link, eine Checksumme und ein Beschreibungstext der Änderungen enthalten sein. So kann für den User auch vor dem Update angezeit werden was sich ändern wird.
2. Durch die Angabe des Links zum Download kann sich bei Änderung auch kein Problem ergeben.
3. Durch die Angabe einer Checksumme kann nach dem Download geprüft werden ob die datei evtl. fehlerhaft ist.
Gruß...
ich habe mal was ähnliches gemacht, allerdings nur Firmenintern.
Hier ein paar Punkte die ich bei mir später dazugebaut habe und vielleicht als anregungen dienen:
1. In der version.txt könnte außer der Versionsnummer noch direkt der download link, eine Checksumme und ein Beschreibungstext der Änderungen enthalten sein. So kann für den User auch vor dem Update angezeit werden was sich ändern wird.
2. Durch die Angabe des Links zum Download kann sich bei Änderung auch kein Problem ergeben.
3. Durch die Angabe einer Checksumme kann nach dem Download geprüft werden ob die datei evtl. fehlerhaft ist.
Gruß...
Wenn ein Angreifer die version.txt austauscht, was ja auf einem Proxy trivial möglich ist, wird die autoupdate.exe dadurch mit beliebigen Daten gefüttert. Das Parsing der vorgesehenen Textdatei mag zwar einfach erscheinen, das Kompilat ist deshalb aber noch nicht gegen beliebige Eingaben gesichert und wohl kaum ausgiebig getestet.
Das Problem lässt sich bei Online-Updates prinzipiell nicht vermeiden, aber die Verwendung von Zeitstempeln reduziert die Angriffsfläche auf die ohnehin genutzten Web-Requests.
Ja, das zusätzliche Risiko ist minimal (bzw. besteht viel gravierender nochmal bei der Validierung der Signatur). Aber Sicherheit kann nicht allein durch die richtige Anwendung von Methoden gewährleistet werden. Sonst würden Code-Reviews die Sicherheit garantieren. Du könntest das Risiko weiter minimieren, wenn Du die version.txt nur verarbeitest, wenn sie kleiner als 4 Byte ist (oder kleiner 3 und auf die Version 100 verzichtest; oder gleich 1 und hexadezimal versionierst).