Daniel Stenberg, autor utility curl pro odesílání a přijímání dat po síti, oznámil ukončení podpory funkce strcpy() v kódové základně projektu a zákaz jejího budoucího použití. Toto rozhodnutí navazuje na loňský krok k ukončení podpory funkce strncpy(), která kopíruje zadaný počet bajtů ze vstupního řetězce. Používání strncpy() s sebou neslo riziko chyb v důsledku chybějícího nulového znaku na konci řetězce nebo dodatečného doplnění nulami.
Volání funkce strncpy() byla nahrazena funkcí strcpy(), která buď alokovala paměť pro cílový buffer před jeho voláním s ohledem na velikost zdrojového řetězce, nebo kontrolovala, zda se velikost zdrojového řetězce a cílového bufferu shoduje. Funkce strlcpy() nebyla nahrazena, protože vždy vyžadovala kopírování celého řetězce nebo vracela chybu.
Nyní byla všechna volání funkce strcpy() nahrazena novou funkcí curlx_strcopy(dest, dsize, src, slen). Funkce curlx_strcopy() vyžaduje velikost zdrojové a cílové vyrovnávací paměti s tím, že cílová vyrovnávací paměť musí být větší než zdrojová, aby se do ní vešel nulový znak ukončující řetězec, který se přidává na konec vyrovnávací paměti, aby se zabránilo jejímu přeskakování během kopírování. Pokud je velikost cílové vyrovnávací paměti větší než nula, ale není dostatečně velká pro kopírování cílového řetězce, přidá se na začátek nulový bajt. 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; }
Nahrazení strcpy() funkcí curlx_strcopy() bylo provedeno z důvodu rizika lidské chyby, která vede k oddělení kódu mezi kontrolami/alokacemi paměti a voláním strcpy(), například neopatrným přesunutím pouze části kódu nebo vložením kódu mezi kontrolu a volání strcpy(). Kromě toho eliminace používání strcpy eliminuje záplavu falešně pozitivních výsledků z hlášení o zranitelnosti způsobených nesprávnými detekcemi nástroji umělé inteligence, které považují přítomnost strcpy() za zranitelnost, aniž by zohledňovaly kontroly, které jsou již v kódu obsaženy.
Zdroj: opennet.ru
