È stata rilevata la possibilità di creare funzioni calcolabili utilizzando le strutture nei file di configurazione dello strumento Curl. Questa caratteristica si manifesta solo nelle versioni di Curl da 8.12 a 8.16 ed è causata dall'implementazione involontaria della completezza di Turing, che consente di creare macchine di Turing, utilizzando la possibilità di estrarre intervalli di byte dai valori delle variabili e una profondità di annidamento illimitata durante il collegamento di file di configurazione esterni.
Come esempio, attraverso Curl è stata simulata l'operazione di una macchina a registri a due contatori (la macchina di Minsk) per sommare numeri e realizzare il programma '99 bottiglie di birra', utilizzato per l'insegnamento al lavoro con i cicli. Per avviare il programma, programmato tramite file di configurazione curl, è sufficiente estrarre l'archivio ed eseguire il comando 'curl -q -s -K 99_bottles/main.conf'.
La macchina a registri è simulata rappresentando il valore del contatore come una stringa di 'n' simboli 'x'. Le operazioni di incremento e decremento sono realizzate mediante concatenazione e troncamento delle stringhe (sintassi '[0-0]' per mantenere il primo byte e '[1-]' per mantenere tutto il contenuto tranne il primo byte), e le transizioni tra stati sono controllate dalla direttiva 'expand-config', che carica dinamicamente il file di configurazione successivo utilizzando il suo nome come etichetta di transizione. L'operazione INC(R) nella macchina a registri è realizzata come 'expand-variable = "r={{r}}x"' nel file di configurazione Curl, DEC(R) come 'expand-variable = "r[1-]={{r}}"', e JMP(S) come 'expand-config = "S.conf"'. Ad esempio, il codice per calcolare 2 + 3:

Nella pratica, le capacità computazionali realizzabili tramite i file di configurazione sono limitate dalla dimensione dello stack, poiché ogni passo nell'esecuzione del programma richiede il caricamento di un nuovo file di configurazione annidato. Con uno stack di 8 MB, il buffer overflow si verifica dopo circa 922 passi. Le possibilità sono inoltre influenzate da un limite alla dimensione delle variabili espanse (il parametro MAX_EXPAND_CONTENT è fissato a 10 MB) e dal grande consumo di memoria dovuto alla conservazione di tutte le versioni precedenti delle variabili.
Sebbene la possibilità rilevata non sia una vulnerabilità nelle versioni a partire dalla 8.17 di curl, il trucco in esame non funzionerà più a causa del limite di annidamento dei file di configurazione a 5 livelli, imposto per proteggere da ricorsioni infinite.
Fonte: opennet.ru
