The OpenNET Project / Index page

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

Переполнение буфера в curl и libcurl, проявляющееся при обращении через SOCKS5-прокси

11.10.2023 15:20

В утилите для получения и отправки данных по сети curl и развивающейся параллельно библиотеке libcurl выявлена уязвимость (CVE-2023-38545), которая может привести к переполнению буфера и потенциально к выполнению кода атакующего на стороне клиента при обращении при помощи утилиты curl или приложения, использующего libcurl, к HTTPS-серверу, подконтрольному злоумышленнику. Проблема проявляется только в случае включения в curl доступа через прокси SOCKS5. При прямом обращении без прокси уязвимость не проявляется. Уязвимость устранена в выпуске curl 8.4.0. Выявивший ошибку исследователь безопасности получил вознаграждение, размером $4660 в рамках инициативы Internet Bug Bounty на Hackerone.

Уязвимость вызвана ошибкой в коде резолвинга имени хоста перед обращением к SOCKS5-прокси. При длине имени хоста до 256 символов curl сразу передаёт имя в SOCKS5-прокси для резолвинга на его стороне, а если имя больше 255 символов переключается на локальный резолвер и передаёт в SOCKS5 уже определённый адрес. Из-за ошибки в коде, флаг, указывающий на необходимость локального резолвинга, в процессе медленного согласования соединения через SOCKS5 мог быть выставлен не в то значение, что приводило к записи длинного имени хоста в буфер, выделенный с расчётом на сохранение IP-адреса или имени, не превышающего 255 символов.

Владелец сайта, к которому curl обращается через SOCKS5-прокси, может инициировать переполнение буфера на стороне клиента, вернув в ответ код перенаправления запроса (HTTP 30x) и выставив в заголовке "Location:" URL с именем хоста, размер которого находится в диапазоне от 16 до 64 КБ (значение 16 КБ обусловлено минимальным размером, необходимым для переполнения выделенного буфера, а значение 65 КБ связано с максимально разрешённой длиной имени хоста в URL). Если в настройках libcurl разрешено перенаправление запросов и используемый SOCKS5-прокси достаточно медленный, то имя длинное хоста будет записано в небольшой буфер, заведомо меньшего размера.

Уязвимость в основном затрагивает приложения на базе libcurl и проявляется в утилите curl только при использовании опции "--limit-rate" со значением, меньше 65541 - в libcurl по умолчанию выделяется буфер, размером 16 КБ, а в утилите curl - 100 КБ, но этот размер меняется в зависимости от значения параметра "--limit-rate".

