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 user profile iconNarses: 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]); {32Bit}
  {$ELSE}
    AnsiToOEM(@AText[1], @AText[1]); {16Bit}
  {$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]);
// 1. Herunterladen der neuen Version
  Download(aDownloadSource, sAppPath+sNewAppName);
// 2. Löschen des EXE-Backups (falls vorhanden)
  If FileExists (sAppPath+sOldAppName) Then DeleteFile (sAppPath+sOldAppName);
// 3. Erstellen des EXE-Backups
  RenameFile (ParamStr(0), sOldAppName);
// 4. Umbennen der neuen Version in ParamStr(0)
  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

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
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...

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
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:
// Überprüfe Version
    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
        // Update aufspielen
        Updated:=true;
        IdFTP1.Get('/DelphiProjects/Upgrade/Upgrader/Upgrader.exe',Dir+'/Upgrader.exe');
        idFTP1.Get('/DelphiProjects/Upgrade/Programmfiles/Teat.exe',Dir+'/_Teat.exe');
        // END Update aufspielen
        end;
      end;
    // END Überprüfe Version

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 user profile iconGTA-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

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconWii360 hat folgendes geschrieben Zum zitierten Posting springen:
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]

user profile iconWii360 hat folgendes geschrieben Zum zitierten Posting springen:
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).

user profile iconWii360 hat folgendes geschrieben Zum zitierten Posting springen:
aber natürlich hat niemand zu griff auf die Datenbank,

GANZ sicher??? :mrgreen:

user profile iconWii360 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconWii360 hat folgendes geschrieben Zum zitierten Posting springen:
So hat niemand Zugriff,

Nicht mal berechtigte Clients :mrgreen:

user profile iconWii360 hat folgendes geschrieben Zum zitierten Posting springen:
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 ;-)

user profile iconWii360 hat folgendes geschrieben Zum zitierten Posting springen:
Oder weißt du zufällig das es Möglichkeiten gibt das Passwort abzufangen,

Die üblichen Verdächtigen: Wireshark und WinPCap.

user profile iconWii360 hat folgendes geschrieben Zum zitierten Posting springen:
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.

@user profile iconWii360: 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), nilnil,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

user profile iconpassiv hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile icondelphi10 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

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconpassiv hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile icondelphi10 ja vermieden ;)
wenn ich nur wüsste, was du meinst ...

ich meins so:
  1. Download, die Exe heißt jetzt "downloaded.exe"

  2. Delphi-Quelltext
    1:
    Application.Terminate                    

  3. 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);
  4. 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 ...

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
Jede öffentliche Verschlüsselungsmethode wird irgendwann geknackt werden, oder liege ich da falsch?

Security by Obscurity IST UNSICHER. Punkt.

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
Schlimmer sind doch da wohl die unverschlüsselten W-Lan-Netzwerke!

Man darf doch wohl ein wenig Spaß haben ;-)

@user profile iconpassiv: In deiner Abfolge fehlt zwischen 1. und 2. die Validierung der heruntergeladenen Datei.


Noob23 - Di 21.04.09 20:25

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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)


user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
@user profile iconpassiv: In deiner Abfolge fehlt zwischen 1. und 2. die Validierung der heruntergeladenen Datei.
tja, ich habs von user profile icondelphi10 ü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:

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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...

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
Sogesehen müsste man die Exe auch noch Crypten ;)

Glaube lag auf der uall-Skala bei 5-30 Minuten, je nach crypter ...

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
(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 ...

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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 ???

user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
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?

user profile iconpassiv hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
@user profile iconpassiv: In deiner Abfolge fehlt zwischen 1. und 2. die Validierung der heruntergeladenen Datei.
tja, ich habs von user profile icondelphi10 ü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

user profile iconpassiv hat folgendes geschrieben Zum zitierten Posting springen:
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" ;-)

user profile iconpassiv hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNoob23 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
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


BenBE - Di 28.04.09 09:39

Hab jetzt auf die Schnelle keinen Code zum Validieren da, denk aber mal, dass man das über die Crypto-API von M$ biegen können wird:

Aber mal ne Anleitung, wie das generell funktioniert mit dem CodeSigning:
http://www.matthew-jones.com/articles/codesigning.html

Von M$ find ich grad erstmal nur eine Command Line-Variante:
http://msdn.microsoft.com/en-us/library/ms537364(VS.85).aspx

Edit: Hier noch etwas C-Code für's Portieren:
http://blog.csdn.net/erwin1984/archive/2008/12/29/3635260.aspx


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