Se ha identificado la posibilidad de crear cualquier función computable utilizando construcciones en los archivos de configuración de la utilidad Curl. Esta característica se manifiesta solo en las versiones de Curl desde 8.12 hasta 8.16 y es el resultado de la implementación no intencionada de la completud de Turing, que permite crear máquinas de Turing utilizando la capacidad de extraer rangos de bytes de los valores de las variables y una profundidad de anidamiento ilimitada al conectar archivos de configuración externos.
Como ejemplo, se ha organizado con Curl una simulación del funcionamiento de una máquina registradora de dos contadores (la máquina de Minsk) para sumar números y implementar el programa '99 botellas de cerveza', utilizado para enseñar sobre bucles. Para ejecutar el programa, programado a través de archivos de configuración de curl, solo es necesario descomprimir el archivo y ejecutar el comando 'curl -q -s -K 99_bottles/main.conf'.
La máquina registradora se simula mediante la representación del valor del contador como una cadena de 'n' símbolos 'x'. Las operaciones de incremento y decremento se realizan a través de la concatenación y la truncación de cadenas (la sintaxis '[0-0]' para dejar el primer byte y '[1-]' para dejar todo el contenido excepto el primer byte), mientras que las transiciones entre estados son controladas por la directiva 'expand-config', que carga dinámicamente el siguiente archivo de configuración utilizando su nombre como etiqueta de transición. La operación INC(R) en la máquina registradora se implementa como 'expand-variable = "r={{r}}x"' en el archivo de configuración de Curl, DEC(R) como 'expand-variable = "r[1-]={{r}}"', y JMP(S) como 'expand-config = "S.conf"'. Por ejemplo, el código para calcular 2 + 3:

En la práctica, las capacidades computacionales implementadas a través de archivos de configuración están limitadas por el tamaño de la pila, ya que cada paso de la ejecución del programa requiere cargar un nuevo archivo de configuración anidado. Con una pila de 8 MB, el desbordamiento ocurre aproximadamente después de 922 pasos. Las capacidades también se ven afectadas por la limitación en el tamaño de las variables expandibles (el parámetro MAX_EXPAND_CONTENT se establece en 10 MB) y el alto consumo de memoria debido a la conservación de todas las versiones antiguas de las variables.
A pesar de que la posibilidad identificada no es una vulnerabilidad en las versiones a partir de curl 8.17, el truco en cuestión ya no funcionará debido a la restricción de la profundidad de anidamiento de archivos de configuración a 5 niveles para protegerse contra recursiones infinitas.
Fuente: opennet.ru
