TL; DR: Ich persönlich glaube nicht, dass Microsoft Änderungen an der globalen Atomtabelle vornehmen wird, da dies nur ein kleines Sicherheitsproblem darstellt.
Mit einer Atomtabelle können Sie eine Zeichenfolge mit einer 16-Bit-Zahl verknüpfen. Sie geben Windows Ihre Zeichenfolge und es gibt Ihnen eine Nummer zurück. Sie können die Zeichenfolge dann erneut abrufen, indem Sie die zugewiesene Nummer kennen.
Jeder normaler Prozess hat seine eigene lokale Atom-Tabelle, aber es ist in der Regel leer und ist kein Sicherheitsproblem.
Es gibt mehrere "globale" Atomtabellen, die von allen Prozessen in demselben window station gemeinsam genutzt werden. 1 von ihnen ist dokumentiert und wird die globale Atomtabelle genannt. MSDN ist auch nett genug, tell us, dass RegisterClipboardFormat
und RegisterClass
auch ihre eigenen Atom Tabellen intern in ihrer aktuellen Implementierung verwenden. Andere Funktionen wie SetProp
verwenden auch Atom, aber wir sind daran interessiert ist nur in der Atom-Tabelle durch die verwendeten ausbeuten und Atome auf diese Tabelle mit der GlobalAddAtom
Funktion hinzugefügt werden.
Der Hauptzweck dieser Atomtabelle ist es, als einfacher Speicherort zu fungieren, so dass verschiedene Prozesse in einem Protokoll namens DDE miteinander kommunizieren können. Wenn ein Prozess will eine Nachricht an ein Fenster in einem anderen Prozess senden können Sie nicht mehr als 8 Bytes (2 Parameter, je 4 Byte) senden, und dies ist nicht genug Platz, um einen Dateisystem-Pfad oder eine URL zu übertragen.
um diese Einschränkung der Anwendung speichert die Zeichenfolge/path/URL im öffentlichen globalen Atom-Tabelle GlobalAddAtom
durch den Aufruf zu arbeiten. GlobalAddAtom
gibt eine Zahl zurück, die die Anwendung an den anderen Prozess senden kann. Wenn der andere Prozess die DDE-Nachricht empfängt, übergibt er die Nummer einfach an die GlobalGetAtomName
-Funktion, um die Zeichenfolge abzurufen.
Wie ist das ein Sicherheitsproblem? Es stellt sich heraus, dass dieser übertriebene (IMHO) Exploit uses der globalen Atom-Tabelle, um genau das zu tun, was die Tabelle entworfen wurde zu tun; Übertragen Sie eine Zeichenfolge von einem Prozess zu einem anderen.
Um Code in einem anderen Prozess injizieren würden Sie normalerweise OpenProcess
rufen Sie einen Handle auf den gewünschten Prozess zu bekommen, VirtalAllocEx
einige Speicher in diesem Prozess zugeordnet werden, WriteProcessMemory
diese neu zugewiesenen Speicher mit Ihrem Code zu füllen und schließlich CreateRemoteThread
diese Ausführung zu starten Code.
Der Exploit ruft im Grunde GlobalGetAtomName
in einer komplizierten Weise (NtQueueApcThread), um die Verwendung WriteProcessMemory
zu vermeiden. Es ist beeindruckend, wie es eine ROP-Kette baut und führt sie mit NtQueueApcThread
aber das ist nicht wirklich auf die Atom-Tabelle bezogen, war die Atom-Tabelle nur eine ungewöhnliche/kluge Weise Speicher zu übertragen.
Der Exploit nicht böser Code erlauben zu erhöhen oder auf andere Weise den Quellprozess erhält Privilegien hat nicht schon weil NtQueueApcThread
nicht auf jedem beliebiges Verfahren verwendet werden kann, müssen Sie noch die entsprechenden Berechtigungen den gewünschten Zielprozess zuzugreifen. NtQueueApcThread
hat einige Antiviren-Firmen überrascht, als der Exploit herauskam, aber als eigenständiges Stück Code, das von jemandem ausgeführt werden muss, kann es alleine nicht viel Schaden anrichten, es muss mit anderen kombiniert werden Code, um unheimlich zu sein.
Kann Microsoft die Atomtabellen entfernen? Nein, nicht wirklich, die anderen Tische sind zu wichtig.
Können sie die globale Atom-Tabelle entfernen? Nein, nicht wirklich, es ist eine dokumentierte API und das seit mehr als 20 Jahren, und Microsoft möchte die Kompatibilität nicht brechen.
Sie konnten jedoch die globale Atom Tabelle ein wenig kastrieren. Sie könnten es weniger global machen, indem sie es basierend auf dem integrity level des aufrufenden Prozesses in mehrere Abschnitte aufteilen. Dies würde den betreffenden Exploit nicht ändern, da er nicht auf Prozesse mit einer höheren Integritätsebene zugreifen kann.
Wenn wir vorgeben, dass Microsoft die globale Atom-Tabelle so geändert hat, dass sie als pro-process-Tabelle fungiert, was würde passieren?
Microsoft hat begonnen, von DDE in Windows XP wegzugehen, aber in Vista/7 wurde es viel ernster. Auf dieser Windows 8.1-Maschine verwendet Internet Explorer immer noch DDE für den Befehl "In demselben Fenster öffnen", aber das ist nicht das Standardverb für eine HTML-Datei. Durchsuchen Sie die Registrierung nach ddeexec
, um alle Anwendungen zu finden, die DDE verwenden, um seine Dateizuordnungen zu verarbeiten. Auf der positiven Seite wird Dateizuordnung DDE nur verwendet, wenn eine Instanz der Anwendung bereits geöffnet ist. Worst-Case-Szenario; Schließen Sie die Anwendung, bevor Sie auf eine neue Datei doppelklicken.
DDE kann auch verwendet werden, um andere Dinge zu tun, aber es ist schwer zu sagen, welche Anwendungen und/oder Funktionen würden brechen und wie gebrochen sie werden.
Die globale Atom-Tabelle kann für andere Dinge als DDE verwendet werden, aber es ist schwer zu sagen, wie üblich es ist, dies zu tun.
Wenn die globale Atomtabelle nur ihre Strings für Prozesse mit demselben Dateinamen freigeben würde, würden viele dieser Probleme wegfallen, da sie häufig dazu verwendet werden, einfach mit anderen Instanzen derselben Anwendung zu kommunizieren.
Sie sind ein einfaches 'Wörterbuch'. Einer der vielen Tricks, mit denen Microsoft ein GUI-Betriebssystem und seine Apps in 640 KB RAM schuht. Das Tragen eines 16-Bit-Int ist viel billiger als die Verwendung eines String-Literals. Es ist egal, dass es überhaupt eine Zeichenkette ist, irgendein Blob von Bytes reicht aus. Es sind immer noch nur Daten. Wenn Sie es ausnutzen, müssen Sie nicht nur die Kontrolle über den Prozess haben, sondern Sie müssen diese Daten auch in Code umwandeln. Ein Trugschluss, dass Raymond Chen gerne [sich lustig machen] (https://blogs.msdn.microsoft.com/oldnewthing/20060508-22/?p=31283). –
@HansPassant Dies ist eine Antwort, bitte posten Sie als solche! – Marcel
Hmm, nein, ich gehe. Darüber müsste ich mich auch zu sehr lustig machen. Der OP kann das Q + A selbst abschließen. Oder Sie können den Kommentar einfach als veraltet markieren. –