Daniel Stenberg, autore dell'utilità per il trasferimento di dati in rete curl, ha annunciato l'interruzione dell'uso della funzione strcpy() nella base di codice del progetto e il divieto di utilizzo di questa funzione in futuro. Questa decisione segue la rinuncia all'uso della funzione strncpy(), che copia un numero specificato di byte dalla stringa di origine, avviata l'anno scorso. L'uso di strncpy() comportava il rischio di errori dovuti al mancato riconoscimento del carattere nullo alla fine della stringa o al riempimento eccessivo con zeri.
Le chiamate a strncpy() sono state sostituite dalla funzione strcpy(), prima della quale veniva effettuata l'allocazione della memoria per il buffer di destinazione considerando la dimensione della stringa di origine o era presente un controllo sulla corrispondenza della dimensione della stringa di origine e del buffer di destinazione. Non è stata effettuata la sostituzione con la funzione strlcpy(), poiché era necessario copiare sempre l'intera stringa o restituire un errore.
Ora tutte le chiamate a strcpy() sono sostituite con la nuova funzione curlx_strcopy(dest, dsize, src, slen). La funzione curlx_strcopy() richiede di specificare le dimensioni del buffer sorgente e di destinazione, tenendo conto che il buffer di destinazione deve essere maggiore di quello sorgente per contenere il carattere nullo finale, che viene aggiunto forzatamente dalla funzione alla fine per evitare che venga omesso durante la copia. Se la dimensione del buffer di destinazione è maggiore di zero, ma non è sufficiente per copiare la stringa di destinazione, viene aggiunto un byte nullo all'inizio. void curlx_strcopy(char *dest, size_t dsize, const char *src, size_t slen) { DEBUGASSERT(slen < dsize); if(slen < dsize) { memcpy(dest, src, slen); dest[slen] = 0; } else if(dsize) dest[0] = 0; }
La sostituzione di strcpy() con curlx_strcopy() è stata effettuata poiché esiste il rischio di errore umano, che potrebbe portare a separare il codice di verifica/allocazione della memoria dalla chiamata a strcpy(), ad esempio, durante un'incauta rimozione solo di una parte del codice o l'inserimento del codice tra la verifica e la chiamata a strcpy(). Inoltre, l'abbandono di strcpy permetterà di eliminare il flusso di falsi avvisi di vulnerabilità dovuti alle attivazioni errate degli strumenti AI, che considerano la presenza di strcpy() una vulnerabilità senza tenere conto delle verifiche presenti nel codice.
Fonte: opennet.ru
