Hallo,
auf Grund der Tatsache, dass ich immer wieder sehe, dass besonders Anfänger sich an eigenen Updatern bzw. Patchern versuchen, dachte ich mir, dass ich hier mal 'nen Thread dazu aufmache.
Zunächst: Viele Entwickler möchten ihre Programme mit einem eigenen Updater ausstatten. Dies ist eine gute Idee, denn das hat den Vorteil, dass man einmal ein Paket hochlädt und schon können alle Benutzer das Programm updaten, ohne groß Updates herunterzuladen und manuell zu verwalten.
Jedoch bringt exakt das meist eine riesige Sicherheitslücke mit sich und es hängt da weitaus mehr dran, als gedacht. Jetzt stellt euch vor, Ihr ladet ein Updatepaket auf einen Server hoch und ein Client möchte sich dieses nun laden. Dieser Client sitzt in einem öffentlichen Netzwerk, zum Beispiel an einem Flughafen o. ä. (Man muss zwar sagen, dass es mittlerweile auch dort Sicherheitsstandards gibt, aber natürlich nicht überall und vor allem ist das ja nicht die einzige Gefahrenquelle.)
Nun gut, BTT: Mit diesem Client im (W)LAN sitzt nun ein Angreifer, der sich sowas zu Nutze macht, um dem Client einen Virus oder generell Malware unterzujubeln.
Wie geht das?
Kurze Version
Der Hacker sitzt einfach im selben lokalen Netzwerk und leitet nun den Datenverkehr zu sich um (ARP-Spoofing nennt man das mit Fachbegriff), indem er die ARP-Tabelle manipuliert und seine MAC-Adresse dort angibt, um dann eben jene für den Client oder Router vorgesehenen Pakete zu empfangen. Dann tauscht er das Paket aus und gibt dieses infizierte Paket an den Client weiter. Der bemerkt wahrscheinlich nicht mal, was gerade geschieht.
Lange Version
Es gibt zwei Protokolle, die ziemlich wichtig für den Datenaustausch im Internet sind: IP und Ethernet. IP überträgt Daten von einer IP-Adresse zur anderen, Ethernet überträgt Daten von MAC-Adresse zu MAC-Adresse. Die IP-Adresse ist wohl ziemlich bekannt und hat in IPv4 (Version 4) eine Länge von 32 Bit und kann jeweils eine bestimmte Anzahl an Netzen und Hosts ansprechen. Die Netze können entsprechend mit der Subnetzmaske nochmal unterteilt werden, aber das soll jetzt nicht das Thema sein. Zudem gibt es dann noch speziell reservierte Adressen, wie 127/8, was der Loopback ist und zum eigenen Rechner zurückführt. Auch gibt's noch entsprechend festgelegte, private Adressen für eure lokalen Netzwerke zu Hause (192.168/16, 10/8, ...). Alle verfügbaren IPv4-Adressen auf der Welt sind übrigens belegt. Der DHCP-Server ist allerdings dennoch verpflichtet, euch immer eine Adresse zuzuweisen. Insgesamt sind 2^32 = 4.294.967.296 (knapp 4,3 Milliarden) IPv4-Adressen verfügbar, um andere Hosts anzusprechen. Von denen können aber natürlich nicht alle benutzt werden, da einige eben reserviert sind. Somit bleiben 3.707.764.736 (knapp 3,7 Milliarden). Seit einiger Zeit gibt es daher IPv6 (Version 6), was aber trotzdem noch nicht so extrem weit verbreitet ist. IPv6 hat eine Länge von 128 Bit und somit 2^128 = 3,4028237e+38 mögliche Adressen. Zudem bietet es noch einige andere Neuheiten, die das Protokoll etwas einfacher machen. Mit der IP-Adresse kann man Hosts auf der ganzen Welt ansprechen. Sollte eine Domain vorhanden sein, löst erst ein DNS-Server entsprechend die Domain zu einer IP auf, damit die Kommunikation stattfinden kann. Ethernet ist ebenfalls ein Protokoll, das für LANs konzipiert ist. Es befindet sich daher 1 Layer unter IP. Im lokalen Netzwerk wird es benutzt und verwendet eben MAC-Adressen zur Adressierung. Diese stehen fest in der Netzwerkkarte.
Um nun die lokale IP-Adresse eines Hosts in eine MAC umzuwandeln, benötigt es das Protokoll ARP bei IPv4 bzw. NDP bei IPv6.
ARP ist das Address Resolution Protocol und löst entsprechend IPs zu MAC-Adressen auf wie z. B. DNS das mit Domains zu IPs regelt. Wenn Ihr nun Daten an den Router über Ethernet sendet, dann habt Ihr zunächst dessen lokale IP-Adresse (Default-Gateway), die vom DHCP vergeben wurde. ARP wird nun die Adresse abrufen und die steht dann bei euch in der ARP-Tabelle. Die Einträge dort werden automatisch in einer bestimmten Spanne aktualisiert, wenn diese nicht zwischenzeitlich wieder verwendet wurden. Ihr könnt ja mal die Kommandozeile starten und
Schaltet sich nun ein Angreifer ein, passiert folgendes: Er wird entsprechend für die Router-IP seine MAC-Adresse (also die seines Computers) eintragen und zukünftig alle für den Router vorgesehenen Pakete empfangen und kann diese kontrollieren (manipulieren, mitlesen, weiterleiten, nicht weiterleiten, auf seinen eigenen Server weiterleiten, etc. pp). Dies ist möglich, da Einträge einfach überschrieben werden können. Auffällig ist dann, dass meistens die selbe MAC-Adresse für unterschiedliche IPs in der ARP-Tabelle auftaucht. Natürlich muss das nicht nur der Router, sondern kann jeder beliebige Host im LAN sein, um wirklich alle Verbindungen zu kontrollieren.
In dem Fall kontrolliert der Angreifer nur die Kommunikation zum Router, aber nicht zwischen den einzelnen Hosts:

