Hallo zusammen!
Ich bin hier zwar noch ganz neu, wende mich aber schon mit einem ziemlich speziellen Problem an euch Cracks:
Seit einiger Zeit bin ich daran, ein Konzept für ein neuartiges anonymes P2P-Netzwerk auszuarbeiten und spiele sogar mit der Idee, es eines Tages zu implementieren. Letzeres ist allerdings aufgrund meiner doch eher bescheidenen Programmierkenntnisse (als ehemaliger Hobby-TB/Delphi-Programmierer) noch recht utopisch. Aber mal sehen.
Da meine Idee ziemlich komplex und noch nicht bis ins letzte Detail ausgearbeitet ist, erspare ich mir hier eine Beschreibung des Systems und verweise auf meine Posts unter http://board.planetpeer.de/index.php/topic,4275.msg25108.html ab #msg25108. Es ist aber überhaupt nicht nötig, sich da hineinzulesen, denn meine Frage betrifft nur einen Aspekt des ganzen.
Das Problem ist ein grundsätzliches und stellt sich eigentlich bei jeder Anonymisierungs-/Verschlüsselungsalgorithmus: Ein System sollte nämlich opensource sein, um von den Benutzern/Experten akzeptiert zu werden. Jedoch ist es viel schwieriger, hohe Anonymität/Sicherheit herzustellen, wenn der Angreifer die Möglichkeit hat, den gesamten Quellcode einzusehen.
Mein Konzept lässt sich, wie auch andere aP2P-Systeme, im Grunde genommen auf zwei Arten angreifen:
1) man bricht die Anonymität der Teilnehmer
2) man legt das System lahm, ohne jedoch die Identität der Teilnehmer aufzudecken
Mich interessiert hier nur Problem 2), welches seinerseits in zwei Varianten auftreten kann:
a) simple DDos-Attacke: der Feind verwendet zwar den Original-Client, aber auf missbräuchliche Art. Er setzt also z.B. eine Vielzahl von (virtuellen) Knoten auf und bricht die Verbindung zu den anderen Knoten in regelmässigen Abständen ab, um diese aus dem Rhythmus zu bringen
b) Attacke mit manipuliertem Client: Der Feind verwendet manipulierte Clients, um gefälschte Messages verschicken usw.
b) ist natürlich viel gefährlicher als a), und bereitet mir daher mehr Kopfzerbrechen.
Als Lösung habe ich mir folgendes ausgedacht; ich bin mir aber nicht sicher, ob es wirklich etwas bringt:
- Anstatt den Client komplett opensource zu veröffentlichen, wird dieser nur zu 99% offengelegt. D.h. der eigentliche Client ist zwar komplett offen, das verwendete Protokoll wird in einem Punkt aber verdunkelt: Jedes Kommando/Message, welches zwischen zwei Knoten versendet wird, erhält eine eindeutige Signatur (Hashwert).
Dieser Hashwert ist aber nicht einfach ein SHA-1 oder MD5-Wert, sondern eine möglichst diffuse Kombination von verschiedenen Hashverfahren (inkl. XOR mit Zufallswerten). Der Empfänger-Knoten, dem der gleiche Hashgenerator ebenfalls zur Verfügung steht, akzeptiert nur Messages/Kommandos, deren so generierte Signatur zum Inhalt passt.
- Der Hashgenerator wird nun in eine separate Anwendung ausgelagert, die zuerst gestartet werden muss. Der dazugehörige Sourcecode bleibt natürlich geheim. Am besten wird die ausführbare Datei noch mit EXECryptor und dgl. zusätzlich verschleiert. (Gibt es hierfür bessere Alternativen?)
- Der Hashgenerator kennt den Hashwert der ausführbaren Client.Exe-Datei und führt letzere nur dann aus, wenn diese der genauen Vorgabe entspricht. Nur wenn der unveränderte Client-Sourcecode auf die exakt vorgegebene Weise mit dem vorgegebenen Compiler kompiliert worden ist, wird der Client also ausgeführt.
- Beim Start übergibt der Hashgenerator dem Client einen Zufallswert (z.B. via lpCommandLine der CreateProcess()-Funktion)
- Der Client erstellt unter Zufallswert.msg eine Datei und hält sie dauernd für den Schreib- und Lesezugriff offen. Besteht schon eine solche Datei (konkret: hat der Hacker/Angreifer den Zufallswert abgefangen und die Datei zuerst erstellt), killt sich der Client selbst.
Ansonsten, also im Normalfall, schreibt der Client die zu verschickenden Messages in die Datei, wo sie vom Hashgenerator ausgelesen werden können.
- Der Hashgenerator erzeugt die Signatur der jeweiligen Message und sendet diese dem Client (über interprocess communication), der daraufhin die signierte Message dem Empfängerknoten sendet.
- Ausserdem prüft der Hashgenerator in regelmässigen Abständen, ob der Client noch am Laufen ist (mit GetExitCodeProcess() ). Ist der Client tot (resp. durch den Angreifer lahmegegt worden), killt sich der Hashgenerator selber.
Nun meine Frage: Ist dieses Vorgehen (einigermassen) sicher und überhaupt sinnvoll?
Oder ist es für einen richtigen Hacker ein leiches, eine Anwendung (d.h. den Client) während der Laufzeit so zu manipulieren resp. blockieren, dass diese sich nicht mehr selber terminieren kann, sollte der Angreifer die besagte Cache-Datei zuerst erstellt haben. (Dazu muss der Angreifer aber zuerst mal die interprocess communication abhören können. Was bietet sich da als besonders abhörsicher an?)
Manipulationen, die der Angreifer allenfalls unter Durchbrechung der Datenzugriffsrechte an der Cache-Datei vornehmen könnte, spielen hier keine Rolle. Denn der Client könnte ja den Inhalt immer kontrollieren und sich bei Unregelmässigkeiten wiederum selber terminieren. Da stellt sich aber letztlich wieder dasselbe Problem: Ist es möglich, Anwendungen zur Laufzeit so zu manipulieren, dass sie von Aussen her immer noch als lauffähig erkannt werden? Oder wird dies durch den Protected Mode wirksam verhindert?
Ich bin hier zwar noch ganz neu, wende mich aber schon mit einem ziemlich speziellen Problem an euch Cracks:
Seit einiger Zeit bin ich daran, ein Konzept für ein neuartiges anonymes P2P-Netzwerk auszuarbeiten und spiele sogar mit der Idee, es eines Tages zu implementieren. Letzeres ist allerdings aufgrund meiner doch eher bescheidenen Programmierkenntnisse (als ehemaliger Hobby-TB/Delphi-Programmierer) noch recht utopisch. Aber mal sehen.
Da meine Idee ziemlich komplex und noch nicht bis ins letzte Detail ausgearbeitet ist, erspare ich mir hier eine Beschreibung des Systems und verweise auf meine Posts unter http://board.planetpeer.de/index.php/topic,4275.msg25108.html ab #msg25108. Es ist aber überhaupt nicht nötig, sich da hineinzulesen, denn meine Frage betrifft nur einen Aspekt des ganzen.
Das Problem ist ein grundsätzliches und stellt sich eigentlich bei jeder Anonymisierungs-/Verschlüsselungsalgorithmus: Ein System sollte nämlich opensource sein, um von den Benutzern/Experten akzeptiert zu werden. Jedoch ist es viel schwieriger, hohe Anonymität/Sicherheit herzustellen, wenn der Angreifer die Möglichkeit hat, den gesamten Quellcode einzusehen.
Mein Konzept lässt sich, wie auch andere aP2P-Systeme, im Grunde genommen auf zwei Arten angreifen:
1) man bricht die Anonymität der Teilnehmer
2) man legt das System lahm, ohne jedoch die Identität der Teilnehmer aufzudecken
Mich interessiert hier nur Problem 2), welches seinerseits in zwei Varianten auftreten kann:
a) simple DDos-Attacke: der Feind verwendet zwar den Original-Client, aber auf missbräuchliche Art. Er setzt also z.B. eine Vielzahl von (virtuellen) Knoten auf und bricht die Verbindung zu den anderen Knoten in regelmässigen Abständen ab, um diese aus dem Rhythmus zu bringen
b) Attacke mit manipuliertem Client: Der Feind verwendet manipulierte Clients, um gefälschte Messages verschicken usw.
b) ist natürlich viel gefährlicher als a), und bereitet mir daher mehr Kopfzerbrechen.
Als Lösung habe ich mir folgendes ausgedacht; ich bin mir aber nicht sicher, ob es wirklich etwas bringt:
- Anstatt den Client komplett opensource zu veröffentlichen, wird dieser nur zu 99% offengelegt. D.h. der eigentliche Client ist zwar komplett offen, das verwendete Protokoll wird in einem Punkt aber verdunkelt: Jedes Kommando/Message, welches zwischen zwei Knoten versendet wird, erhält eine eindeutige Signatur (Hashwert).
Dieser Hashwert ist aber nicht einfach ein SHA-1 oder MD5-Wert, sondern eine möglichst diffuse Kombination von verschiedenen Hashverfahren (inkl. XOR mit Zufallswerten). Der Empfänger-Knoten, dem der gleiche Hashgenerator ebenfalls zur Verfügung steht, akzeptiert nur Messages/Kommandos, deren so generierte Signatur zum Inhalt passt.
- Der Hashgenerator wird nun in eine separate Anwendung ausgelagert, die zuerst gestartet werden muss. Der dazugehörige Sourcecode bleibt natürlich geheim. Am besten wird die ausführbare Datei noch mit EXECryptor und dgl. zusätzlich verschleiert. (Gibt es hierfür bessere Alternativen?)
- Der Hashgenerator kennt den Hashwert der ausführbaren Client.Exe-Datei und führt letzere nur dann aus, wenn diese der genauen Vorgabe entspricht. Nur wenn der unveränderte Client-Sourcecode auf die exakt vorgegebene Weise mit dem vorgegebenen Compiler kompiliert worden ist, wird der Client also ausgeführt.
- Beim Start übergibt der Hashgenerator dem Client einen Zufallswert (z.B. via lpCommandLine der CreateProcess()-Funktion)
- Der Client erstellt unter Zufallswert.msg eine Datei und hält sie dauernd für den Schreib- und Lesezugriff offen. Besteht schon eine solche Datei (konkret: hat der Hacker/Angreifer den Zufallswert abgefangen und die Datei zuerst erstellt), killt sich der Client selbst.
Ansonsten, also im Normalfall, schreibt der Client die zu verschickenden Messages in die Datei, wo sie vom Hashgenerator ausgelesen werden können.
- Der Hashgenerator erzeugt die Signatur der jeweiligen Message und sendet diese dem Client (über interprocess communication), der daraufhin die signierte Message dem Empfängerknoten sendet.
- Ausserdem prüft der Hashgenerator in regelmässigen Abständen, ob der Client noch am Laufen ist (mit GetExitCodeProcess() ). Ist der Client tot (resp. durch den Angreifer lahmegegt worden), killt sich der Hashgenerator selber.
Nun meine Frage: Ist dieses Vorgehen (einigermassen) sicher und überhaupt sinnvoll?
Oder ist es für einen richtigen Hacker ein leiches, eine Anwendung (d.h. den Client) während der Laufzeit so zu manipulieren resp. blockieren, dass diese sich nicht mehr selber terminieren kann, sollte der Angreifer die besagte Cache-Datei zuerst erstellt haben. (Dazu muss der Angreifer aber zuerst mal die interprocess communication abhören können. Was bietet sich da als besonders abhörsicher an?)
Manipulationen, die der Angreifer allenfalls unter Durchbrechung der Datenzugriffsrechte an der Cache-Datei vornehmen könnte, spielen hier keine Rolle. Denn der Client könnte ja den Inhalt immer kontrollieren und sich bei Unregelmässigkeiten wiederum selber terminieren. Da stellt sich aber letztlich wieder dasselbe Problem: Ist es möglich, Anwendungen zur Laufzeit so zu manipulieren, dass sie von Aussen her immer noch als lauffähig erkannt werden? Oder wird dies durch den Protected Mode wirksam verhindert?