The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Проект Curl избавился от использования функции strcpy в коде

31.12.2025 09:39

Дэниел Cтенберг (Daniel Stenberg), автор утилиты для получения и отправки данных по сети curl, объявил о прекращении использования функции strcpy() в кодовой базе проекта и запрете применения данной функции в дальнейшем. Решение является продолжением инициированного в прошлом году отказа от использования функции strncpy(), копирующей заданное число байт из входящей строки. Применение strncpy() создавало опасность возникновения ошибок из-за пропуска нулевого символа в конце строки или добавочного заполнения нулями.

Обращения к strncpy() были заменены на функцию strcpy(), перед вызовом которой выполнялось выделение памяти под целевой буфер c учётом размера исходной строки или присутствовала проверка соответствия размера исходной строки и целевого буфера. Замена на функцию 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() уязвимостью без учёта имеющихся в коде проверок.

  1. Главная ссылка к новости (https://daniel.haxx.se/blog/20...)
  2. OpenNews: Утилита wcurl принята в состав проекта Curl
  3. OpenNews: Доступны утилиты wget 1.25 и Curl 8.11. Представлены платные LTS-выпуски Curl
  4. OpenNews: Проблемы из-за подготовленных AI-инструментами отчётов об уязвимостях
  5. OpenNews: Переполнение буфера в curl и libcurl, проявляющееся при обращении через SOCKS5-прокси
  6. OpenNews: В CVE опубликованы отчёты о ложных уязвимостях в curl, PostgreSQL и других проектах
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/64532-strcpy
Ключевые слова: strcpy, curl
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (32) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Ilnarildarovuch (?), 10:12, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Молодцы, хорошее и safe изменение!
     
     
  • 2.20, Аноним (20), 11:35, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Очень affordable
     

  • 1.3, Bottle (?), 10:19, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    А могли бы использовать C++ и не пилить велосипед со строками...
     
     
  • 2.9, Аноним (9), 10:45, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • –5 +/
    а могли бы использовать питон и не заморачиваться вообще, а могли бы заплатить денег индусам и им бы все накодили, а могли бы найти гадалку чтобы она им искала ошибки через спиритические сеансы, ....сколько возможностей упущенно, ай яй яй
     
  • 2.11, Аноним (-), 10:53, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Поясню, программирование на чистом Си похоже на поэзию. Когда вы пишите стихи, люди жившие до вас много раз писали о том, о чём пишите Вы. Но данный факт не является причиной того что не надо писать стихи.

    Что касается технической стороны, C++ не нужен. В учебниках и Интернете много всяких идиом и готовых функций на Си, которые программист может тупо пере-использовать. А если программсит напишет свою функцию, тоже неплохо. Во всяком случае это называется свободный выбор, а не велосипед.

     
  • 2.13, xPhoenix (ok), 11:05, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Рано или поздно и curl на Rust перепишут.
     
     
  • 3.15, Ilnarildarovuch (?), 11:12, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    И это будет отвратительно
     
  • 3.17, Аноним (17), 11:21, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Уточнение:

    Начнут переписывать.

     
     
  • 4.30, Аноним (30), 11:58, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Уточнение:

    второй раз

     
  • 3.21, aname (ok), 11:36, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Ох уж эти тысячи глаз
     

  • 1.4, Аноним (4), 10:26, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Где бенчмарки?
     
  • 1.5, Tron is Whistling (?), 10:27, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ну вот да, если нет managed строк - явная передача размеров буферов - лучшее решение.
     
  • 1.6, kravich (ok), 10:31, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >Кроме того, прекращение использования strcpy позволит избавиться от потока ложных сообщений об уязвимостях из-за некорректных срабатываний AI-инструментов, считающих наличие strcpy() уязвимостью без учёта имеющихся в коде проверок.

    Это какой-то.... позор?

     
     
  • 2.7, Tron is Whistling (?), 10:39, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Что да, то да. Когда термометр на мороженой рыбе показывает +50 - стоит выкинуть термометр.
     
  • 2.22, aname (ok), 11:37, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    С другой стороны, заявляется, что качество кода улучшено.
     

  • 1.10, онанист (?), 10:53, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    из-за некорректных срабатываний AI-инструментов, считающих наличие strcpy() уязвимостью


    очередная победа "безопасности" над здравым смыслом.
    осталось ещё отключить интернет.

     
     
  • 2.24, Аноним (24), 11:41, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    "False positives" существовали всегда, если "эксперты по безопасности", проверяющие код AI-инструментами, об этом не в курсе, то это вопрос квалификации таких "экспертов". (Это, конечно же, не отменяет того факта, что AI в его нынешнем состоянии - срущий под себя младенец, пригодный только для выкачивания денег из инвесторов)
     

  • 1.12, Фонтимос (?), 11:00, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >автор утилиты ..., объявил о

    Очевидно, что если Данила еще немного подумает, то придет к единственно верному решению - переписать вообще на другом актуальном языке.

     
     
  • 2.14, An (??), 11:09, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Зря вы так. C тут то, что доктор прописал. На python слишком медленно будет.
     
  • 2.23, aname (ok), 11:39, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Не совсем понятно, зачем ему что- то переписывать на C#
     
  • 2.33, Аноним (-), 12:20, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Он уже пытался, но неосилил выносить нытье любителей некроплатформ.
    Так что пусть хлебает щии(т) полной ложкой и выдумывает костыли для подпорки проекта.
     

  • 1.19, Аноним (-), 11:31, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Применение strncpy() создавало опасность возникновения ошибок из-за
    > пропуска нулевого символа в конце строки или добавочного заполнения
    > нулями.

    Шикарный йазычог с офигенно продуманной стандартной либой :)
    Прям все сделано для людей.

    > Замена strcpy() на curlx_strcopy() произведена, так как существует
    > вероятность человеческой ошибки, приводящей к разделению кода с
    > проверкой/выделением памяти и вызовом strcpy(), например, при
    > необдуманном переносе лишь части кода или вставки кода между проверкой
    > и вызовом strcpy()

    Хехе, classic.
    Что забавно, даже новая curlx_strcopy не возвращает ошибку, если размеры не подходящие, а молча копирует нулевой символ.

     
     
  • 2.26, Аноним (26), 11:49, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Хехе, classic.

    в топку любые функции в стд, которые используют внутри себя другие функции. Эти функции фактически обертки над memset, пусть эти обертки пишет сам программист под свои задачи, по факту если это функция в стандартной библиотеке, то по существу там все входные параметры должны быть проверены на корректность, и указатели и длины, а тут что? - одни предположения. Мракобесие!

     
  • 2.27, Аноним (26), 11:50, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    правка: memcpy, неважно, суть в общем ясна.
     
  • 2.28, Аноним (28), 11:51, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Шикарный йазычог с офигенно продуманной стандартной либой :)

    Никто не мешает использовать более безопасные инструкции, вместо устаревших. Microsoft ещё в ранних Visual Studio сделала, чтобы компилятор ругался. Ты что ли не стареешь, офигенный продуман.

     

  • 1.25, Аноним (24), 11:47, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Для исключения уязвимостей в коде на Си достаточно средств, предоставляемых самим Си? Ай, беда-трагедия, как же тогда прогресс двигать, если можно без модных язычков обходиться?
     
  • 1.29, Аноним (29), 11:53, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А поцаны, писавшие всю жизнь на паскале и использовавшие для этого string, даже и не знали об этой проблеме. А кто то все еще думает, что паскаль с его строгой типизацией - плохой язык.
     
     
  • 2.32, warlock (??), 12:13, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    string — это который не может быть длиннее 255 символов?
     
     
  • 3.36, Аноним (-), 12:27, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Ты что паскаль последний раз видел когда Ельцин был президентом)?
    String is an alias for ShortString, AnsiString or Unicodestring (UTF16) depending on a compiler setting.

    Т.е оно не просто поддерживает длинные строки, но еще и Unicode.
    Чего дырявым ЯП даже не снилось.

     
  • 2.35, Tty4 (?), 12:23, 31/12/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Паскаль всегда был слишком понятным и эффективным. Если что-то написано - сразу понятно, бред или нет (академический, те физиков и ко, код очень часто бред, просто иногда работает, его в расчет не берём). Очень сложно пускать пыль в глаза, когда Вас легко вывести на чистую воду.
    Поэтому Питон, Си, Раст нужны - мозг свой вынесешь, пока разберёшься, что не так работает.
     

  • 1.31, Аноним (31), 11:58, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    memccpy ему не понравилась? Занулять строку звучит как лютый костыль всё равно, лучше уж abort кидать чтобы баги быстрее пофиксить связанные с неправильным размером буфера.
     
  • 1.34, Tron is Whistling (?), 12:22, 31/12/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вот что криво в этой реализации - нет отработки варианта slen == dsize и src[slen - 1] == 0. Это вполне себе корректный вариант, который тупо пропущен.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру