2016-11-11 6 views
4

Die Sicherheitswelt war begeistert von einer neuen Code-Injektionstechnik namens "Atombombardierung" (siehe Injection Attack Description und Information Security Stack Exchange Question). Einfach gesagt, ein Angreifer kann Atomtabellen verwenden, um ausführbaren Code zu speichern.Also, wofür sind Windows Atom-Tabellen?

Ein Problem ist, dass die globale Atom-Tabelle-Funktion in allen Versionen von Windows vorhanden ist und eine absichtliche Funktion, kein Fehler ist. Es ist nicht klar, wie die Bedrohung durch Änderungen an Windows gemildert werden kann.

Wofür werden Windows-Atomtabellen verwendet? Wenn Microsoft einfach gesagt hätte "Das ist es, keine Atomtabellen mehr", was wäre der Effekt?

+5

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). –

+1

@HansPassant Dies ist eine Antwort, bitte posten Sie als solche! – Marcel

+0

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. –

Antwort

5

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.