I payload di dati UDP dovrebbero includere un CRC?


16

Per un'azienda per cui lavoravo, dovevo implementare un ricevitore socket che prendeva principalmente dati in formato UDP su una connessione locale da un hardware di sensori specializzato. I dati in questione erano un pacchetto UDP ben formato, ma è interessante notare che il payload dei dati finiva sempre con un checksum CRC16 formato utilizzando il resto dei dati.

Ho implementato il controllo da parte mia, come da specifica, ma mi sono sempre chiesto se fosse necessario. Dopotutto, il protocollo UDP stesso non trasporta un CRC a 16 bit? Pertanto, sebbene i pacchetti UDP possano essere persi o fuori servizio, ho avuto l'impressione che non possano essere danneggiati senza essere scartati dall'hardware di rete prima che raggiungano i processi del sistema operativo. O c'è qualche caso d'uso speciale che mi manca?

Vale la pena aggiungere che stavo lavorando nel settore della difesa, che, come sono sicuro che puoi immaginare, ama essere molto esplicito su tutto questo, quindi mi chiedo se si trattasse solo di un "OCD di sicurezza". ..


2
Se è per motivi di sicurezza, non solo per prevenire la corruzione accidentale, è necessario utilizzare un MAC, che è l'equivalente con chiave di un checksum.
CodesInChaos

1
Il checksum UDP è valido solo per i dati che sono stati iniettati nel pacchetto UDP. Cosa crea effettivamente il checksum? Cosa utilizza il checksum? Viene utilizzato per garantire l'integrità prima che il pacchetto UDP venga creato o forse trasportato insieme al pacchetto per garantire che mantenga l'integrità mentre scorre attraverso altri sistemi? Senza una comprensione più ampia dei componenti del sistema e di come i dati vengono creati, trasformati e utilizzati, non sono sicuro che la tua domanda sia rispondibile.
Thomas Owens

@ThomasOwens I dati sono stati inviati back-to-back dal dispositivo di origine all'hardware di ricezione. Nessun intermediario. Il checksum è stato creato dal mittente come ultimo passaggio prima dell'invio.
Xenoprimate,

Risposte:


23

Il protocollo UDP non garantisce che i messaggi vengono consegnati in ordine o consegnate a tutti, ma lo fa in modo che quei messaggi che non vengano consegnati sono completi e invariati includendo automaticamente a 16 bit di checksum. Ciò significa che l'aggiunta di un altro checksum a 16 bit sul livello dell'applicazione è in genere ridondante.

...generalmente....

Innanzitutto, con IPv4 (non IPv6), il checksum è facoltativo . Ciò significa che potresti utilizzare una configurazione esotica che non esegue la generazione e la convalida del checksum (ma in tal caso dovresti piuttosto sistemare lo stack di rete anziché rigging della giuria a livello di applicazione).

In secondo luogo, con un checksum a 16 bit esiste uno su 65536 possibilità che un messaggio completamente casuale abbia un checksum valido. Quando questo margine di errore è troppo grande per il tuo caso d'uso (e nel settore della difesa potrei immaginarne diversi dov'è), l'aggiunta di un altro checksum CRC-16 lo ridurrebbe ulteriormente. Ma in quel caso potresti considerare di utilizzare un digest di messaggio appropriato come SHA-256 invece di CRC-16. Oppure vai fino in fondo e usa una vera firma crittografica. Questo protegge non solo dalla corruzione casuale ma anche dalla corruzione intenzionale di un utente malintenzionato.

Terzo, a seconda della provenienza e della destinazione dei dati, potrebbe essere danneggiato prima o dopo l'invio sulla rete. In tal caso, il checksum aggiuntivo all'interno del messaggio potrebbe proteggere l'integrità del messaggio oltre che tra i due host di rete.


3
Perché crittografico ? I vincoli utilizzati nella progettazione degli hash crittografici non sono gli stessi di quelli utilizzati nella progettazione di un hash utilizzato nella trasmissione (ad esempio, il fatto di fare un uso intensivo delle risorse è una caratteristica degli hash crittografici e del problema nella trasmissione).
Programmatore

1
@AProgrammer Ammetto che la scelta delle parole potrebbe essere stata fuorviante. L'ho sostituito con "digest del messaggio corretto". Le funzioni di digest dei messaggi sono molto più lunghe, rendendo così improbabili le collisioni accidentali che possono essere ritenute impossibili a scopi pratici.
Philipp,

2
Si tenta di assicurare che i messaggi sono invariati, ma la somma di controllo utilizzato in UDP è piuttosto debole. Mentre la possibilità che un messaggio casuale abbia un checksum valido è effettivamente 1 su 65536 per tutti i checksum a 16 bit, le misure più utili riguardano il numero rilevabile di lanci di bit disposti in modo casuale o in un burst e tutti i checksum non funzionano allo stesso modo secondo questa metrica.
Ben Voigt,

1
Gli hash crittografici di @AProgrammer (MD5, SHA-1/2/3, ...) mirano ad essere il più economici possibile garantendo proprietà di sicurezza come la resistenza alle collisioni. In genere possono elaborare diverse centinaia di MB al secondo, quindi non dovrebbero essere un collo di bottiglia per niente di meno delle connessioni Gbit. Sono ancora più lenti di molti altri non crittografici che non hanno bisogno di resistere alle collisioni. Solo gli hash delle password (PBKDF2, bcrypt, scrypt, Argon, ...) mirano a essere costosi da calcolare.
CodesInChaos

12

UDP fornisce comunque un checksum.

  1. Il checksum UDP ha solo 16 bit. Ciò significa che 1 su 65536 possibilità che un pacchetto corrotto passi il checksum.
  2. in UDP su IPv4 il checksum è facoltativo, quindi un mittente potrebbe teoricamente finire per inviare un pacchetto senza checksum.
  3. Il checksum copre le informazioni IP / porta e i dati. Sebbene ciò sia utile nel far cadere pacchetti con indirizzi corrotti, significa che se il pacchetto passa attraverso un NAT, il checksum deve essere ricalcolato dal NAT.
  4. Il checksum protegge i dati solo quando viaggiano nel pacchetto UDP. Un checksum a livello di applicazione può proteggere i dati end-to-end mentre passa attraverso un sistema più complesso.
  5. Il checksum UDP dice chiaramente che il pacchetto è stato generato da un'implementazione UDP. Non ti dice che proviene dal tuo sensore. Un checksum a livello di applicazione, d'altra parte, può aiutare a rifiutare i pacchetti che sono UDP validi ma provengono da qualche altra fonte.

Quindi vedo motivi legittimi per non fidarsi del checksum UDP ma ugualmente non fidarsi del checksum UDP e quindi implementare un checksum altrettanto debole a livello di applicazione sembra strano.

Esiste la possibilità che la persona che sta progettando il protocollo semplicemente non sapesse che UDP forniva checksum o che il protocollo fosse in realtà una leggera variante di uno progettato per funzionare su un supporto che non forniva checksum.

PS poiché questo post è etichettato come security, tieni presente che i checksum in questione sono progettati per proteggere da modifiche involontarie. La protezione da modifiche o spoofing deliberati richiede sia l'uso di funzioni crittografiche di hash resistenti a collisioni / preimmagini deliberate sia l'uso di alcuni meccanismi (ad es. Firme realizzate con una chiave pubblica) per verificare che gli hash stessi non siano stati modificati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.