In der SQLite-Datenbankbibliothek wurde eine schwerwiegende Sicherheitslücke entdeckt, die im Rahmen einer Codeänderung im Oktober 2000 eingeführt wurde und es Angreifern ermöglichen könnte, Programme zum Absturz zu bringen oder zu kontrollieren.

Das 22 Jahre alte Problem ist als CVE-2022-35737 (CVSS-Score: 7.5) bekannt und betrifft die SQLite-Versionen 1.0.12 bis 3.39.1. Es wurde in der Version 3.39.2 behoben, die am 21. Juli 2022 veröffentlicht wurde.

„CVE-2022-35737 ist auf 64-Bit-Systemen ausnutzbar, und die Ausnutzbarkeit hängt davon ab, wie das Programm kompiliert wird“, sagte Trail of Bits-Forscher Andreas Kellas in einem heute veröffentlichten technischen Bericht.

„Die Ausführung von beliebigem Code ist bestätigt, wenn die Bibliothek ohne Stack Canaries kompiliert wird, aber unbestätigt, wenn Stack Canaries vorhanden sind, und Denial-of-Service ist in allen Fällen bestätigt.

Die in C programmierte SQLite ist die am weitesten verbreitete Datenbank-Engine und standardmäßig in Android, iOS, Windows und macOS sowie in beliebten Webbrowsern wie Google Chrome, Mozilla Firefox und Apple Safari enthalten.

Die von Trail of Bits entdeckte Schwachstelle betrifft einen Integer-Überlauf, der auftritt, wenn extrem große String-Eingaben als Parameter an die SQLite-Implementierungen der printf-Funktionen übergeben werden, die wiederum eine andere Funktion für die String-Formatierung verwenden („sqlite3_str_vappendf“).

Eine erfolgreiche Ausnutzung des Fehlers setzt jedoch voraus, dass die Zeichenkette die Formatsubstitutionstypen %Q, %q oder %w enthält, was zu einem Programmabsturz führen kann, wenn benutzergesteuerte Daten über die Grenzen eines vom Stack zugewiesenen Puffers hinaus geschrieben werden.

„Wenn der Formatstring das Sonderzeichen ‚!‘ enthält, um das Scannen von Unicode-Zeichen zu ermöglichen, ist es im schlimmsten Fall möglich, beliebigen Code auszuführen oder das Programm in einer (fast) unendlichen Schleife hängen zu lassen“, erklärt Kellas.

Die Schwachstelle ist auch ein Beispiel für ein Szenario, das vor Jahrzehnten noch als unpraktisch galt – die Zuweisung von 1 GB großen Zeichenketten als Eingabe – und das mit dem Aufkommen von 64-Bit-Computersystemen möglich geworden ist.

„Es handelt sich um einen Fehler, der zu der Zeit, als er geschrieben wurde (im SQLite-Quellcode aus dem Jahr 2000), als die Systeme noch hauptsächlich aus 32-Bit-Architekturen bestanden, vielleicht nicht als Fehler angesehen wurde“, so Kellas.