Daniel Stenberg, autor da ferramenta de transferência de dados via rede curl, anunciou a interrupção do uso da função strcpy() na base de código do projeto e a proibição do uso dessa função no futuro. A decisão é uma continuidade da desistência do uso da função strncpy(), que copia um número especificado de bytes da string de entrada, iniciada no ano passado. O uso de strncpy() apresentava riscos de erros devido à possibilidade de omissão do caractere nulo no final da string ou preenchimento adicional com zeros.
As chamadas para strncpy() foram substituídas pela função strcpy(), antes da qual foi realizada a alocação de memória para o buffer de destino, levando em conta o tamanho da string original ou a verificação da correspondência entre o tamanho da string original e o buffer de destino. A substituição pela função strlcpy() não foi realizada, pois sempre era necessário copiar a string completa ou retornar um erro.
Agora, todas as chamadas a strcpy() foram substituídas pela nova função curlx_strcopy(dest, dsize, src, slen). A função curlx_strcopy() exige a especificação do tamanho do buffer de origem e de destino, considerando que o buffer de destino deve ser maior que o buffer de origem para acomodar o caractere nulo no final da string, que é adicionado pela função para evitar sua omissão durante a cópia. Se o tamanho do buffer de destino for maior que zero, mas insuficiente para copiar a string de destino, um byte nulo é adicionado ao início. 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; }
A substituição de strcpy() por curlx_strcopy() foi feita devido à probabilidade de erro humano, levando à fragmentação do código com verificações/alocações de memória e chamada a strcpy(), por exemplo, ao mover impulsivamente apenas parte do código ou inserir código entre a verificação e a chamada a strcpy(). Além disso, a interrupção do uso de strcpy permitirá eliminar o fluxo de mensagens falsas sobre vulnerabilidades devido a false positives de ferramentas de IA, que consideram a presença de strcpy() uma vulnerabilidade sem levar em conta as verificações existentes no código.
Fonte: opennet.ru
