Даниел Стенберг (Daniel Stenberg), автор инструмента за извлечение и передачу данных по сети curl, обяви за спирането на използването на функцията strcpy() в кода на проекта и забраната за прилагането на тази функция занапред. Решението е продължение на миналогодишното отказване от използването на функцията strncpy(), която копира зададен брой байта от входящия низ. Използването на strncpy() създаваше риск от грешки поради пропускането на нулевия символ в края на низа или добавяне на нули.
Обажданията към strncpy() бяха заменени с функцията strcpy(), преди извикването на която се извършваше заделяне на памет за целевия буфер, като се вземаше предвид размерът на входящия низ или се извършваше проверка на съответствието на размера на входящия низ и целевия буфер. Замяната с функцията strlcpy() не беше направена, тъй като винаги беше необходимо да се копира целия низ напълно или да се върне грешка.
Сега всички извиквания на strcpy() са заменени с новата функция curlx_strcopy(dest, dsize, src, slen). Функцията curlx_strcopy() изисква задаване на размера на входящия и целевия буфер с изчисление, че целевият буфер непременно трябва да бъде по-голям от входящия, за да побере нулевия символ на края на низа, който принудително се добавя от функцията в края, за да се избегне неговото пропускане при копирането. Ако размерът на целевия буфер е по-голям от нула, но е недостатъчен за копиране на целевия низ, в началото се добавя нулев байт. 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; }
Замяната на strcpy() с curlx_strcopy() е направена, тъй като съществува вероятност от човешка грешка, водеща до разделяне на кода с проверка/заделяне на памет и извикване на strcpy(), например, при необмислено пренасяне само на част от кода или вмъкване на код между проверката и извикването на strcpy(). Освен това, спирането на използването на strcpy ще позволи да се избегне потока от фалшиви съобщения за уязвимости поради неправилни сработвания на AI-инструментите, които считат наличието на strcpy() за уязвимост без да се вземат предвид проверките в кода.
Източник: opennet.ru
