
PoC per la vulnerabilità DoS CVE-2021-37740 nel firmware v3.0.3 di SCN-IP100.03 e SCN-IP000.03 di MDT. Il bug è stato corretto nel firmware v3.0.4.
CVE-2021-37740 è una vulnerabilità di denial of service (DoS) che interessa il firmware v3.0.3 del router KNXnet/IP Secure SCN-IP100.03 e dell'interfaccia SCN-IP000.03 di MDT. Un frame KNXnet/IP Secure appositamente predisposto rende il dispositivo non più in grado di rispondere alle richieste successive, richiedendo un riavvio per ripristinare il normale funzionamento. Questo repository contiene un proof of concept che dimostra come può essere innescato il bug, originariamente sviluppato per la divulgazione coordinata della vulnerabilità.
Un avversario può sfruttare la vulnerabilità stabilendo una connessione TCP con il dispositivo target, seguita dall'invio di un frame SESSION_REQUEST con un campo relativo alla lunghezza totale modificato, contenente un valore pari a 0x0259 o superiore.
I dispositivi affetti dalla vulnerabilità non risponderanno più ai frame KNXnet/IP Secure in alcuna connessione. La SESSION_REQUEST è il primo frame inviato durante l'handshake del protocollo unicast KNXnet/IP Secure, come specificato da ISO 22510:2019.
Dovrebbe avere una lunghezza fissa di 46 byte. Lo standard richiede che i frame con una lunghezza diversa vengano scartati.
Python 3 è richiesto per gli script forniti in questo repository. Lo script healthcheck.py serve a verificare se il dispositivo è ancora reattivo.
Esso stabilisce una connessione TCP con il dispositivo target e tenta di avviare l'handshake unicast KNXnet/IP Secure.
Se il dispositivo invia una risposta, questa verrà stampata come esadecimale su stdout.
Lo script poc.py tenta di innescare la vulnerabilità DoS inviando il frame SESSION_REQUEST non valido. Se un dispositivo è vulnerabile, le esecuzioni successive di healthcheck.py non produrranno alcuna risposta, a meno che il dispositivo target non venga riavviato.
Gli script possono essere eseguiti con i seguenti comandi, dove <insert IP address> deve essere sostituito con l'indirizzo IP effettivo (ad es. 192.168.2.137).
python3 healthcheck.py -t <insert IP address>
python3 poc.py -t <insert IP address>
Su Windows l'alias per Python potrebbe dover essere modificato da python3 a python. Se il dispositivo target implementa l'endpoint di controllo su una porta diversa dalla 3671, la porta nello script deve essere regolata di conseguenza.
La vulnerabilità è stata corretta nel firmware v3.0.4, come documentato dal registro delle modifiche per il firmware MDT. L'installazione del firmware più recente risolve il problema. Le istruzioni per l'aggiornamento del firmware e il file .hex sono disponibili sul sito web di MDT.
Il proof of concept è distribuito sotto licenza MIT.
Download:
Modifiche: