Es wurde festgestellt, dass es möglich ist, beliebige berechenbare Funktionen durch Konstruktionen in den Konfigurationsdateien des Curl-Tools zu erstellen. Dieses Merkmal tritt nur in den Curl-Versionen 8.12-8.16 auf und wird durch die unbeabsichtigte Implementierung der Turing-VollstÀndigkeit verursacht, die es ermöglicht, Turing-Maschinen zu erstellen, indem man die Möglichkeit nutzt, Byte-Bereiche aus den Werten von Variablen zu extrahieren und eine unbegrenzte Verschachteltiefe bei der Anbindung externer Konfigurationsdateien zu verwenden.
Als Beispiel wurde mit Curl eine Simulation einer ZweizĂ€hler-Registermaschine (Minsk-Maschine) fĂŒr die Addition von Zahlen und die Umsetzung des Programms â99 Flaschen Bierâ organisiert, das beim Erlernen des Umgangs mit Schleifen verwendet wird. Um das ĂŒber Konfigurationsdateien programmierte Programm auszufĂŒhren, muss man lediglich das Archiv entpacken und den Befehl âcurl -q -s -K 99_bottles/main.confâ ausfĂŒhren.
Die Registermaschine wird simuliert, indem der Wert des ZĂ€hlers als Zeichenkette aus ânâ Zeichen âxâ dargestellt wird. Die Inkrement- und Dekrement-Operationen werden durch Verkettung und KĂŒrzen von Zeichenfolgen umgesetzt (Syntax â[0-0]â zum Beibehalten des ersten Bytes und â[1-]â zum Beibehalten des gesamten Inhalts auĂer dem ersten Byte), und die ĂbergĂ€nge zwischen den ZustĂ€nden werden durch die Direktive âexpand-configâ gesteuert, die die nĂ€chste Konfigurationsdatei dynamisch lĂ€dt, wobei ihr Name als Ăbergangswert verwendet wird. Die Operation INC(R) in der Registermaschine wird als 'expand-variable = "r={{r}}x"' in der Curl-Konfigurationsdatei implementiert, DEC(R) als 'expand-variable = "r[1-]={{r}}"', und JMP(S) als 'expand-config = "S.conf"'. Beispielsweise der Code zur Berechnung von 2 + 3:

In der Praxis sind die durch Konfigurationsdateien umsetzbaren RechenfĂ€higkeiten durch die GröĂe des Stacks begrenzt, da jeder Schritt der ProgrammausfĂŒhrung das Laden einer neuen verschachtelten Konfigurationsdatei erfordert. Bei einem Stack von 8 MB tritt der Ăberlauf nach etwa 922 Schritten auf. Die Möglichkeiten werden auch durch die Begrenzung der GröĂe der aufgedeckten Variablen beeinflusst (der Parameter MAX_EXPAND_CONTENT ist auf 10 MB gesetzt) und durch den hohen Speicherverbrauch aufgrund der Speicherung aller alten Versionen der Variablen.
Obwohl die festgestellte Möglichkeit keine Schwachstelle in den Versionen ab Curl 8.17 darstellt, funktioniert der besprochene Trick aufgrund der Begrenzung der Verschachtelungstiefe fĂŒr Konfigurationsdateien auf 5 Ebenen nicht mehr, um endlose Rekursion zu verhindern.
Quelle: opennet.ru