Дэниел Cтенберг (Daniel Stenberg), автор проекта, упомянул, что уязвимость оставалась незамеченной в течение 1315 дней. Также сказано, что 41% от ранее выявленных в curl уязвимостей вероятно удалось бы избежать, если бы curl был написан на языке, обеспечивающем безопасную работу с памятью, но переписывать curl на другой язык в обозримом будущем не планируется. В качестве мер для повышения безопасности кодовой базы предлагается расширить инструментарий для тестирования кода и более активно использовать зависимости, написанные на языках программирования, обеспечивающих безопасную работу с памятью. Также рассматривается возможность поэтапной замены частей curl на варианты, написанные на безопасных языках, такие как экспериментальный HTTP-бэкенд Hyper, реализованный на языке Rust.

  1. Главная ссылка к новости (https://daniel.haxx.se/blog/20...)
  2. OpenNews: В CVE опубликованы отчёты о ложных уязвимостях в curl, PostgreSQL и других проектах
  3. OpenNews: Релиз утилиты cURL 8.0
  4. OpenNews: Выпуск утилиты curl 7.75.0 с экспериментальным HTTP-бэкендом на языке Rust
  5. OpenNews: Выпуск curl 7.71.0 с устранением двух уязвимостей
  6. OpenNews: Уязвимости в Cisco RV32x были "устранены" через блокировку запросов от утилиты curl
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/59909-curl
Ключевые слова: curl
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (69) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 16:12, 11/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Нееет, хватит!
    Я уже устал ржать!

    - socksreq[len++] = (char) hostname_len; /* one byte address length */
    + socksreq[len++] = (unsigned char) hostname_len; /* one byte length */

    О мой глоб /_-

     
     
  • 2.5, anonymmm (?), 16:29, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    почему не uint8_t, если уж исправлять.
     
     
  • 3.6, Аноним (1), 16:31, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Возможно еще через 1315 дней можно будет получить еще 4к баксов)
     
  • 3.9, ТОФУ (?), 16:38, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Видимо, для поддержки легаси компиляторов. Вы удивитесь, но в некоторых опенсорс проектах можно найти поддержку даже ANSI C - C89, с кучей грязных хаков.
     
     
  • 4.44, Аноним (44), 18:01, 11/10/2023 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
     
  • 5.59, по (?), 20:22, 11/10/2023 Скрыто ботом-модератором     [к модератору]
  • +5 +/
     
     
  • 6.60, Аноним (-), 21:14, 11/10/2023 Скрыто ботом-модератором     [к модератору]
  • +1 +/
     
     
  • 7.69, пох. (?), 07:39, 12/10/2023 Скрыто ботом-модератором     [к модератору]
  • +1 +/
     
  • 3.76, Аноним (76), 09:29, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    потому что char всегда 1 байт
     
     
  • 4.77, Аноним (77), 09:42, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    >потому что char всегда 1 байт

    кто такое сказал? может очень нужеый ISO стандарт?

     
     
  • 5.78, Аноним (77), 09:43, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    *нужный
     
  • 5.96, пох. (?), 20:00, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >>потому что char всегда 1 байт
    > кто такое сказал? может очень нужеый ISO стандарт?

    Вот самое мерзотное в языке Си - это как раз та непонятная муха, укусившая Ритчи, из-за которой он за каким-то совершенно неведомым хреном придумал эти char использовать не по назначению.

    Причем в bcpl БЫЛ тип byte.

    Как, ну как можно было так долбануться?


     
  • 4.94, uis (??), 18:15, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А указатель 4 байта. Слишком толстый троллинг.
     
  • 2.11, Аноним (11), 16:40, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Просто нужны проверки, статанализатор и божественные сишники (которые обитают только на опеннете, а в дикой природе не водяться).
     
     
  • 3.32, Анонимусс (?), 17:24, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    https://scan.coverity.com/projects/curl
    Что-то не сильно помогло.
     
  • 3.50, Аноним (-), 18:49, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Просто нужны проверки, статанализатор и божественные сишники (которые обитают
    > только на опеннете, а в дикой природе не водяться).

    Автор сабжа так то вполне крутой и правильный сишник. А лоханулся он в общем то в процессе ... рефактора. Когда приделал логику резольвера к машине состояний - на что оно изначально расчитано не было вообще. Ну дальше логика и отъехала.

    p.s. а дебиан уже обновил эту штуку.

     
     
  • 4.57, пох. (?), 20:06, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Автор сабжа так то вполне крутой и правильный сишник. А лоханулся он
    > в общем то в процессе ... рефактора. Когда приделал логику резольвера
    > к машине состояний - на что оно изначально расчитано не было
    > вообще. Ну дальше логика и отъехала.

    а вот писал бы на нескучном язычке - не было бы проблемы с логи... waaaait... oh shi....

    впрочем, не написал бы а начал бы переписывать - все б получилось. Но он почему-то не хочет.

    > p.s. а дебиан уже обновил эту штуку.

    а смысл? многие реально используют libcurl для хождения через socks5 на вредоносные сайты?

    проблема - яйца выеденного не стоила. новость от любителей хрустохайпа.

     
     
  • 5.61, Аноним (-), 21:20, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Думаешь, питоняша вообще в курсе что такое машина состояний И тем более может н... большой текст свёрнут, показать
     
  • 5.67, Аноним (67), 02:43, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    А как нескучный язык на этапе компиляции определит, что потом, во время работы курлу не прилетит урл длиннее 64 (кб или скок там)? Или просто внедрит то, что в ненавистных паскалях было уже десятилетия назад?
     
     
  • 6.70, пох. (?), 07:41, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > А как нескучный язык на этапе компиляции определит, что потом, во время
    > работы курлу не прилетит урл длиннее 64 (кб или скок там)?

    как всегда когда ему надо работать с данными из внешнего источника - unsafe { мамой клянус что бэзопастно! }

    > Или просто внедрит то, что в ненавистных паскалях было уже десятилетия
    > назад?

    просто пока будешь на нем писать стейтмашину - зае...шься бегать от борова и сдохнешь. Нет кода - нет увизгвимостей!

     
  • 6.82, Аноним (11), 11:29, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Язык никак не определит, но переполнения буфера бы не было. Да, туда бы попал только обрезанный урл и это всё привело бы к ошибке, но это была бы просто ошибка в curl (в крайней случае курл бы просто упал), а не уязвимость с возможность запустить код.
     
     
  • 7.98, Аноним (98), 23:26, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Всего. Лишь. Ошибка.
    Всего. Лишь. Падение.
    Мда.
     
     
  • 8.104, Аноним (1), 10:09, 13/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Всего Лишь Не выполнили чужой код Хотя стоп, это уже не всего лишь ... текст свёрнут, показать
     
  • 5.73, ivan_erohin (?), 08:53, 12/10/2023 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 4.83, Аноним (11), 11:30, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Ты не смог в сарказм. А автор и правда матёрый сишник. И код у него настоящий, а не как у местных божественных сишников.
     
  • 2.52, пох. (?), 18:56, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • –5 +/
    И пофиг что оно никогда бы не вызвало проблемы - если бы автор не банально запутался в _логике_ своей "стейт машины".

    щвятой хруст от этого конечно бы безусловно помог - хрен бы тот осилил написать стейтмашину попутно без конца бегая от безумного борова. Нет кода - нет и увизгвимостей, шах и мат неудачники.

     
     
  • 3.54, Аноним (1), 19:20, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Какой громкий пук!
    Естественно, только "пох" знает, что мог или не мог автор. Вот это самомнение!

    Даже несмотря на то что сам автор говорит, что нескучный язычек помог бы решить эту проблему.

     
  • 2.102, Ivan_83 (ok), 00:02, 13/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Когда включаешь в clang максимальные варинги он ещё и не такое начиает обругивать.
    Но это же надо потом тыщи варнингов отсмотреть и исправить...
    Поэтому никто не включает.
     

  • 1.7, Аноним (1), 16:35, 11/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    У автора фикса довольно интерсная статья https daniel haxx se blog 2023 10 11 ... большой текст свёрнут, показать
     

     ....ответы скрыты (4)

  • 1.17, Аноним (17), 16:48, 11/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Внедрено:

    Daniel S (4 Jan 2008)
    - Based on Maxim Perenesenko's patch, we now do SOCKS5 operations and let the
      proxy do the host name resolving and only if --socks5ip (or
      CURLOPT_SOCKS5_RESOLVE_LOCAL) is used we resolve the host name locally and
      pass on the IP address only to the proxy.

    https://github.com/curl/curl/commit/2e42b0a252416803a90ea232dc94a0a21d5a97e5


    Не исправлено наряду с похожими:

    Apr 24, 2010

    socks5: please static code analyzer
    ...
    The change of (char) to (unsigned char) will fix long user names
    and passwords on systems that have the char type signed by
    default.

    https://github.com/curl/curl/commit/7fb7f2413194e7f7a21716f86c765ad47c66fadf

     
     
  • 2.22, Аноним (1), 16:59, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Если я правильно нашел его линкедын, то он Professional C++ development for Unix и Technical Lead C++, а на момент написания бага Independent Computer Software Professional

    Это просто какой-то позор (с)

     
     
  • 3.26, Аноним (26), 17:10, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вполне определённый позор. Но, в то время было значительно хуже со статическими анализаторами (хотя и сегодня не каждый использует smatch) и дешёвых рантайм анализаторов вроде asan, которые можно было бы пофаззить, тоже не существовало. Я, конечно, не утверждаю, что автор что-то из этого умеет использовать и сегодня.
     
     
  • 4.29, Анонимусс (?), 17:15, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    В какое "то время" O_o?
    Socks вмерджили в основную ветку курлс в феврале 2020 года
    "On February 14 2020 I landed the main commit for this change in master. It shipped in 7.69.0"

    Не, ну я понимаю, что сейчас время такое, что год за пять идет)))

     
     
  • 5.36, Аноним (17), 17:41, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    > В какое "то время" O_o?
    > Socks вмерджили в основную ветку курлс в феврале 2020 года
    > "On February 14 2020 I landed the main commit for this change
    > in master. It shipped in 7.69.0"

    608 -    socksreq[len++] = (char) hostname_len; /* address length */

    https://github.com/curl/curl/commit/4a4b63daaa#diff-78fe660c824aecd5441947d6f4

    838 +       socksreq[len++] = (char) hostname_len; /* one byte address length */

    https://github.com/curl/curl/commit/4a4b63daaa#diff-78fe660c824aecd5441947d6f4

     
  • 3.40, Аноним (17), 17:58, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Кстати в плюсах не приняты такие касты. Там принят static_cast<>. Очень длинно и заставляет задуматься.
     
     
  • 4.80, Аноним (76), 10:31, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    auto i = static_cast<int>(1);
     
  • 4.105, Neon (??), 03:50, 15/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    В плюсах вполне можно кастовать в С-шном стиле.
     
  • 3.89, Аноним (89), 16:00, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вы, уже свой позор начали ваять?
     

  • 1.25, Бульдох (?), 17:08, 11/10/2023 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –1 +/
     

     ....ответы скрыты (11)

  • 1.55, Аноним (55), 19:54, 11/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Господи, когда же это кончится...
     
     
  • 2.72, FF (?), 08:01, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Без уязвимостей не будет развития
     
     
  • 3.85, Аноним (85), 12:25, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Глупость, очевидно, что развитие будет только при устранении уязвимостей.
     

  • 1.56, Аноним (56), 20:03, 11/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    $4660 не за эксплуатацию уязвимости, а просто за переполнение? Не многовато ли?

     
     
  • 2.65, Да ну нахер (?), 21:43, 11/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Для иностранцев четыря тыщи это наоборот же очень мало вроде? Я слышал там за четыре тыщи пустой main пишут, и то в неделю.
     
     
  • 3.68, Аноним (67), 02:45, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Этого хватит чтобы оплатить электричество, потреблённое компьютером и хотдог.
     

  • 1.74, Аноним (74), 09:04, 12/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Что же получается, помимо указанной уязвимости? Если в качестве SOCKS5 используется TOR, то если длина URL > 256, имеет место обращение к DNS, следовательно, возможен деанон. Если, конечно, правилами файервола не запрещено прямое хождение в инет.
     
     
  • 2.88, Аноним (88), 12:47, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Это неэксплуатабельно в интернете: DNS-имя не может быть больше 254 байт. Поэтому протокол SOCKS5 такие длинные имена и не поддерживает.
     

  • 1.81, Аноним (81), 11:28, 12/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >При длине имени хоста до 256 символов curl сразу передаёт имя в SOCKS5-прокси для резолвинга на его стороне, а если имя больше 255 символов переключается на локальный резолвер и передаёт в SOCKS5 уже определённый адрес.

    Вот так можно деанонимизировать пользователей Tor, из-за бэкдора в libcurl?

     
     
  • 2.84, Аноним (11), 11:37, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Любая потенциально возможная к эксплуатации уязвимост ьв сетевом софте может потенциально быть деанонимизирующей.
    Для тебя это новость?
     
     
  • 3.86, Аноним (86), 12:28, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Походу эта бырка была для кого надо дырка https github com curl curl commit fb... большой текст свёрнут, показать
     
     
  • 4.87, Аноним (88), 12:47, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Эта дырка неэксплуатабельна в интернете: DNS-имя не может быть больше 254 байт. Поэтому протокол SOCKS5 такие длинные имена и не поддерживает.
     

  • 1.92, uis (??), 18:04, 12/10/2023 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Если сильно фапать на безопасность, можно просто собирать с hardened параметрами копмпилятора, а если фапать ещё упорнее, то с -fsanitize=address
     
     
  • 2.101, Аноним (98), 23:40, 12/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Не ты чо, проще еще один язык программирования выучить!
     
  • 2.103, Ivan_83 (ok), 00:04, 13/10/2023 [^] [^^] [^^^] [ответить]  
  • +/
    Вы что то путаете.
    Санитайзер сборки они для отладки.

    Чтобы найти эту и подобные проблемы обычно достаточно включить все доступные варнинги и компилятор покажет все похожие места.

     

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



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

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