Entwickler-Ecke
Internet / Netzwerk - Update funktion?
bruce185 - Sa 10.01.09 20:30
Titel: Update funktion?
Hallo,
wie mache ich ambesten ein Update funktion für mein Programm?
Also, es soll nach neuere Version geprüft werden, wenn vorhanden, dann soll die .exe Datei vom Server heruntergeladen und anschließend ersetzt werden.
Was mich Interessieren würde, wie man auch die .exe Datei überschreiben kann?
Eigentlich kann das ja nicht so leicht funktionieren, da die .exe Datei ja verwendet wird.
Man könnte das ja so machen:
Die .exe Datei vom Server in ein Temp Ordner herunterladen, nach beendigung des heruntergeladenen Datei Programm beenden, Datei im Verzeichniss Kopieren, indem sich das Programm befindet und dann das Programm wieder starten.
Könnte man das so realisieren, das es alles automatisch gemacht wird oder gibt es einen besseren Weg?
Vielen Dank schonmal.
MfG
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 10.01.2009 um 23:55
Xion - So 11.01.09 10:48
ich hab das so realisiert:
Wir das Programm gestartet, wird nicht die eigentliche exe sonder eine Updater.exe gestartet. Die ist nur dazu da zu gucken, ob ne neue Version auf dem Server ist. Diese kopiert ggf. die neue exe runter und startet diese dann.
GTA-Place - So 11.01.09 10:56
Und noch cooler :cool: ist es, wenn das Programm eine Batch-Datei anlegt, die die Kopierfunktionen durchführt, diese startet, sich beendet und nach Durchlauf wieder das Programm startet. Das ist sehr einfach zu realisieren (Stringlist) und es muss keine zusätzliche Exe mitgeliefert werden.
Zur Prüfung ob eine neue Version vorhanden ist, legt man sich eine Textdatei auf den Server, in dem die aktuelle Version steht (oder eben ein PHP-Script). Diese wird im Programm ausgelesen und mit der programminternen Version verglichen.
delfiphan - So 11.01.09 11:45
Ich würde es so machen: Programm prüft nach, ob Update existiert. Falls ja, das Update-Programm ausführen und sich selbst schliessen. Das Update-Programm führt das Programm nach dem Update wieder aus. Falls ein Update existiert gibt's halt ein kleiner Umweg, dafür ist der normale Fall, wo es kein Update gibt, ohne Umweg.
Das Update-Programm sollte entweder *Updater.exe heissen oder entsprechende Massnahmen treffen, damit unter Vista der UAC Dialog kommt.
BenBE - So 11.01.09 14:12
Um einen Updater zu schreiben ist eigentlich mehr notwendig, als nur eine aktuellere Datei von einem Webserver downzuloaden und diese lokal auch zu ersetzen. Es gab dieses Jahr auf dem 25C3 eine ganze Reihe hrelevanter Angriffe auf sowohl das DNS als auch SSL und TCP, mit denen man einer Anwendung ohne großen Aufwand beliebigen Schadcode "als Update" unterschieben konnte. Also bitte, wenn ihr schon Updater schreibt, dann bitte RICHTIG und bevor irgendwas ausgeführt wird, erstmal überprüfen, was da denn feines runtergeladen wurde, ob das vollkommen echt ist (am besten mit gültigem Code-Signing-Zertifikat, UNTERSCHRIEBENER Prüfsumme (Einfach ein MD5\SHA1\SHA256\SHA512\Whirlpool-Hash reicht nicht, da leicht berechenbar beim Austausch der Datei.
Ferner: Sollte man immer schauen, ob es bereits funktionierende, fertige und geprüfte Lösungen gibt, die die oben genannten Kriterien erfüllen und damit nicht als Malware-Importer missbraucht werden können.
GTA-Place - So 11.01.09 15:19
Ja ne ist klar. Ich kann ja auch gleich noch bei jedem Update den Autor verständigen, damit dieser vorbeikommt und zuschaut. BenBe, du hast devinitiv zu viel 25C3 geguckt ;-). Für ein kleines Programm ist das mit dem Aufwand verglichen ziemlich mit Kanonen auf Spatzen schießen. Wer sollte da bitte schön Schadcode einschleusen?
BenBE - So 11.01.09 15:27
Jemand, der dein Programm nicht mag und lieber deinen Rechner in seinem kleinen Botnetz teilhaben lassen möchte.?
bruce185 - So 11.01.09 15:53
Danke euch für die vielen antworten.
Das mit dem Überprüfen nach neue Version und das herunterladen von neue Dateien, funktioniert schon.
Ich habe alles auf meinem Root Server und habe dazu noch eine Textdatei erzeugt, was alles gedownloadet wird, z.B.
downloads.txt
DURL: downloads\test.exe Output: C:\Temp\test.exe
DURL: downloads\test.dll Output: C:\Temp\test.dll
und mein Programm downloadet sie dann auch nacheinander.
Nur wie funktioniert das eigentlich mit der Batch Datei genau?
Also, ich erstelle nach Downloadende eine Batch Datei mit den Informationen, dann lasse ich mein Programm beenden und rufe diese Batch Datei auf, aber wie lasse ich diese Dateien dann von C:\Temp in meinem Ordner Kopieren?
Mein Ordner kann ich ja mit Application.ExeName ermitteln.
Vielen Dank schonmal.
MfG
GTA-Place - So 11.01.09 16:20
Ich hab gerade mal bei meinen Programmen nachgeguckt. Wichtig ist noch diese Funktion hier:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function ANSI2ASCII(AText: String): String; begin {$IFDEF WIN32} CharToOEM(@AText[1], @AText[1]); {$ELSE} AnsiToOEM(@AText[1], @AText[1]); {$ENDIF}
Result := AText; end; |
(Quelle: unbekannt :? )
Bei Umlauten in Ordnernamen (z.B. C:\Users\Fabian Gärtner) gibt es sonst ganz große Probleme. Aber jetzt erstmal die wichtigen Parts:
Delphi-Quelltext
1:
| SList.Add('@if exist "' + Tmp + '" del "' + Tmp + '" /F'); |
Erstmal prüfen ob die Exe noch da ist (Tmp =
ExtractFilePath(ParamStr(0))). Dann löschen erzwingen (/F).
Delphi-Quelltext
1:
| SList.Add('@copy "C:\Temp\Update.exe" "' + Tmp + '"'); |
Das würde jetzt die Datei an die richtige Stelle kopieren und gleich richtig benennen. Da könnte man noch ein paar Parameter mitgeben (mal
copy /? in der Konsole eingeben). Schlussendlich dann noch:
Delphi-Quelltext
1: 2: 3: 4:
| SList.Text := ANSI2ASCII(SList.Text); SList.SaveToFile('TempVerzeichnis\HDUpdater.bat');
ShellExecute(MainForm.Handle, 'open', 'TempVerzeichnis\HDUpdater.bat'), '', '', SW_SHOWNORMAL); |
Ich glaub das sind die wichtigsten Vorgänge. Schön ist natürlich immer noch eine Textausgabe mit @echo für den Anwender, wenns mal wieder länger dauert.
bruce185 - So 11.01.09 20:44
Vielen Dank @GTA-Place.
Es klappt sehr gut bis auf eins, und zwar lässt sich das Programm nicht mehr starten nach dem Kopieren, das Fenster bleibt einfach auf ohne fehlermeldung.
Der Pfad zu der .exe Datei stimmt, ich habs überprüft, aber trotzdem lässt sich das Programm nicht starten.
Meine .bat Datei:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| @echo off echo Update... mkdir "entfernt" @if exist "entfernt" del "entfernt" /F @copy "entfernt" "entfernt" mkdir "entfernt" @if exist "entfernt" del "entfernt" /F @copy "entfernt" "entfernt" mkdir "entfernt" @if exist "entfernt" del "entfernt" /F @copy "entfernt" "entfernt" mkdir "entfernt" @if exist "entfernt" del "entfernt" /F @copy "entfernt" "entfernt" Start "C:\Dokumente und Einstellungen\Username\Desktop\Test\Test.exe" |
Alles andere funktioniert bereits, bis auf das starten des Programms.
Danke schonmal.
MfG
GTA-Place - So 11.01.09 22:35
Mh... da kann ich jetzt keinen Fehler finden. Vielleicht weiß jemand anders Rat.
Noch ein Tipp: Man sollte das immer so implementieren, dass später auch neue Dateien geupdatet werden können. Also beispielsweise sollte in einer Schleife die Dateinamen aus der Textdatei geupdatet werden. Ich habe den Fehler gemacht, dass ich immer nur die Exe aktualisiert habe. Als später neue Dateien zukamen, konnte keiner Updaten, denn es wurde ja immer nur die Exe aktualisiert und die anderen Dateien ignoriert.
jaenicke - Mo 12.01.09 00:38
Was ich in der Batchdatei vermisse: Normalerweise sollte diese in einer Schleife die Exe versuchen zu löschen bis das erfolgreich ist (das Programm, das ja die Batch aufruft, also beendet ist). Danach kann man dann die heruntergeladene(n) Datei(en) ans Ziel kopieren (und dabei die alte Exe überschreiben).
bruce185 - Mo 12.01.09 06:17
Danke euch.
Ich habe mein Problem selber gelöst indem ich die Anführungszeichen zum Pfad entfernt habe, womit ich das Programm starten lasse:
Delphi-Quelltext
1: 2:
| cd C:\Dokumente und Einstellungen\Username\Desktop\Test\ start Test.exe |
Ich wechsel zuerst in dem Pfad und dann lasse ich das Programm starten.
MfG
alzaimar - Mo 12.01.09 08:07
Löschen kann man eine EXE nicht, wenn sie läuft, aber umbenennen. :mrgreen:
Wie wäre es mit folgender Strategie?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| Procedure UpdateVersion (aDownloadSource : String); Var sAppPath : String; sAppName, sNewAppName, sOldAppName : String;
Begin sAppPath := ExtractFilePath (ParamStr(0)); sNewAppName := 'NewVersion.EXE'; sAppName := ExtractFileName (ParamStr(0)); sOldAppName := StrReplace (sAppName, '.EXE','_OLD.EXE',[rfCaseInsensitive]); Download(aDownloadSource, sAppPath+sNewAppName); If FileExists (sAppPath+sOldAppName) Then DeleteFile (sAppPath+sOldAppName); RenameFile (ParamStr(0), sOldAppName); RenameFile (sAppPath+sNewAppName, sAppName); End; |
Nun wird nach einem Neustart automatisch die neu heruntergeladene Version gestartet. Die dann alte Version steht als 'xxx_OLD.EXE' weiterhin zur Verfügung. Einen Neustart kann man mit einem kleinen Batch erzwingen ('START '+ParamStr(0)). Ich habs nicht getestet, aber es sollte in etwa so funktionieren.
Wenn das läuft, kannst Du noch BenBEs Sicherheitsüberlegungen mit einbeziehen.
BenBE - Mo 12.01.09 12:03
alzaimar hat folgendes geschrieben : |
| Löschen kann man eine EXE nicht, wenn sie läuft, aber umbenennen. :mrgreen: |
Und riskieren, False-Positives bei der Heuristik vom Virenscanner zu erzeugen ;-) Yeah! :mrgreen:
alzaimar hat folgendes geschrieben : |
| Wenn das läuft, kannst solltest Du noch BenBEs Sicherheitsüberlegungen mit einbeziehen. |
So heißt das bitte ;-)
delfiphan - Do 15.01.09 00:09
Ich denke kaum, dass es bei einem "nicht professionell" geschriebenen/verwendeten Programm viel Sinn macht, das Update wirklich kryptographisch sicher zu gestalten. Der Benutzer hat ja von Anfang an keine Garantie, dass das Programm einwandfrei ist (wenn man schon von so extremen Sicherheitsmassnahmen spricht).
Aber wenn, dann ist das ganze auch nicht so wahnsinnig kompliziert. Im Prinzip reicht es, wenn du das Update-File signierst oder eine Signatur irgendwann im Update-Process separat mitschickst. Mit der Signatur kannst du feststellen, dass die Datei von dir erstellt wurde und von niemandem verändert wurde. Dafür sind digitale Signaturen ja gemacht und gelten als sicher.
Man muss natürlich annehmen können, dass die ursprüngliche (alte) Version und der PC sauber ist und nicht gehackt wurde (der Public Key ist dort ja enthalten). Davon darf man aber glaube ich ausgehen, ansonsten ist dein System ja sowieso schon gehackt und die Sicherheit beim Update nützt dir auch nichts mehr ;)
Was das jetzt mit DNS/TCP/SSL Attacken auf sich hatte, weiss ich jetzt nicht. Und: Ob es selbstsigniert ist oder nicht dürfte für die kryptographische Sicherheit überhaupt keinen Unterschied machen (ausser, dass irgend ein externes Tool, dem du vertraust, im besten Fall was anderes anzeigt. Wenn du willst, dass Windows die Signatur erkennt und deinem Programm vertraut, dann klar, aber darum geht es hier ja nicht)
Die Signaturprüfung kannst du selbst mit existierenden Open-Source Delphi-Komponenten machen. Das ganze natürlich völlig kostenlos. Oder wenn du ein kommerzielles Zertifikat hast wohl auch irgendwie über eine Windows DLL.
matze - Do 15.01.09 11:21
alzaimar hat folgendes geschrieben : |
| Löschen kann man eine EXE nicht, wenn sie läuft, aber umbenennen. :mrgreen: |
Seit wann geht das denn? habs grad probiert und bin völlig verblüfft, dass es geht. OK das letzte Mal, dass ich sowas versucht habe war unter ähhh. Win95...
BenBE hat folgendes geschrieben : |
| Und riskieren, False-Positives bei der Heuristik vom Virenscanner zu erzeugen ;-) Yeah! :mrgreen: |
Wieso das? Erkläre doch mal bitte!
jaenicke - Do 15.01.09 12:58
matze hat folgendes geschrieben : |
BenBE hat folgendes geschrieben : | | Und riskieren, False-Positives bei der Heuristik vom Virenscanner zu erzeugen ;-) Yeah! :mrgreen: | Wieso das? Erkläre doch mal bitte! |
Naja, genauso kannst du ja eine fremde Exe umbenennen, die gerade läuft, um eine andere unterzuschieben, die dann beim nächsten Start benutzt wird. Es dürfte allerdings für die Heuristik nicht so einfach sein dies zu erkennen, schließlich handelt es sich erstmal nur um eine normale Dateioperation. Erst wenn das Programm das tatsächlich macht, wäre es gut möglich das zu erkennnen. Ob dann eine Virenwarnung kommt weiß ich nicht. (Bei mir meldet sich die Firewall.)
// EDIT:
matze hat folgendes geschrieben : |
alzaimar hat folgendes geschrieben : | | Löschen kann man eine EXE nicht, wenn sie läuft, aber umbenennen. :mrgreen: | Seit wann geht das denn? habs grad probiert und bin völlig verblüfft, dass es geht. OK das letzte Mal, dass ich sowas versucht habe war unter ähhh. Win95... |
Das geht auch mit DLLs, so spart man sich den abgesicherten Modus, wenn man eine benutzte Datei ersetzen will. (Bei manchen kann man ja nicht einfach den Prozess beenden.)
Wii360 - Mi 15.04.09 22:08
Hallo! ICh wollte mich einmsiche, weil ich vor kurzem vor dem gleichen probklem stand und deswegen den Code dazu habe:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| IdFTP1.Get('/DelphiProjects/VersionInfo.txt','Info.txt'); Version.LoadFromFile('Info.txt'); DeleteFile('Info.txt'); if (strtoint(Version[0])>strtoint(VersionInfo)) then begin if (MessageDlg('Deine Version ist nicht mehr aktuell! Du hast die Version "'+VersionsString+'". Version "'+version[1]+'" ist aktuell. Um das Update aufzuspielen drücke bitte [Ja], möchtest du das nicht, oder es manuell machen drücke [Nein].',mtWarning,[mbyes,mbno],0)=mryes) then begin Updated:=true; IdFTP1.Get('/DelphiProjects/Upgrade/Upgrader/Upgrader.exe',Dir+'/Upgrader.exe'); idFTP1.Get('/DelphiProjects/Upgrade/Programmfiles/Teat.exe',Dir+'/_Teat.exe'); end; end; |
Und dann macht der Upgrader.exe folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.DoUpgrade; var clear:Tstringlist; begin clear:=Tstringlist.create; DeleteFile('Teat.exe'); RenameFile('_Teat.exe','Teat.exe'); clear.SaveToFile('upgraded.dat'); MessageDlg('Teat wurde erfolgreich Upgegraded. Das Programm wird nun gestartet.',mtConfirmation,[mbok],0); WaitMessage; shellexecute(handle,'open',PChar('Teat.exe'),nil,nil,SW_SHOWNORMAL); Application.Terminate; end; |
Und wenn dann Teat.exe bemerkt das die Datei "upgraded.dat" existiret wird Upgrader.exe und upgraded.dat gelöscht. Fertig :D
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| GetDir(0,dir); if FileExists(dir+'\upgraded.dat') then begin DeleteFile('upgraded.dat'); DeleteFile('Upgrader.exe'); end; |
Achso bei mir Funktioniert das alles über meinen eigenen FTP-Server (Da ich Auch websites programmiere hab ich so einen!)
MFG Wii360
GTA-Place - Mi 15.04.09 22:13
Dann hast du aber in deinem Programm die Logindaten hinterlegt und damit hätte so ziemlich jeder Zugriff auf deinen FTP-Server, gewollt?
BenBE - Mi 15.04.09 22:19
Für den Download reicht Anonymous-FTP, bzw. ein Login über die Programm-Seriennummer.
Der größere Bug ist aber (und das macht Conficker besser): Du überprüfst dein heruntergeladenes Update nicht. Mir fallen aus dem Stegreif 3 Angriffe ein, mit denen ich Dir ein gefälschtes Update unterschieben kann:
1. DNS verbiegen (macht unserere Regierung ja grad :mrgreen:)
2. Via Firewall deinen FTP-Traffic auf meinen Server umlenken
3. In deinen FTP-Traffic mein Update injecten
Weitere Variationen problemlos möglich.
Ansonsten muss ich
GTA-Place Recht geben: FTP ohne SSL oder TLS ist sicherheitstechnisch Harakiri! Wenn dann noch ohne Sicherheits-Signatur oder CodeSigning-Zertifikat der Anwendung, hast Du gleich verloren. Wenn Updater, dann bitte richtig!
Aya - Mi 15.04.09 23:13
BenBE hat folgendes geschrieben : |
1. DNS verbiegen (macht unserere Regierung ja grad :mrgreen:)
2. Via Firewall deinen FTP-Traffic auf meinen Server umlenken
3. In deinen FTP-Traffic mein Update injecten |
Magst du mir verraten wie man das anstellt OHNE zugriff auf den ziel-rechner des users zu haben?
Aya~
BenBE - Mi 15.04.09 23:31
Für Nummer 1 nehme man DNS Cache Poisoning oder Frau Zensursula, für die anderen Beiden Punkte nehme man eine Manipulation des Transitweges. Die letzteren Beiden werden insbesondere in Bereichen, wo man mehr oder weniger Kontrolle über die Transitwege hat (z.B. in einem öffentlichen Funknetz, ...) stark begünstigt. Hier wären Angriffe via BGP (größere Transitnetze) oder RIPv1\2 möglich.
Aya - Mi 15.04.09 23:51
BenBE hat folgendes geschrieben : |
| Für Nummer 1 nehme man DNS Cache Poisoning oder Frau Zensursula, für die anderen Beiden Punkte nehme man eine Manipulation des Transitweges. Die letzteren Beiden werden insbesondere in Bereichen, wo man mehr oder weniger Kontrolle über die Transitwege hat (z.B. in einem öffentlichen Funknetz, ...) stark begünstigt. Hier wären Angriffe via BGP (größere Transitnetze) oder RIPv1\2 möglich. |
Ja gut, das bezieht sich aber alles nur auf die nutzung freier WLans etc.. und selbst da ist es bei Hotspots von T-Mobile sehr unwahrscheinlich das sowas passiert ;)
BenBE - Do 16.04.09 06:54
Aya hat folgendes geschrieben : |
BenBE hat folgendes geschrieben : | | Für Nummer 1 nehme man DNS Cache Poisoning oder Frau Zensursula, für die anderen Beiden Punkte nehme man eine Manipulation des Transitweges. Die letzteren Beiden werden insbesondere in Bereichen, wo man mehr oder weniger Kontrolle über die Transitwege hat (z.B. in einem öffentlichen Funknetz, ...) stark begünstigt. Hier wären Angriffe via BGP (größere Transitnetze) oder RIPv1\2 möglich. |
Ja gut, das bezieht sich aber alles nur auf die nutzung freier WLans etc.. und selbst da ist es bei Hotspots von T-Mobile sehr unwahrscheinlich das sowas passiert ;) |
Nein, eben nicht. Selbst wenn Du bei mir im LAN wärst oder ich anderweitig dafür sorgen kann, dass deine Verbindung über von mir kontrollierte Systeme geht, kann ich das tun.
Und das letzte Mal, wo ich mir T-Mobile-Hotspots angeschaut habe, waren die Unverschlüsselt ;-)
Aya - Do 16.04.09 09:30
BenBE hat folgendes geschrieben : |
Aya hat folgendes geschrieben : | BenBE hat folgendes geschrieben : | | Für Nummer 1 nehme man DNS Cache Poisoning oder Frau Zensursula, für die anderen Beiden Punkte nehme man eine Manipulation des Transitweges. Die letzteren Beiden werden insbesondere in Bereichen, wo man mehr oder weniger Kontrolle über die Transitwege hat (z.B. in einem öffentlichen Funknetz, ...) stark begünstigt. Hier wären Angriffe via BGP (größere Transitnetze) oder RIPv1\2 möglich. |
Ja gut, das bezieht sich aber alles nur auf die nutzung freier WLans etc.. und selbst da ist es bei Hotspots von T-Mobile sehr unwahrscheinlich das sowas passiert ;) |
Nein, eben nicht. Selbst wenn Du bei mir im LAN wärst oder ich anderweitig dafür sorgen kann, dass deine Verbindung über von mir kontrollierte Systeme geht, kann ich das tun.
Und das letzte Mal, wo ich mir T-Mobile-Hotspots angeschaut habe, waren die Unverschlüsselt ;-) |
Ja, aber ich gehe in der Regel nur bei freuden etc in's LAN... denen vertrau ich insoweit das sie sowas nicht tun.
Eine andere möglichkeit das mein Traffic über dich läuft fällt mir eigentlich nicht ein, insofern sind diese attacken die du da nennst in meinen Augen extrem unwahrscheinlich. Und selbst wenn jemand sowas machen sollte, setzt das immernoch vorraus das er genau die update funktion von diesem einem programm, welches du warum auch immer in einem fremden netzwerk aktualisierst kennt ;)
Aya~
BenBE - Do 16.04.09 09:57
Ich vertraue nicht einmal meinem eigenen Netz. Port 25 ist sowohl nach innen, wie auch nach außen, zu. Nur benötigte Ports sind offen, alles andre wird blockiert. (Wer jetzt fragt, wie ich eMails versende: Port 587 über den Submission-Port meines Servers).
Und selbst wenn es sehr unwahrscheinlich sein dürfte, dass mal jemand "mal eben" auf Verdacht eine Domain verbiegt: Bei ausreichend großen Projekten kann sowas für einen Angreifer durchaus interessant werden. Und wenn Du Ziel einer Targeted Attack wirst, eröffnest Du mit einem unsicherem Updater dem Angreifer unnötig Angriffsfläche. SSL-Certs gibt's inzwischen sowohl kostenlos, wie auch kommerziell. Und eine Digitale Signatur dazu zu verwenden, um nachvollziehen zu können, dass man ein echtes Update hat, ist ja nicht so schwer. Wie gesagt: Macht Conficker auch. Zudem: Wo es möglich ist (TortoiseSVN, GnuPG, TrueCrypt) wird VOR der Installation eines Updates erstmal die Echtheit des Installers geprüft. Und TortoiseSVN ist auf den ersten Blick nicht mal ein üblicher Verdächtiger in Sachen Sicherheit.
Du downloadest doch auch nicht einfach von jeder beliebigen Internet-Seite Windows-Updates oder Kernel-Releases, ohne zu prüfen, dass die auch echt sind. Aber wenn dein Programm GENAU DAS macht, ist das plötzlich in Ordnung. Welch Doppeldenk!
Wii360 - Do 16.04.09 10:29
@GTA-Place
Hmm .. Ich verstehe nicht genau wie du meinst ... Also die Logindaten sind bei dem Objekt angegeben, aber natürlich hat niemand zu griff auf die Datenbank, die Werden Ja im Fertigen Programm nirgends im Klartext stehen!
So hat niemand Zugriff, da SOFORT nach bekommen des Updates die Verindung auch geschlossen wird. Oder weißt du zufällig das es Möglichkeiten gibt das Passwort abzufangen, bzw. eine bessere alternative auf den FTP-Server zuzugreifen?
@BenBE:
Ich tue über meinen FTP aber leider auch noch andere Sachen Abwickeln (Z.b. Benutzerstatistiken speichern) deswegen komme ich um Ein Passwort und Benutzername wohl nicht drumherum! Oder?
BenBE - Do 16.04.09 10:48
Wii360 hat folgendes geschrieben : |
| Hmm .. Ich verstehe nicht genau wie du meinst ... |
Ich meine, dass Du die Authentizität deiner Updates
VOR dem Installieren prüfen solltest. Ein Weg wäre
Code Signing [
http://wiki.cacert.org/wiki/CodesigningCert]
Wii360 hat folgendes geschrieben : |
| Also die Logindaten sind bei dem Objekt angegeben, |
30 Sekunden und ich hab deinen FTP-Zugang ... nicht mal.
Passwörter gehören nicht an unsichere Stellen!
Und jede Anwendung IST unsicherer Code!
Wenn überhaupt, mach Anonymous FTP ODER sorg dafür, dass der Zugang durch den Client gegen Angreifer geschützt ist (z.B. Auth über SSL).
Wii360 hat folgendes geschrieben : |
| aber natürlich hat niemand zu griff auf die Datenbank, |
GANZ sicher??? :mrgreen:
Wii360 hat folgendes geschrieben : |
| die Werden Ja im Fertigen Programm nirgends im Klartext stehen! |
DFM-Dateien stehen im Klartext im Programm. Und die Eigenschaften stehen im Klartext in der DFM --> Die Passwörter stehen im Klartext im Programm.
Wii360 hat folgendes geschrieben : |
| So hat niemand Zugriff, |
Nicht mal berechtigte Clients :mrgreen:
Wii360 hat folgendes geschrieben : |
| da SOFORT nach bekommen des Updates die Verindung auch geschlossen wird. |
WO soll da die Sicherheit liegen? RST- und FIN-Pakete kann man ganz einfach filtern. Wobei Hooks gehen hier auch ganz einfach ;-)
Wii360 hat folgendes geschrieben : |
| Oder weißt du zufällig das es Möglichkeiten gibt das Passwort abzufangen, |
Die üblichen Verdächtigen: Wireshark und WinPCap.
Wii360 hat folgendes geschrieben : |
| bzw. eine bessere alternative auf den FTP-Server zuzugreifen? |
Nutz SSL UND eine vernünftige Authentifizierung (z.B. Digest, CRAM-MD5 oder Client Cert). Am besten aber: Unterlasse den Zugriff und stelle entsprechende Web-Scripte bereit. FTP ist einfach nur grottig.
@
Wii360: Gib mir einmal solch eine EXE per PN und ich versuch mal, die Login-Daten für deinen Server rauszusuchen ...
Wenn Du sogar "Benutzerstatistiken" auf deinem Server damit schreibfähig machst, ist dein Sicherheitsloch nicht nur der Updater ...
Wii360 - Do 16.04.09 11:11
Oke!
ICh kann froh sein das ich das Programm noch nicht auf meinen Webspace gepostet habe :D
ICh werds mal per SSL und Auth-dingsbums versuchen!
Danke :)
MFG Wii360
BenBE - Do 16.04.09 11:19
SSL alleine bringt Dir auch nichts, wenn Du dann nicht korrekt prüfst. Sonst kann ich nämlich meinem Server auch einfach SSL mit nem beliebigen andren Zertifikat beibringen, und dein Updater nimmt das immer noch. Die beste Lösung hier wäre wirklich, sowohl SSL als auch CodeSigning zur Absicherung zu nehmen.
Wii360 - Do 16.04.09 11:45
Okey! ;)
Kann es sein das SSL erst ab Indy9 Unterstützt wird?
Da ich Indy7 habe und ich von SSL nicht benutzen kann... aber ich denkte das ist durch ein Update (:P) machbar... (offentlich)
Und das mit codesigning mach ich das dan auch mit Indy?
BenBE - Do 16.04.09 12:06
Nope. Das mit dem Code Signing hat nichts mit der Übertragung zu tun, sondern damit, dass du beim Herausgeben der Anwendung einmal eine überprüfbare Signatur erzeugst, die jeder, der den öffentlichen Schlüssel dazu hat, überprüfen kann. Mehr Infos unter dem Link, den ich gegeben hab, auch wenn sich das speziell auf die Verwendung bei CAcert (die übrigens kostenlos sind) bezieht.
Unter D7 laufen auch die Indy 10, auf die Du dann gleich updaten solltest, wenn Du schon solch einen Sprung machst.
Wii360 - Do 16.04.09 12:09
Oh ... achsoo!
Okee werd ich versuchen ..
THX nochmol
delphi10 - Di 21.04.09 16:18
Ich grab das nochmal aus, da mich das Thema auch beschäftigt hat. Meine Lösung:
1. Download der neuen Version vom Server
2. In der laufenden Version:
Delphi-Quelltext
1: 2:
| Application.Terminate; ShellExecute(Application.Handle, 'open',PChar(Neue Version), nil, nil,SW_Normal); |
Alte Version wird sauber beendet und kann gelöscht werden, neu Version startet.
Funktioniert tadellos, Batch-Dateien oder andere Klimmzüge sind nicht erforderlich. Allerdings jetzt nicht unter Vista getestet. Kann das mal jemand machen, hab gerade kein Vista installiert.
Xentar - Di 21.04.09 16:26
Äh, das steht doch grad gar nicht mehr zur Diskussion?
Außerdem wird durch diese Lösung eine neue exe angelegt (neuer Name). Somit stimmen evtl. vorhandene Verknüpfungen nicht mehr..
passiv - Di 21.04.09 17:37
da reicht dann ja einfach eine kurze abfrage, ob der ist-name der exe mit dem soll-name übereinstimmt, wenn nicht einfach das RenameFile aus den ersten paar posts anwenden ;)
... oder? :lol:
MDX - Di 21.04.09 18:41
Man kann auch einfach per HTTP Downloaden lassen???
Dann braucht man weder ne Verschlüsselung, noch ein Passwort noch sonst was spezielles?
Xentar - Di 21.04.09 19:11
passiv hat folgendes geschrieben : |
| da reicht dann ja einfach eine kurze abfrage, ob der ist-name der exe mit dem soll-name übereinstimmt, wenn nicht einfach das RenameFile aus den ersten paar posts anwenden ;) |
Ja, aber dann bräuchte man wieder nen Updater, bzw. eine Bat-Datei oder sowas.
Und genau die hat
delphi10 ja vermieden ;)
| Zitat: |
Man kann auch einfach per HTTP Downloaden lassen???
Dann braucht man weder ne Verschlüsselung, noch ein Passwort noch sonst was spezielles?
|
Lies die Diskussion nochmal.
Es ging darum, zu überprüfen, dass das Update auch "echt" ist, und dir nicht einfach irgendeine Datei untergeschoben wird.
Noob23 - Di 21.04.09 19:58
Man kann's aber am Ende auch übertreiben und sich selbst ein Protokoll schreiben, weg von FTP, SSL usw. - Weg von Standards eben.
Je weniger von der Sache bekannt ist desto mehr hat der "Hacker" damit zu kämpfen was überhaupt abläuft!
Jede öffentliche Verschlüsselungsmethode wird irgendwann geknackt werden, oder liege ich da falsch?
Es ist zwar gut jede Sicherheitslücke zu vermeiden aber für kleine Freeware-Tools sehe ich das jetzt nicht so tragisch (wenn die Nutzerzahl nicht gerade imens hoch ist). Schlimmer sind doch da wohl die unverschlüsselten W-Lan-Netzwerke!
Gruß
Noob23
passiv - Di 21.04.09 20:00
Xentar hat folgendes geschrieben : |
passiv hat folgendes geschrieben : | | da reicht dann ja einfach eine kurze abfrage, ob der ist-name der exe mit dem soll-name übereinstimmt, wenn nicht einfach das RenameFile aus den ersten paar posts anwenden ;) |
Ja, aber dann bräuchte man wieder nen Updater, bzw. eine Bat-Datei oder sowas.
Und genau die hat delphi10 ja vermieden ;) |
wenn ich nur wüsste, was du meinst ...
ich meins so:
- Download, die Exe heißt jetzt "downloaded.exe"
-
- Jetzt weiß ich nicht, ob die Anwendung noch läuft, wenn sie zu diesem Punkt kommt (müsste schon, weils sonst nicht gehn würde ...) ShellExecute(Application.Handle,'open',PChar('download.exe'),nil,nil,SW_NORMAL);
- da nach meinem verständnis jetzt die download.exe läuft muss er die ja im Form.OnCreate (kann latürnich auch später sein) löschen und sich selbst umbenennen ...
wenn ich nicht falsch liege brauche ich hiermit keine updater, geschweige denn eine bat-datei ...
delphi10 hat folgendes geschrieben : |
| Alte Version wird sauber beendet und kann gelöscht werden, neu Version startet. |
Und hier bestätigt sich mein Verdacht, dass man auch hier nicht um das löschen irgendeiner datei herumkommt, auf das ich in meinem post hinaus wollte
bis dann
BenBE - Di 21.04.09 20:07
Noob23 hat folgendes geschrieben : |
| Man kann's aber am Ende auch übertreiben und sich selbst ein Protokoll schreiben, weg von FTP, SSL usw. - Weg von Standards eben. |
Tu das, und du wirst Dir unnötig viele Probleme schaffen ... und seien's nur diverse Firewalls, die deinen Updater sperren.
Noob23 hat folgendes geschrieben : |
| Je weniger von der Sache bekannt ist desto mehr hat der "Hacker" damit zu kämpfen was überhaupt abläuft! |
Oftmals verstehen Hacker die Programme besser, als der Autor :mrgreen: Auch ohne Quelltext.
Noob23 hat folgendes geschrieben : |
| Jede öffentliche Verschlüsselungsmethode wird irgendwann geknackt werden, oder liege ich da falsch? |
Security by Obscurity IST UNSICHER. Punkt.
Noob23 hat folgendes geschrieben : |
| Es ist zwar gut jede Sicherheitslücke zu vermeiden aber für kleine Freeware-Tools sehe ich das jetzt nicht so tragisch (wenn die Nutzerzahl nicht gerade imens hoch ist). |
Sich ein SSL-Zert zu organisieren, eine SSL-Verbindung bereitstellen, und beides im Updater sauber zu verdrahten, sollte nicht DER Aufwand sein. Da ist die Größe der Nutzerbasis egal. Ein Updater, der nicht prüft, was er da installiert, kommt bei mir nicht drauf. Auch hier: Punkt.
Noob23 hat folgendes geschrieben : |
| Schlimmer sind doch da wohl die unverschlüsselten W-Lan-Netzwerke! |
Man darf doch wohl ein wenig Spaß haben ;-)
@
passiv: In deiner Abfolge fehlt zwischen 1. und 2. die Validierung der heruntergeladenen Datei.
Noob23 - Di 21.04.09 20:25
BenBE hat folgendes geschrieben : |
| Oftmals verstehen Hacker die Programme besser, als der Autor :mrgreen: Auch ohne Quelltext. |
Jaja, die alten 'Reverse Engineerer' :P
Sogesehen müsste man die Exe auch noch Crypten ;)
(Ich glaub hierzu mach ich demnächst einen eigenen Thread auf)
BenBE hat folgendes geschrieben : |
| Ein Updater, der nicht prüft, was er da installiert, kommt bei mir nicht drauf. |
Woher willst du sicher wissen das er das tut.
Aber alle Angriffe die du angesprochen hast beruhen doch auf der "MAN-IN-THE-MIDDLE" Methode, oder etwa nicht?
Glaubst du ernsthaft das dies so oft vorkommt? - Kann ich mir ehrlich gesagt nicht vorstellen, ausser du bist vielleicht gerade in der Nähe :P
Gruß
Noob23
passiv - Di 21.04.09 20:30
BenBE hat folgendes geschrieben : |
@ passiv: In deiner Abfolge fehlt zwischen 1. und 2. die Validierung der heruntergeladenen Datei. |
tja, ich habs von
delphi10 übernommen, gedanklich war der punkt ja da ;)
und so schnell kommen mir keine programme mit update über die finger, weil ich von servern und was dafür alles nötig wäre noch nicht genügend verstehe ... ja, so kanns gehen :roll:
Noob23 hat folgendes geschrieben : |
| Glaubst du ernsthaft das dies so oft vorkommt? - Kann ich mir ehrlich gesagt nicht vorstellen, ausser du bist vielleicht gerade in der Nähe :P |
hähähähä, genau :D
BenBE - Di 21.04.09 20:35
Noob23 hat folgendes geschrieben : |
BenBE hat folgendes geschrieben : | | Oftmals verstehen Hacker die Programme besser, als der Autor :mrgreen: Auch ohne Quelltext. |
Jaja, die alten 'Reverse Engineerer' :P |
Nope, die Leute, die wissen, was ein PC im Inneren macht, und die nicht nur irgendwelchen Kot
khacken...
Noob23 hat folgendes geschrieben : |
| Sogesehen müsste man die Exe auch noch Crypten ;) |
Glaube lag auf der uall-Skala bei 5-30 Minuten, je nach crypter ...
Noob23 hat folgendes geschrieben : |
| (Ich glaub hierzu mach ich demnächst einen eigenen Thread auf) |
Lies Dir einfach den Thread zur Sinnlosigkeit von Kopierschutzmaßnahmen durch, bzw. die diversen Crackme-Threads ...
Noob23 hat folgendes geschrieben : |
BenBE hat folgendes geschrieben : | | Ein Updater, der nicht prüft, was er da installiert, kommt bei mir nicht drauf. |
Woher willst du sicher wissen das er das tut. |
Indem ich ihm versuche, ein falsches Update unterzujubeln ???
Noob23 hat folgendes geschrieben : |
Aber alle Angriffe die du angesprochen hast beruhen doch auf der "MAN-IN-THE-MIDDLE" Methode, oder etwa nicht?
Glaubst du ernsthaft das dies so oft vorkommt? - Kann ich mir ehrlich gesagt nicht vorstellen, ausser du bist vielleicht gerade in der Nähe :P |
Die Funktionsweise von DNS, BGP und RIP\OSPF ist Dir schon bekannt?
passiv hat folgendes geschrieben : |
BenBE hat folgendes geschrieben : | @ passiv: In deiner Abfolge fehlt zwischen 1. und 2. die Validierung der heruntergeladenen Datei. | tja, ich habs von delphi10 übernommen, gedanklich war der punkt ja da ;) |
Vor dem Posten: Prüfen, was man geschrieben hat :mahn: :mrgreen:
Edit: Noch mal kurz was korrigiert :P
passiv hat folgendes geschrieben : |
| und so schnell kommen mir keine programme mit update über die finger, weil ich von servern und was dafür alles nötig wäre noch nicht genügend verstehe ... ja, so kanns gehen :roll: |
Mir auch nicht. Aber wenn Leute an soetwas arbeiten, solltenn sie für solche Dinge sensibilisiert werden, sonst werden immer wieder die gleichen Fehler gemacht. 7zip hatte z.B. genau dieses Problem, wo letzten Juli\Aug im gesamten DNS kurzfristig ein Patch eingespielt wurde. Da haben Angreifer diesen Fehler der DNS-Server für DNS-Poisoning ausgenutzt und damit die Namensauflösung des 7zip-Updaters umgebogen --> 7zip hat Malware "geupdated" ;-)
passiv hat folgendes geschrieben : |
Noob23 hat folgendes geschrieben : | | Glaubst du ernsthaft das dies so oft vorkommt? - Kann ich mir ehrlich gesagt nicht vorstellen, ausser du bist vielleicht gerade in der Nähe :P | hähähähä, genau :D |
s.o. bzgl. DNS-Poisoning.
MDX - Di 21.04.09 21:49
Xentar hat folgendes geschrieben : |
| Zitat: | Man kann auch einfach per HTTP Downloaden lassen???
Dann braucht man weder ne Verschlüsselung, noch ein Passwort noch sonst was spezielles?
|
Lies die Diskussion nochmal.
Es ging darum, zu überprüfen, dass das Update auch "echt" ist, und dir nicht einfach irgendeine Datei untergeschoben wird. |
Achso, na dann halt ich mal meine Klappe =)
mabuch - Di 28.04.09 00:58
Ich habe Eure Diskussion interessiert gelesen, nutze selber code signing, um meinen Nutzern garantieren zu können, dass "ich ich bin" und würde von BenBE sehr gerne wissen, WIE ich die Signatur einer .exe-Datei mit einem Delphiprogramm auslese. (Also nachdem meine Software ein Update runtergeladen hat und nun wissen möchte, ob es auch wirklich von MIR ist)
Danke
Martin
mabuch - Mi 29.04.09 09:04
Danke für den Hinweis auf den C-Code. Mit dem dort stehenden Hinweis auf die WinVerifyTrust API habe ich sogar eine Implementierung für Delphi gefunden:
http://www.delphipraxis.net/post329268.html
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!