Un file di modello da 65 byte può causare l'arresto improvviso del popolare motore di inferenza Llama.cpp. Il minuscolo payload innesca una divisione per zero all'interno del parser, producendo un crash SIGFPE.
Perché il crash è importante
Cosa è andato storto
Il parser legge i metadati del modello in strutture C++ e verifica che ogni dimensione del tensore sia "non negativa". Lo zero soddisfa tale condizione, quindi il controllo passa. La riga di codice successiva utilizza quindi la dimensione come divisore in un calcolo che presuppone che il valore sia positivo. Quando la dimensione è zero, la divisione genera un'eccezione in virgola mobile (SIGFPE) e termina il programma.
La validazione copriva solo metà dell'invariante necessaria: bloccava i valori negativi ma ignorava lo zero, che è altrettanto pericoloso per l'aritmetica successiva.
Cosa dovrebbero fare gli sviluppatori
- Trattare i file dei modelli come binari. Il caricamento di un modello analizza byte grezzi in strutture di memoria, un classico confine in cui dati non controllati possono far crashare il processo o peggio.
- Evitare controlli parziali. Una condizione che copre solo una parte dell'invariante richiesta fornisce un falso senso di sicurezza. In questo caso, "non negativa" era insufficiente; il codice necessitava di "positiva".
- Mettere in discussione le assunzioni dopo ogni controllo. Quando appare un test di limite, verificare che il codice successivo non faccia affidamento su una proprietà più restrittiva.
- Utilizzare strumenti di fuzzing. L'autore ha scoperto il bug eseguendo libFuzzer con AddressSanitizer, che muta gli input e segnala operazioni illegali come la divisione per zero.
Come è stata applicata la correzione
La correzione aggiunge una guardia che salta il calcolo dell'overflow quando una dimensione è uguale a zero. Questa piccola condizione preserva il supporto per i legittimi tensori di dimensione zero — utilizzati in alcune varianti di modelli per funzionalità opzionali — eliminando al contempo il percorso che porta al crash.
Conclusione: Un singolo file da 65 byte può mandare in tilt un motore di inferenza ampiamente distribuito; una validazione accurata e un fuzzing sistematico mantengono sicuri i caricatori di modelli.
Fonte: https://dev.to/harrisonsec/your-model-file-is-untrusted-input-1eap