Bild von Wikipedia, da man das dort so schön sehen konnte.
Und nochmal der ganze Vorgang, da der in dieser Grafik relativ leicht erklärt ist (Quelle):

Also nochmal: Habt Ihr LAN, habt Ihr Ethernet. Und dann kann das passieren. Die Daten eines Clients werden also möglicherweise nie beim Server ankommen (außer, der MITM lässt es zu und liest nur mit). Entsprechend kann man nur die Symptome behandeln und nachwirkend die Daten entsprechend validieren. Verbindet Ihr euch nun mit dem Router, um aus dem Internet Updates für eine Software von einem Server zu laden, würde der Provider normalerweise den Rest für euch regeln und Ihr würdet die Daten bekommen. Schaltet sich nun ein Hacker dazwischen und gibt sich als Router aus, so kann das nun eben auch Malware anstelle eines Updates sein.
Konklusion: Das kann passieren, wenn der Updater selbst geschrieben wurde und keine Sicherheit mit sich bringt. Von den Folgen nun ganz zu schweigen, der Client wird sich im Besten Fall nur beschweren und das wird weitere Nutzer abschrecken usw.
Insgesamt nennt man diesen Angriff auch Janus- bzw. Man-in-The-Middle-Angriff.
Nicht nur das ist ne Gefahrenquelle, natürlich kann das auch passieren, wenn euer Webspace/Server gekapert wird o. ä. Dann ist das Problem noch größer, denn dann würde wirklich jeder Client infiziert. Dies war vor ner Zeit ja erst passiert, als WhatsApp, Avira usw. geknackt wurden und am 30. März 2015 der puush-Dienst.
Wie kann man sich schützen und was kann man machen?
Das Schlüsselwort zur Sicherheit heißt "Signierung". Hierbei wird dem Archiv des Pakets, besser gesagt den Bytes des Archivs eine Signatur zugeordnet und diese wird anschließend beim Client überprüft. Wenn das Paket ausgetauscht wird, dann ändern sich die Bytes des Archivs, was eine ungültige Signatur zur Folge hat.
Um das zu prüfen, muss also eine entsprechende Signatur gebildet werden, die nur mit den richtigen Schlüsseln erstellt und wieder verifiziert werden kann. Ändern sich nun Daten, würde der Client das bei einer falschen Signatur merken und könnte die Daten verwerfen, ohne sie überhaupt auszuführen. Das gilt natürlich nicht nur für Updates, sondern alle Binaries, die Ihr irgendwo ladet und ausführt.
Das Schöne ist, dass dies alles asymmetrisch funktioniert, sodass ein kompletter Austausch auch unmöglich ist, da es mehrere Schlüssel gibt.
Da die RSA-Klasse hierbei hochkomplexe Mathematik anwendet, ist es bei richtiger Implementierung unmöglich 4096 Bit zu knacken.

