В утилите для получения и отправки данных по сети curl и развивающейся параллельно библиотеке libcurl выявлена уязвимость (CVE-2023-38545), которая может привести к переполнению буфера и потенциально к выполнению кода атакующего на стороне клиента при обращении при помощи утилиты curl или приложения, использующего libcurl, к HTTPS-серверу, подконтрольному злоумышленнику. Проблема проявляется только в случае включения в curl доступа через прокси SOCKS5. При прямом обращении без прокси уязвимость не проявляется. Уязвимость устранена в выпуске curl 8.4.0. Выявивший ошибку исследователь безопасности получил вознаграждение, размером $4660 в рамках инициативы Internet Bug Bounty на Hackerone...Подробнее: https://www.opennet.dev/opennews/art.shtml?num=59909
Нееет, хватит!
Я уже устал ржать!- socksreq[len++] = (char) hostname_len; /* one byte address length */
+ socksreq[len++] = (unsigned char) hostname_len; /* one byte length */О мой глоб /_-
почему не uint8_t, если уж исправлять.
Возможно еще через 1315 дней можно будет получить еще 4к баксов)
Видимо, для поддержки легаси компиляторов. Вы удивитесь, но в некоторых опенсорс проектах можно найти поддержку даже ANSI C - C89, с кучей грязных хаков.
А как иначе? Вот у меня машина и ПО с 1999 года не обновлялись. А зачем, если всё работает? Я же не смузихлёб ради чиселок обновляться.
а на работу на осле ездите? в метро пускают с ним?
> а на работу на осле ездите? в метро пускают с ним?Ты небось из тех кто с самокатами и велами в метро прется, да? %)
>> а на работу на осле ездите? в метро пускают с ним?
> Ты небось из тех кто с самокатами и велами в метро прется,
> да? %)ну не все же могут ездить на моноколесе - я бы вот и рад, но колени уже не выдержат этого б-ского цирка. С йешаком не пускают, требуют намордник. Вы зубы-то его видали, не говоря уже про другой орган?! Сами вот и пробуйте на него намордник надеть, а я в безопасном месте постою.
Приходится ездить на самокате. (с велосипедом тоже не пускают, не знаю почему... может потому что мой весит около 800 килограмм, даже если передние колесики открутить...)
потому что char всегда 1 байт
>потому что char всегда 1 байткто такое сказал? может очень нужеый ISO стандарт?
*нужный
>>потому что char всегда 1 байт
> кто такое сказал? может очень нужеый ISO стандарт?Вот самое мерзотное в языке Си - это как раз та непонятная муха, укусившая Ритчи, из-за которой он за каким-то совершенно неведомым хреном придумал эти char использовать не по назначению.
Причем в bcpl БЫЛ тип byte.
Как, ну как можно было так долбануться?
А указатель 4 байта. Слишком толстый троллинг.
Просто нужны проверки, статанализатор и божественные сишники (которые обитают только на опеннете, а в дикой природе не водяться).
https://scan.coverity.com/projects/curl
Что-то не сильно помогло.
> Просто нужны проверки, статанализатор и божественные сишники (которые обитают
> только на опеннете, а в дикой природе не водяться).Автор сабжа так то вполне крутой и правильный сишник. А лоханулся он в общем то в процессе ... рефактора. Когда приделал логику резольвера к машине состояний - на что оно изначально расчитано не было вообще. Ну дальше логика и отъехала.
p.s. а дебиан уже обновил эту штуку.
> Автор сабжа так то вполне крутой и правильный сишник. А лоханулся он
> в общем то в процессе ... рефактора. Когда приделал логику резольвера
> к машине состояний - на что оно изначально расчитано не было
> вообще. Ну дальше логика и отъехала.а вот писал бы на нескучном язычке - не было бы проблемы с логи... waaaait... oh shi....
впрочем, не написал бы а начал бы переписывать - все б получилось. Но он почему-то не хочет.
> p.s. а дебиан уже обновил эту штуку.
а смысл? многие реально используют libcurl для хождения через socks5 на вредоносные сайты?
проблема - яйца выеденного не стоила. новость от любителей хрустохайпа.
> а вот писал бы на нескучном язычке - не было бы проблемы с логи... waaaait... oh shi....Думаешь, питоняша вообще в курсе что такое машина состояний? И тем более может написать мелкую шуструю не прожорливую либу которая проживет почти 3 десятка лет? У них как максимум получится наколенный шитец с периодом полураспада год. Может два, если очень повезло.
> впрочем, не написал бы а начал бы переписывать - все б получилось. Но он почему-то не хочет.
Догадывается о объеме работ и о том что серебряных пуль не бывает. А еще такой ЯП привлечет долбоклюев-комитеров в проект и CVE за ними не заржавеет. Вон на софт на расте уже сотни CVE есть - при том что этого софта еще поискать.
> а смысл? многие реально используют libcurl для хождения через socks5 на вредоносные сайты?
В моей конфиге в паре мест могло реально взять и у...ть, но по ряду организационных и технических проблем с этим возникли бы определенные сложности. Однако зафиксить для порядка надлежит. Самое стебное? А на самом древнем серваке, который я поленился с 10 демьяна перетащить вулна как раз и не получилось, там еще багованого кода не было. Тот редкий случай когда некромансер все же взял свое.
> проблема - яйца выеденного не стоила. новость от любителей хрустохайпа.
Да как сказать, автырь либы и сам не против пиара - чтоб побыстрее обновили. Безопасность бывает 2 уровней - high и нехай.
А как нескучный язык на этапе компиляции определит, что потом, во время работы курлу не прилетит урл длиннее 64 (кб или скок там)? Или просто внедрит то, что в ненавистных паскалях было уже десятилетия назад?
> А как нескучный язык на этапе компиляции определит, что потом, во время
> работы курлу не прилетит урл длиннее 64 (кб или скок там)?как всегда когда ему надо работать с данными из внешнего источника - unsafe { мамой клянус что бэзопастно! }
> Или просто внедрит то, что в ненавистных паскалях было уже десятилетия
> назад?просто пока будешь на нем писать стейтмашину - зае...шься бегать от борова и сдохнешь. Нет кода - нет увизгвимостей!
Язык никак не определит, но переполнения буфера бы не было. Да, туда бы попал только обрезанный урл и это всё привело бы к ошибке, но это была бы просто ошибка в curl (в крайней случае курл бы просто упал), а не уязвимость с возможность запустить код.
Всего. Лишь. Ошибка.
Всего. Лишь. Падение.
Мда.
Всего. Лишь. Не выполнили чужой код.
Хотя стоп, это уже не всего лишь.
> для хождения через socks5 на вредоносные сайты?детский сад. любой сайт может стать вредоносным.
Ты не смог в сарказм. А автор и правда матёрый сишник. И код у него настоящий, а не как у местных божественных сишников.
И пофиг что оно никогда бы не вызвало проблемы - если бы автор не банально запутался в _логике_ своей "стейт машины".щвятой хруст от этого конечно бы безусловно помог - хрен бы тот осилил написать стейтмашину попутно без конца бегая от безумного борова. Нет кода - нет и увизгвимостей, шах и мат неудачники.
Какой громкий пук!
Естественно, только "пох" знает, что мог или не мог автор. Вот это самомнение!Даже несмотря на то что сам автор говорит, что нескучный язычек помог бы решить эту проблему.
Когда включаешь в clang максимальные варинги он ещё и не такое начиает обругивать.
Но это же надо потом тыщи варнингов отсмотреть и исправить...
Поэтому никто не включает.
У автора фикса довольно интерсная статья https://daniel.haxx.se/blog/2023/10/11/how-i-made-a-heap-ove.../ .С неожиданными откровениями (нет) и выводами (да).
Например про 1000чи глаз:
Reading the code now it is impossible not to see the bug. Yes, it truly aches having to accept the fact that I did this mistake without noticing and that the flaw then remained undiscovered in code for 1315 days.
It could have been detected with a better set of tests.Кто виноват:
Yes, this family of flaws would have been impossible if curl had been written in a memory-safe language instead of C, but porting curl to another language is not on the agenda.И про, "что делать":
The only approach in that direction I consider viable and sensible is to:
- allow, use and support more dependencies written in memory-safe languages and
- potentially and gradually replace parts of curl piecemeal, like with the introduction of hyper.
(hyper написан на Rust)
Растофанатик не умеет си и ругает его? Где-то я уже это видел. Плохому танцору вечно что-то мешает. Потом и раст будет мешать, помяните моё слово.
Чел пишет курл на сишке с 1996 года и не умеет в си?
Ты совсем бо-бо?Может он просто знает хорошие и плохие стороны языка?
> Чел пишет курл на сишке с 1996 года и не умеет в
> си?
> Ты совсем бо-бо?Какая аналогия между тем, что он что-то пишет с 96 года и знанием? Полно антипримеров.
> Может он просто знает хорошие и плохие стороны языка?
Ну знал бы, добавил бы статический анализатор, асан, юбисан, тесты в конце концов Итд итп и нашёл бы уязвимость
хорошая сторона - на си удалось написать curl, который использует пол-планеты (вторая-то половина просто вызывает встроенный в винду веб-клиент)плохая сторона - можно запутаться в собственной логике и написать не совсем работающий код (переписать причем - работавший). Безусловно от этого очень поможет нескучный язычок. Нет кода - нет проблемы.
Внедрено: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/2e42b0a252416803a90ea232...
Не исправлено наряду с похожими: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/7fb7f2413194e7f7a21716f8...
Если я правильно нашел его линкедын, то он Professional C++ development for Unix и Technical Lead C++, а на момент написания бага Independent Computer Software ProfessionalЭто просто какой-то позор (с)
Вполне определённый позор. Но, в то время было значительно хуже со статическими анализаторами (хотя и сегодня не каждый использует smatch) и дешёвых рантайм анализаторов вроде asan, которые можно было бы пофаззить, тоже не существовало. Я, конечно, не утверждаю, что автор что-то из этого умеет использовать и сегодня.
В какое "то время" O_o?
Socks вмерджили в основную ветку курлс в феврале 2020 года
"On February 14 2020 I landed the main commit for this change in master. It shipped in 7.69.0"Не, ну я понимаю, что сейчас время такое, что год за пять идет)))
> В какое "то время" 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-78fe660c...
838 + socksreq[len++] = (char) hostname_len; /* one byte address length */
https://github.com/curl/curl/commit/4a4b63daaa#diff-78fe660c...
Кстати в плюсах не приняты такие касты. Там принят static_cast<>. Очень длинно и заставляет задуматься.
auto i = static_cast<int>(1);
В плюсах вполне можно кастовать в С-шном стиле.
Вы, уже свой позор начали ваять?
Сейчас этот башмачник скажет, что это не баг и он святой.
Не скажет. Этот "башмачник" реально умеет код писать (и написал). Это только местные боги сишечки багов не делают (потому, что код не пишут).
Ну баг и баг зато софт есть, а на другой языке нормального софта нет. Вы так бы и сидели в каменном веке поклоняясь своему языку, на котором ничего не написано.
Так для этого софта "который есть", автор сам хочет переписать бекенд на безопасный язык.
И предлагает, та-дам, Rust!В его блог-посте про hyper (https://daniel.haxx.se/blog/2020/10/09/rust-in-curl-with-hyper/)
Сurl and its data transfer core, libcurl, is all written in C. The language C is known and infamous for not being memory safe and for being easy to mess up and as a result accidentally cause security problems.
...
curl is a piece of “insecure” C code installed in some ten billion installations world-wide.
...
With a backend library written in Rust , libcurl would lean on such a component to do low level protocol work and presumably, by doing this it increases the chances of the implementations to be safe and secure.Более того, он ведет подсчет, сколько багов получилось из-за дырявого языка
Including the latest two CVEs reported for curl 8.4.0, the accumulated total says that 41% of the security vulnerabilities ever found in curl would likely not have happened should we have used a memory-safe language.
> Так для этого софта "который есть", автор сам хочет переписать бекенд нано не может.
> И предлагает, та-дам, Rust!
"не рассматривается".
А предлагает он - использовать вместо собственного кода - некую hrenь на хрусте. Уже кем-то написанную. Но не им. Следующий логичный шаг - а зачем нам теперь вообще curl?
> curl is a piece of “insecure” C code installed in some ten
> billion installations world-wide.
> With a backend library written in RustВместо 10000000 останутся только линуксоподелки под две единственно-верных архитектуры. Зато безопастные. так и победим.
отдельный привет всему софту который сейчас линкуется с крохотной libcurl, которую и используют-то в основном из-за ее компактности (и уже потом только - всеядности) а дальше внезапно получит в довесок пол-гига статического хлама из миллиона васянских крейтов.
> А предлагает он - использовать вместо собственного кода - некую hrenь на
> хрусте. Уже кем-то написанную. Но не им. Следующий логичный шаг -
> а зачем нам теперь вообще curl?К вопросу о том как вежливо и политкорректно послать хрустиков жрать свое... это самое :)))
> Вместо 10000000 останутся только линуксоподелки под две единственно-верных архитектуры.
> Зато безопастные. так и победим.Ну как бы у сишки как ЯП есть довольно назойливые грабли с одной стороны - и е...чий ISO клавший на них болт - с другой. Все же инженерные проблемы надо решать, а не заметать под ковер.
> отдельный привет всему софту который сейчас линкуется с крохотной libcurl, которую и
> используют-то в основном из-за ее компактности (и уже потом только -
> всеядности) а дальше внезапно получит в довесок пол-гига статического хлама из
> миллиона васянских крейтов.Ну дык вот libcurl это и правда достаточно мелкая неинтрузивная либа. Если уж наезжать на кого так это openssl, по CVE в месяц стабильно просто, при том даже если им раст дать или что там, они не криптографы и вон там сертификат например нормально проверить не могли и какие-то совсем васянские серты стали катить за чистую монету. Ну и вот чем им поможет хруст? А ты соответственно введешь свои кренделя на сайте банка. Приколов.
> Ну дык вот libcurl это и правда достаточно мелкая неинтрузивная либа. Если
> уж наезжать на кого так это openssl, по CVE в месяцтак его уже (дважды? Или больше - я сбился со счета уже этим васяноподелкам) переписькали?
Правда, видимо, по прежнему ничего не работает, поскольку даже величайший гугель так и остался на своей ниправильной увизгвимой реализации на сях, где половина фич не работает потому что гугелю нинада, затобезопастна (нет кода - нет проблемы, традиционное решение же ж).
Зато они переписькали какой-то ненужно-загрузчик каких-то ненужно-vm внутри ведроида. Ни один эксперт опеннета не смог понять даже что это за хрень и для чего она там - но все в восторге от невиданных узбеков.
> 41% of the security vulnerabilities ever found in curl would likely not have happened should we have used a memory-safe language.Получается, 59% уязвимостей будут бережно воспроизведены и в Rust-коде. Но "дырявую Сишку" периодически аудируют пользующие её гугли, а безопасТному расту все доверятся не глядя и вообще перестанут уязвимости искать и находить.
Интересно, сколько из уязвимостей можно закрыть fortified source и прочие настройки компилятора. Понятно, что все те 41% будут закрыты с -fsanitize=address
т.е если после смены языка уйдут 41% дыреней, этого мало?
да ты просто зажрался!Я понимаю, что тебе не нравится когда унижают дыряшку, но что поделаешь жизнь такая.
Каменный век закончился, не потому что закончились камни.
> т.е если после смены языка уйдут 41% дыреней, этого мало?Какая разница сколько уйдёт? Главное, сколько останется.
Если аудит регулярный, сколько он находит проблем (1-100) роли не играет, он находит их пачками - условно ВСЁ, что сейчас находится. Количество говорит лишь о качестве разработки, а не о безопасности кода. Найдут хотя бы одну - код уже потенциально небезопасный, на любом языке. И ведь найдут. Потому что, чем больше вносится изменений, тем выше риск ошибки. Даже если ты Раст-гуру с 4-мя глазами.
>уйдут 41% дыренейИ близко не стоит переписывания рабочего проекта на другой язык.
Господи, когда же это кончится...
Без уязвимостей не будет развития
Глупость, очевидно, что развитие будет только при устранении уязвимостей.
$4660 не за эксплуатацию уязвимости, а просто за переполнение? Не многовато ли?
Для иностранцев четыря тыщи это наоборот же очень мало вроде? Я слышал там за четыре тыщи пустой main пишут, и то в неделю.
Этого хватит чтобы оплатить электричество, потреблённое компьютером и хотдог.
Что же получается, помимо указанной уязвимости? Если в качестве SOCKS5 используется TOR, то если длина URL > 256, имеет место обращение к DNS, следовательно, возможен деанон. Если, конечно, правилами файервола не запрещено прямое хождение в инет.
Это неэксплуатабельно в интернете: DNS-имя не может быть больше 254 байт. Поэтому протокол SOCKS5 такие длинные имена и не поддерживает.
>При длине имени хоста до 256 символов curl сразу передаёт имя в SOCKS5-прокси для резолвинга на его стороне, а если имя больше 255 символов переключается на локальный резолвер и передаёт в SOCKS5 уже определённый адрес.Вот так можно деанонимизировать пользователей Tor, из-за бэкдора в libcurl?
Любая потенциально возможная к эксплуатации уязвимост ьв сетевом софте может потенциально быть деанонимизирующей.
Для тебя это новость?
Походу эта бырка была для кого надо дырка
https://github.com/curl/curl/commit/fb4415d8aee6c1045be932a3...Для нужд кого надо кое-как на коленке вделали технологическое отверстие, да нечаянно уязвимость открыли в переполнении буфера. Так бы никто и не узнал, ибо исходники больших запутанных проектов со спагетти-подходом, особенно на необъектно-ориентированных языках вроде сишки, где накладные расходы на паттерны и чистый код превышают выгоду (нет бы на C++ всё переписать!), знает только их автор, а остальным в них копаться нет резона, но технологическое отверстие было вделано криво и инногда приводило к заражению крови, то есть к повреждению памяти, сепсису и смерти процесса. Кто-то был достаточно дотошным и раскопал. Пришлось извиняться и писать целый пост для отведения глаз, хотя ежу понятно, что в случае использования SOCKS5 если указанно DNS-запросы пускать через прокси - то надо так и делать, а не саботировать процесс. Это как если бы автозак для этапирования заключённого после 256 легоньких стуков изнутри по кузову по двери открывался и выпускал зэка вместо того, чтобы приводить к приходу конвоира с дубинкой.
Эта дырка неэксплуатабельна в интернете: DNS-имя не может быть больше 254 байт. Поэтому протокол SOCKS5 такие длинные имена и не поддерживает.
Если сильно фапать на безопасность, можно просто собирать с hardened параметрами копмпилятора, а если фапать ещё упорнее, то с -fsanitize=address
Не ты чо, проще еще один язык программирования выучить!
Вы что то путаете.
Санитайзер сборки они для отладки.Чтобы найти эту и подобные проблемы обычно достаточно включить все доступные варнинги и компилятор покажет все похожие места.