„HollowByte“: Denial-of-Service-Lücke in OpenSSL

In OpenSSL haben die Entwickler stillschweigend eine Denial-of-Service-Sicherheitslücke geschlossen. Die IT-Sicherheitsexperten von Okta haben der Schwachstelle den Spitznamen „HollowByte“ verpasst.

In einem aktuellen Blogbeitrag erklären die Okta-Programmierer, dass die Sicherheitslücke sich mit manipulierten Paketen mit einer Nutzlast von 11 Byte missbrauchen lässt. Angreifer können OpenSSL damit aus dem Internet attackieren und dazu bringen, unverhältnismäßig große Speicherbereiche zu belegen, noch bevor ein Sicherheits-Handshake anfängt.

Problem: Vertrauen in Nutzerangaben

Okta führt aus, dass ein TLS-Handshake mit einer „ClientHello“-Nachricht anfängt. Diese Handshake-Nachricht enthält einen 4-Byte-Header, der die Länge des ankommenden Nachrichtentexts deklariert. Ältere OpenSSL-Versionen allokieren einen Speicherbereich mit dieser Größenangabe, bevor überhaupt etwaige Daten ankommen. Mit bösartigen Headern führt OpenSSL nun unüberprüft diese Speicherbelegung aus. Mit der bösartigen, 11 Byte langen Nutzlast liest die TLS-State-Machine den 4-Byte-Handshake-Header und belegt vorab Speicher gemäß der 3 Byte langen Längendeklaration. Bis zu 131 KByte Speicher belegt das dann aufgrund einer Angabe in nicht vertrauenswürdigen Paketen. Dazu kommt, dass der Worker-Thread blockiert und auf die Ankunft der angekündigten Daten wartet, die jedoch niemals ankommen, erklärt Okta das Problem.

Ein Angriff, der Verbindungen offen hält und die verfügbaren Threads ausschöpft, ist ein klassischer Denial-of-Service. „HollowByte“ ist noch etwas schlimmer, schreibt Okta, da OpenSSL zwar bei Beenden der Verbindung den Puffer wieder freigibt. Glibc hingegen gibt die Speicherbereiche kleinerer und mittlerer Belegungen nicht sofort wieder zurück, sondern hält sie für eine mögliche erneute Nutzung erstmal weiter vor. Durch Anfragen mit zufälligen Größen unterbinden Angreifer die Wiederbenutzung der Speicherblöcke, der Heap-Speicher fragmentiert stark. Selbst nach dem Ende eines Angriffs bleibt der Server weiter in diesem Status. Der einzige Weg, wieder an den Speicher zu gelangen, ist das Abschießen des Prozesses.

Okta hat das mit einem nginx-Server mit einer 1-GByte-RAM-Umgebung getestet. Nachdem 547 MByte des Speichers fragmentiert und eingefroren waren, kam es zum Prozess-Hänger aufgrund von „Out Of Memory“. Mit mehr Speicher, etwa 16 GByte RAM, trat der Zustand nach Belegung von 25 Prozent des Systemspeichers ein. Dabei blieb der Angriff unter der maximalen Anzahl möglicher Verbindungen, sodass Standard-Maßnahmen zur Begrenzung von Verbindungen nicht helfen.

Die OpenSSL-Entwickler haben das Problem stillschweigend mit OpenSSL 4.0.1 behoben und auf die Zweige 3.6.3, 3.5.7, 3.4.6 und 3.0.21 zurückportiert. Sie haben das „Fix zur Härtung“ deklariert und keinen CVE-Eintrag vergeben. Dennoch raten die Okta-Experten OpenSSL-Nutzern dazu, ihre Software auf den aktuellen Stand zu bringen. OpenSSL 4.0.1 sowie die Backports erschienen bereits früher im Juni und schlossen mehrere Sicherheitslücken, die teils das Einschleusen von Schadcode erlaubten. Wer also die Aktualisierung noch nicht vorgenommen hat, sollte das nun nachholen.

(dmk)