Daniel Stenberg, creatorul utilitatii pentru transferul de date prin rețea curl, a anunțat încetarea utilizării funcției strcpy() în baza de cod a proiectului și interdicția utilizării acestei funcții în continuare. Decizia continuă renunțarea inițiată anul trecut de la utilizarea funcției strncpy(), care copia un anumit număr de octeți dintr-un șir de intrare. Utilizarea strncpy() a creat riscul de a produce erori din cauza omiterii caracterului nul de la finalul șirului sau completarea suplimentară cu nuluri.
Apele la strncpy() au fost înlocuite cu funcția strcpy(), înainte de apelul căreia se efectua alocarea memoriei pentru bufferul țintă, ținând cont de dimensiunea șirului original sau existând o verificare a corespondenței între dimensiunea șirului original și bufferul țintă. Înlocuirea cu funcția strlcpy() nu a fost efectuată, deoarece era necesar să se copieze întotdeauna întregul șir sau să se returneze o eroare.
Acum toate apelurile la strcpy() au fost înlocuite cu noua funcție curlx_strcopy(dest, dsize, src, slen). Funcția curlx_strcopy() necesită specificarea dimensiunii bufferului original și al celui țintă, având în vedere că bufferul țintă trebuie să fie întotdeauna mai mare decât cel original pentru a încăpea caracterul nul de la finalul șirului, care este adăugat forțat de funcție la final pentru a evita omisiunea acestuia în timpul copiei. Dacă dimensiunea bufferului țintă este mai mare de zero, dar insuficientă pentru a copia șirul țintă, se adaugă un octet nul la început. 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; }
Înlocuirea strcpy() cu curlx_strcopy() a fost efectuată, deoarece există riscul de eroare umană, ducând la separarea codului cu verificarea/alocarea memoriei și apelul strcpy(), de exemplu, prin mutarea necugetată a doar unei părți a codului sau inserarea codului între verificare și apelul strcpy(). În plus, încetarea utilizării strcpy va elimina fluxul de mesaje false despre vulnerabilități din cauza activărilor incorecte ale instrumentelor AI care consideră existența strcpy() o vulnerabilitate fără a ține cont de verificările existente în cod.
Sursa: opennet.ro
