Programmiersprache PHP: Updates für 8.x beheben Bug im Zusammenspiel mit SQLite

Eine Funktion, die Datenbankabfragen in Anführungszeichen setzt, kann zu unerwarteten Ergebnissen führen und sich potenziell für SQL-Injection ausnutzen lassen.

In Pocket speichern vorlesen Druckansicht 4 Kommentare lesen

(Bild: Tatiana Popova/Shutterstock.com)

Lesezeit: 2 Min.

Für PHP 8.0, 8.1 und 8.2 sind Updates verfügbar, die einen Bug im Zusammenspiel mit der Datenbank-Engine SQLite beheben. Die fehlerbehaftete Funktion dient dazu, Zeichenketten mit Anführungszeichen zu versehen und zu bereinigen, um sie für Datenbankabfragen zu nutzen.

Das Problem ist seit Ende Oktober 2022 bekannt, und die aktuellen Patches PHP 8.0.27, 8.1.14 und 8.2.1 als erstes Update zu dem im Dezember veröffentlichte PHP 8.2 enthalten jeweils einen Bugfix. PHP 7.4 und früher sind wohl ebenfalls betroffen, aber dafür sind keine Updates verfügbar.

Die Funktion PDO::quote versieht einen String mit passenden Anführungszeichen und achtet dabei auf Fallstricke wie mit Escape-Sequenzen versehene Zeichenketten, die sich zu SQL-Injection ausnutzen lassen, wie folgendes Beispiel aus der PHP-Dokumentation zu der Funktion zeigt:

<?php
$conn = new PDO('sqlite:/home/lynn/music.sql3');

/* Dangerous string */
$string = 'Naughty \' string';
print "Unquoted string: $string\n";
print "Quoted string:" . $conn->quote($string) . "\n";

/* Output 
Unquoted string: Naughty ' string
Quoted string: 'Naughty '' string' 
*/
?>

Im Zusammenspiel mit SQLite, das im November in Version 3.40 erschienen ist, kann es zu einem Integer Overflow kommen, da PDO::quote für die Länge des Ausgabepuffers einen Wert vom Typ zend_long an die SQLite-Funktion sqlite3_snprintf() übergibt. Letztere erwartet einen vorzeichenbehafteten Integer mit 32 Bit. Auf 32-Bit-Plattformen entspricht das der Länge von zend_long, das auf 64-Bit-Plattformen allerdings eine Länge von 64 Bit hat.

Wie genau sich der Integer Overflow auswirkt, hängt von der jeweiligen SQLite-Implementierung ab. Theoretisch ist möglich, dass jemand Schadcode über den Bug einschleust. Allerdings muss das Programm die Eingabe eines nutzerdefinierten String mit einer Länge jenseits der 32-Bit-Grenze (2 147 483 647) erlauben.

Außerdem hat der Bug-Report im Zusammenspiel mit Version 3.39.2 und 3.39.4 der Datenbank-Engine den Fehler zwar reproduzierbar mit einer langen Zeichenkette auslösen können, die aber als Rückgabe lediglich ein halbes Anführungszeichen erhält:

<?php
$pdo = new PDO("sqlite::memory:");
$string = str_repeat("a", 0x80000000);
var_dump($pdo->quote($string));

/* Output
string(1) "'" 
*/
?>

Unabhängig davon ist unter CVE-2022-31631 ein Eintrag in der CVE-Datenbank der Mitre (Common Vulnerabilities and Exposures) vorbereitet, aber noch nicht ausgefüllt. Das Bundesamt für Sicherheit in der Informationstechnik (BSI) führt den Bug ebenfalls als Schwachstelle. Ein Update auf die jeweils aktuelle Version ist in jedem Fall empfehlenswert.

(rme)