Nun, damit man nun so eine Signatur hat, rate ich wie es schon so oft gemacht wurde zum Updatesystem.NET oder (etwas Eigenwerbung *hust*) nUpdate, da das Updatesystem.NET auf der offiziellen Seite down ist und halt auch einfach nicht mehr aktuell ist.
Wenn Ihr euch mal selber in den Bereich der Kryptographie und Signierung einlesen wollt, hier mal ein paar Quicklinks:
de.wikipedia.org/wiki/Asymmetrisches_Kryptosystem
msdn.microsoft.com/de-de/library/aa331388(v=vs.71).aspx
msdn.microsoft.com/de-de/library/55yk5665(v=vs.110).aspx
Fazit:
Eigene Updater so gut es geht vermeiden und etwas sicheres nutzen. Das spart euch jede Menge Arbeit, Zeit und Ihr seid immer auf der sicheren Seite
Dieser Thread ist entstanden, um das Ganze mal genauer aufzuzeigen, denn wir haben wirklich ein großes Problem mit den Teilen und Ihr könnt darauf verlinken, falls es mal wieder zu so einer Situation kommt.
Bei Fragen einfach fragen.
auf Grund der Tatsache, dass ich immer wieder sehe, dass besonders Anfänger sich an eigenen Updatern bzw. Patchern versuchen, dachte ich mir, dass ich hier mal 'nen Thread dazu aufmache.
Zunächst: Viele Entwickler möchten ihre Programme mit einem eigenen Updater ausstatten. Dies ist eine gute Idee, denn das hat den Vorteil, dass man einmal ein Paket hochlädt und schon können alle Benutzer das Programm updaten, ohne groß Updates herunterzuladen und manuell zu verwalten.
Jedoch bringt exakt das meist eine riesige Sicherheitslücke mit sich und es hängt da weitaus mehr dran, als gedacht. Jetzt stellt euch vor, Ihr ladet ein Updatepaket auf einen Server hoch und ein Client möchte sich dieses nun laden. Dieser Client sitzt in einem öffentlichen Netzwerk, zum Beispiel an einem Flughafen o. ä. (Man muss zwar sagen, dass es mittlerweile auch dort Sicherheitsstandards gibt, aber natürlich nicht überall und vor allem ist das ja nicht die einzige Gefahrenquelle.)
Nun gut, BTT: Mit diesem Client im (W)LAN sitzt nun ein Angreifer, der sich sowas zu Nutze macht, um dem Client einen Virus oder generell Malware unterzujubeln.
Wie geht das?
Kurze Version
Der Hacker sitzt einfach im selben lokalen Netzwerk und leitet nun den Datenverkehr zu sich um (ARP-Spoofing nennt man das mit Fachbegriff), indem er die ARP-Tabelle manipuliert und seine MAC-Adresse dort angibt, um dann eben jene für den Client oder Router vorgesehenen Pakete zu empfangen. Dann tauscht er das Paket aus und gibt dieses infizierte Paket an den Client weiter. Der bemerkt wahrscheinlich nicht mal, was gerade geschieht.
Lange Version
Es gibt zwei Protokolle, die ziemlich wichtig für den Datenaustausch im Internet sind: IP und Ethernet. IP überträgt Daten von einer IP-Adresse zur anderen, Ethernet überträgt Daten von MAC-Adresse zu MAC-Adresse. Die IP-Adresse ist wohl ziemlich bekannt und hat in IPv4 (Version 4) eine Länge von 32 Bit und kann jeweils eine bestimmte Anzahl an Netzen und Hosts ansprechen. Die Netze können entsprechend mit der Subnetzmaske nochmal unterteilt werden, aber das soll jetzt nicht das Thema sein. Zudem gibt es dann noch speziell reservierte Adressen, wie 127/8, was der Loopback ist und zum eigenen Rechner zurückführt. Auch gibt's noch entsprechend festgelegte, private Adressen für eure lokalen Netzwerke zu Hause (192.168/16, 10/8, ...). Alle verfügbaren IPv4-Adressen auf der Welt sind übrigens belegt. Der DHCP-Server ist allerdings dennoch verpflichtet, euch immer eine Adresse zuzuweisen. Insgesamt sind 2^32 = 4.294.967.296 (knapp 4,3 Milliarden) IPv4-Adressen verfügbar, um andere Hosts anzusprechen. Von denen können aber natürlich nicht alle benutzt werden, da einige eben reserviert sind. Somit bleiben 3.707.764.736 (knapp 3,7 Milliarden). Seit einiger Zeit gibt es daher IPv6 (Version 6), was aber trotzdem noch nicht so extrem weit verbreitet ist. IPv6 hat eine Länge von 128 Bit und somit 2^128 = 3,4028237e+38 mögliche Adressen. Zudem bietet es noch einige andere Neuheiten, die das Protokoll etwas einfacher machen. Mit der IP-Adresse kann man Hosts auf der ganzen Welt ansprechen. Sollte eine Domain vorhanden sein, löst erst ein DNS-Server entsprechend die Domain zu einer IP auf, damit die Kommunikation stattfinden kann. Ethernet ist ebenfalls ein Protokoll, das für LANs konzipiert ist. Es befindet sich daher 1 Layer unter IP. Im lokalen Netzwerk wird es benutzt und verwendet eben MAC-Adressen zur Adressierung. Diese stehen fest in der Netzwerkkarte.
Um nun die lokale IP-Adresse eines Hosts in eine MAC umzuwandeln, benötigt es das Protokoll ARP bei IPv4 bzw. NDP bei IPv6.
ARP ist das Address Resolution Protocol und löst entsprechend IPs zu MAC-Adressen auf wie z. B. DNS das mit Domains zu IPs regelt. Wenn Ihr nun Daten an den Router über Ethernet sendet, dann habt Ihr zunächst dessen lokale IP-Adresse (Default-Gateway), die vom DHCP vergeben wurde. ARP wird nun die Adresse abrufen und die steht dann bei euch in der ARP-Tabelle. Die Einträge dort werden automatisch in einer bestimmten Spanne aktualisiert, wenn diese nicht zwischenzeitlich wieder verwendet wurden. Ihr könnt ja mal die Kommandozeile starten und
arp -a
eingeben und werdet die Zuordnungen sehen. Schaltet sich nun ein Angreifer ein, passiert folgendes: Er wird entsprechend für die Router-IP seine MAC-Adresse (also die seines Computers) eintragen und zukünftig alle für den Router vorgesehenen Pakete empfangen und kann diese kontrollieren (manipulieren, mitlesen, weiterleiten, nicht weiterleiten, auf seinen eigenen Server weiterleiten, etc. pp). Dies ist möglich, da Einträge einfach überschrieben werden können. Auffällig ist dann, dass meistens die selbe MAC-Adresse für unterschiedliche IPs in der ARP-Tabelle auftaucht. Natürlich muss das nicht nur der Router, sondern kann jeder beliebige Host im LAN sein, um wirklich alle Verbindungen zu kontrollieren.
In dem Fall kontrolliert der Angreifer nur die Kommunikation zum Router, aber nicht zwischen den einzelnen Hosts:
Bild von Wikipedia, da man das dort so schön sehen konnte.
Und nochmal der ganze Vorgang, da der in dieser Grafik relativ leicht erklärt ist (Quelle):
Also nochmal: Habt Ihr LAN, habt Ihr Ethernet. Und dann kann das passieren. Die Daten eines Clients werden also möglicherweise nie beim Server ankommen (außer, der MITM lässt es zu und liest nur mit). Entsprechend kann man nur die Symptome behandeln und nachwirkend die Daten entsprechend validieren. Verbindet Ihr euch nun mit dem Router, um aus dem Internet Updates für eine Software von einem Server zu laden, würde der Provider normalerweise den Rest für euch regeln und Ihr würdet die Daten bekommen. Schaltet sich nun ein Hacker dazwischen und gibt sich als Router aus, so kann das nun eben auch Malware anstelle eines Updates sein.
Konklusion: Das kann passieren, wenn der Updater selbst geschrieben wurde und keine Sicherheit mit sich bringt. Von den Folgen nun ganz zu schweigen, der Client wird sich im Besten Fall nur beschweren und das wird weitere Nutzer abschrecken usw.
Insgesamt nennt man diesen Angriff auch Janus- bzw. Man-in-The-Middle-Angriff.
Nicht nur das ist ne Gefahrenquelle, natürlich kann das auch passieren, wenn euer Webspace/Server gekapert wird o. ä. Dann ist das Problem noch größer, denn dann würde wirklich jeder Client infiziert. Dies war vor ner Zeit ja erst passiert, als WhatsApp, Avira usw. geknackt wurden und am 30. März 2015 der puush-Dienst.
Wie kann man sich schützen und was kann man machen?
Das Schlüsselwort zur Sicherheit heißt "Signierung". Hierbei wird dem Archiv des Pakets, besser gesagt den Bytes des Archivs eine Signatur zugeordnet und diese wird anschließend beim Client überprüft. Wenn das Paket ausgetauscht wird, dann ändern sich die Bytes des Archivs, was eine ungültige Signatur zur Folge hat.
Um das zu prüfen, muss also eine entsprechende Signatur gebildet werden, die nur mit den richtigen Schlüsseln erstellt und wieder verifiziert werden kann. Ändern sich nun Daten, würde der Client das bei einer falschen Signatur merken und könnte die Daten verwerfen, ohne sie überhaupt auszuführen. Das gilt natürlich nicht nur für Updates, sondern alle Binaries, die Ihr irgendwo ladet und ausführt.
Das Schöne ist, dass dies alles asymmetrisch funktioniert, sodass ein kompletter Austausch auch unmöglich ist, da es mehrere Schlüssel gibt.
Da die RSA-Klasse hierbei hochkomplexe Mathematik anwendet, ist es bei richtiger Implementierung unmöglich 4096 Bit zu knacken.
Nun, damit man nun so eine Signatur hat, rate ich wie es schon so oft gemacht wurde zum Updatesystem.NET oder (etwas Eigenwerbung *hust*) nUpdate, da das Updatesystem.NET auf der offiziellen Seite down ist und halt auch einfach nicht mehr aktuell ist.
Wenn Ihr euch mal selber in den Bereich der Kryptographie und Signierung einlesen wollt, hier mal ein paar Quicklinks:
de.wikipedia.org/wiki/Asymmetrisches_Kryptosystem
msdn.microsoft.com/de-de/library/aa331388(v=vs.71).aspx
msdn.microsoft.com/de-de/library/55yk5665(v=vs.110).aspx
Fazit:
Eigene Updater so gut es geht vermeiden und etwas sicheres nutzen. Das spart euch jede Menge Arbeit, Zeit und Ihr seid immer auf der sicheren Seite

Dieser Thread ist entstanden, um das Ganze mal genauer aufzuzeigen, denn wir haben wirklich ein großes Problem mit den Teilen und Ihr könnt darauf verlinken, falls es mal wieder zu so einer Situation kommt.
Bei Fragen einfach fragen.

#define for for(int z=0;z<2;++z)for // Have fun!
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!
Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da
Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose!

Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da

Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „Trade“ ()