Доступен выпуск проекта GNU Wget2 2.2.1, развивающего переписанный с нуля и полностью переработанный вариант программы для автоматизации рекурсивной загрузки контента GNU Wget. Wget2 предоставляет набор дополнительных опций, поддерживает загрузку в несколько потоков, позволяет использовать доступную функциональность через библиотеку libwget, поддерживает протоколы HTTP/2 и TLS 1.3, даёт возможность загружать только изменившиеся данные, может сохранять данные с серверов потокового вещания, корректно обрабатывает интернационализированные доменные имена и может перекодировать загружаемое содержимое. Утилита wget2 поставляется под лицензией GPLv3+, а библиотека под LGPLv3+...Подробнее: https://www.opennet.ru/opennews/art.shtml?num=64561
> отсутствие должной проверки файловых путейНикогда такого не было и вот опять
> Wget2 ... переписанный с нуля и полностью переработанный вариант ... уязвимость, допускающая перезапись произвольных файлов.Получается, в исходном непереписанном вгете этого не было, а после переписывания - появилось?!
Ребят, когда качаешь через Wget/Wget2 (с обычного https-сайта), провайдер не видит что скачиваешь?
URL видит, содержимое не видит. От скачивания броузером особо не отличается.
а чем url внутни http, отличается от содержимого? парочкой символов перевода строки..а, если https?> От скачивания броузером особо не отличается.
в любом браузере есть опция экспорта запроса в curl/wget и тд, такой запрос вообще с точность до байта эквивалентен
> а чем url внутни http, отличается от содержимого?Вы правы, URL тоже зашифрован. Снаружи только сокет, на который идёт запрос.
> провайдер не видит что скачиваешь?Клоудфлуря всё видит.
> Никогда такого не было и вот опятьНестареющая классика жанра :)
Этих вгетов развелось еще... Подскажите, какой самый трушный и в чем разница?
Ни тот, ни другой на паскале не написан.> без проверки фактического размера записываемых данных
В паскале есть ключ компиляции array range check: в зависимости от ситуации делает проверку во время компиляции или при выполнении программы. В си - есть что-то подобное? Если есть, почему программисты об этом не знают? Если нету (а паскаль так-то постарше си будет) - почему никто из программистов не догадался добавить опцию в компилятор?
> В си - есть что-то подобное?Пф... ну у тебя и требования!
> Если есть, почему программисты об этом не знают?
Типикал Сишник даже стандарт не читал)
> Если нету (а паскаль так-то постарше си будет) - почему никто из программистов не догадался добавить опцию в компилятор?
Ты еще спроси когда СИшники осилили добавить boolean в язык))
Подсказка в С23.
Всего 50 лет ушло на то, что уже было в ALGOL 60.Думаю еще через лет 20 они добавят data type String чтобы перестать каждый раз бегать в поискать null-terminator, терять его и получать очередную CVE.
> Ты еще спроси когда СИшники осилили добавить boolean в язык))
> Подсказка в С23.вся суть маркетинга растосекты. сходил бы ты в гугл что ли
тебя ещё в проекте не было, когда в си добавили бул. просто на твоих сельских курсах вайтишников ни один инфоцыган об этом не знает
> тебя ещё в проекте не было, когда в си добавили бул.Если ты про stdbool.h то типиКАЛ костыли для недоязычка
#define true 1
#define false 0dii.uchile.cl/~daespino/files/Iso_C_1999_definition.pdf
7.16 Boolean type and values <stdbool.h>Особенно пocoсным выглядит пункт 4
Notwithstanding the provisions of 7.1.3, a program may undefine and perhaps then
redefine the macros bool, true, and false.
Но для недоязыков это нормально.А вот тебе стандарт С23, надеюсь ты умеешь читать на английском.
open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf
6.4.4.6 Predefined constants
predefined-constant:
false
true
> костыли для недоязычкаПомнится, они долго не могли сообразить, что такое nil, меняя определение несколько раз. Потом приняли, что это "тождественно равно числовому нулю".
P.S. макрос NULL имеется ввиду.
> Помнится, они долго не могли сообразить, что такое nil, меняя определение несколько раз. Потом приняли, что это "тождественно равно числовому нулю".А определение нуля они определили))?
The macros are
NULL
which expands to an implementation-defined null pointer constantВообще кажется что комитет это просто сборище поехавших и наркош.
Мало того что они ввели безумное количество UB хотя можно было бы implementation-defined.
Но этого было мало, и они решили ломать уже то что работало.До C23 было
if new_size is zero, the behavior is implementation defined (null pointer may be returned (in which case the old memory block may or may not be freed), or some non-null pointer may be returned that may not be used to access storage).А теперь
zero-sized reallocations with realloc are undefined behavior;̶с̶е̶л̶ ̶н̶а̶ ̶п̶е̶н̶е̶к̶ написал realloc(ptr, 0); получил UB и твоя програма превратилось в ̶к̶у̶с̶о̶к̶ ̶к̶а̶л̶а̶ какой-то код с нарушением Conformance
Продолжаем хохму:"Dereferencing a null pointer is undefined behavior in C" - вроде нормально, рядовое UB.
...Ноесть нюанс:
"in x86 real mode, the address 0000:0000 is readable and also usually writable, and dereferencing a pointer to that address is a perfectly valid"
На Си нельзя писать без UB.
> Продолжаем хохму:
> "Dereferencing a null pointer is undefined behavior in C" - вроде нормально,
> рядовое UB.С одной стороны типа да, но с другой... у вас с 99 стандарта оно было "implementation defined".
Т.е выбор из ограниченного списка который должен быть ЗАДОКУМЕНТИРОВАН.И тут возжа попадает под хвост и комитет yмcтвeнно oтcтaлых ayтистoв решает сделать undefined behavior.
> Ноесть нюанс:
> "in x86 real mode, the address 0000:0000 is readable and also usually
> writable, and dereferencing a pointer to that address is a perfectly valid"Хороший нюанс) Хватит чтобы отстрелить ногу по самую опу
> На Си нельзя писать без UB.
Поэтому C in CVE is for C language (c)
> "in x86 real mode, the address 0000:0000 is readable and also usually writable, and dereferencing a pointer to that address is a perfectly valid"А если у нас ARM?
У нас же СИшечка портабельная?
Чего адепты постоянно жужжат что "на вашем #### не поддерживается motorola 68k!!111, а вооот на СИ!"На ARM Cortex-M за подобное MPU просто сделает Hard Fault.
Ибо нефиг.
> На ARM Cortex-M за подобное MPU просто сделает Hard Fault.На каким именно? На младших M0-ках по этим адресам может быть отображено ОЗУ. Там же таблица векторов - прекрасно читается, иногда пишется (если ОЗУ).
> тебя ещё в проекте не было, когда в си добавили бул.А вот, кстати, и первый п0циэнт, который "стандарт" не читал!
И обратите внимание как быстро он с агрился.
Наверное это сегодняшний дежурный из секты растохейтеров.
тип boolean, конечно, не осилили добавить, а тип _Bool вообще-то с C99.
> тип boolean, конечно, не осилили добавить, а тип _Bool вообще-то с C99.Да, я ж написал про stdbool.h
Особенно класно в "стандарте" прописан размер типа.
An object declared as type _Bool is large enough to store the values 0 and 1.
Вот прямым тестом "а фиг его знает, главное чтобы 0-1 влез".Ну и сверху это щедро обмазывается ̶г̶о̶в̶н̶ макросами и дефайнами.
Но! В стандарте сказано, что если, не дай бог-машина, у вас где-то undef, то ваша программа превращается в тыкву.Notwithstanding the provisions of 7.1.3, a program may undefine and perhaps then
redefine the macros bool, true, and false.2
> Bool is large enough to store the values 0 and 1Особенно классно, когда делают параметр Bool в многопараметрической функции из какой-нибудь библиотеки, а ты сидишь и гадаешь, а каким размером скомпилирован тот параметр, чтобы не промахнуться при обращении в список параметров?
> сидишь и гадаешьЗато не на паскале! (с)
Вооще читая что стандарт, что код удивляешься как оно вообще может работать.
И вспоминаешь байку про "программистов, дятла и конец цивилизации"))
>> тип boolean, конечно, не осилили добавить, а тип _Bool вообще-то с C99.
> Да, я ж написал про stdbool.hНу, тогда при чём тут С23. В нём только, если правильно помню, решили, что путь уже будет bool штатным ключевым словом, а не переопределяться через #define на _Bool.
В том что в C23 они смогли наконец то формализовать это самый бул.Но он отличается от старого
The type bool shall have one value bit and (sizeof(bool)*CHAR_BIT)- 1А теперь сравни это со старым
An object declared as type _Bool is large enough to store the values 0 and 1.
> В том что в C23 они смогли наконец то формализовать это самый
> бул.
> Но он отличается от старого
> The type bool shall have one value bit and (sizeof(bool)*CHAR_BIT)- 1
> А теперь сравни это со старым
> An object declared as type _Bool is large enough to store the
> values 0 and 1.C99 6.2.5 Types
...
2 An object declared as type _Bool is large enough to store the values 0 and 1.
...C23 6.2.5 Types
...
2 An object declared as type bool is large enough to store the values false and true.
...И да, в С23, кроме bool в качестве ключевых слов добавили true и false, которые теперь имеют тип bool. Так-что, наверное, Вы хотели сказать, что в С с версии стандарта С23 наконец-то появились значения true и false, а не сам тип, который, как раннее было сказано, появился ещё в С99.
> Ты еще спроси когда СИшники осилили добавить boolean в язык))
> Подсказка в С23.А ты, бедненький, не знал, что сишка прекрасно обходилась (и обходится) 0 и 1?
> Всего 50 лет ушло на то, что уже было в ALGOL 60.И? Ты уверен, что под капотом там будет не те же самые 0 и 1?
>на паскале не написанМеня вообще не это интересовало. Есть два каких-то wget. Зачем? Какой из них лучше и где глянуть сравнение?
Оба хуже.
Такой же дырявый хлам
curl.se/docs/CVE-2023-38545.html
Лучше всех aria2
https://github.com/aria2/aria2
https://aria2.github.io/
Без поддержки socks даже через tsocks оно не нужно, в эпоху повсеместных квнвпнвлес у каждой второй бабушки.
Потому что в си нет массивов, в нем есть указатели.a[i] это просто синтаксический сахар для *(a + i)
Не совсем правда. Тип массива есть, но он существует только когда ты определяешь тип автоматической или статической переменной.А вот адресация внутри этого массива - да, синтаксический сахар, потому что массив всегда деградирует в указатель на первый элемент.
> потому что массив всегда деградирует в указатель на первый элемент.А потом чтобы узнать "а сколько у нас элементов" приходится бегать каждый раз до конца массива.
Или лепить сбоку и хранить отдельно.
> чтобы узнать "а сколько у нас элементов" приходится бегать каждый раз до конца массива.То есть, с Си ты знаком очень поверхностно.
>> чтобы узнать "а сколько у нас элементов" приходится бегать каждый раз до конца массива.
> То есть, с Си ты знаком очень поверхностно.Ну скажи мне сколько символов в unicode строке.
И как их быстро посчитать.
Строки в СИ это же массивы, да?))
>>> чтобы узнать "а сколько у нас элементов" приходится бегать каждый раз до конца массива.
>> То есть, с Си ты знаком очень поверхностно.
> Ну скажи мне сколько символов в unicode строке.вообще, как-бы, unicode бывают разные.
Если смотреть UTF-8, то там надо пройти все байты, чтобы понять сколько символов. Так-что, считай, всё-равно надо бежать до конца массива и по пути считать символы, которые могут быть и один байт, и два, и три и даже, если сильно повезёт с эмодзи и прочими редкими иероглифами, даже четыре.
Если смотреть UTF-16, то сначала там было всё здорово, число 16-ти битных слов совпадало с числом символов (если правильно помню в бытность UCS-2), но потом, пришли умные люди и придумали суррогатные пары, и теперь и их надо, по нормальному, тоже считать, пробегая до условного конца массива.
И остался UTF-32, в котором число 32-х битных слов совпадает с числом символов.
Э, ну вот у меня указатель на первый элемент struct {}. Как мне узнать, сколько их там? Очевидно, никак. Размер должен передаваться как то. Или обычно считать, что элемент один.
это просто такой helper для выделения фиксированного непрерывного объема памяти на стеке (или глобальной преаллокации при старте программы). в итоге все равно имеем указатель
1-й GNU Wget и busybox wget лучше.
Aria2
Wget2 работает с HTTPS только через GnuTLS. Фтопку такое поделие!
>Wget2 работает с HTTPS только через GnuTLS. Фтопку такое поделие!А чо так толсто-то? Правильные люди используют код исключительно написанный для GNU.
В итоге или сидят в консольке или на Хурде?))
Потому что х11 это не ГНУ.
И браузеры тоже.
GNU всегда было знаком какчества!
Буквально вчера была новость про GnuPG, которая позволяет обойти верификацию и выполнить свой код.
И вот теперь про GNU Wget...
Это GNU Wget2. Он хостится в каком-то болоте, не имеющем отношения к GNU.
> переполнение буфера в коде чистки имён файлов в функции get_local_filename_real(), потенциально способное привести к исполнению кода при обработке специально оформленных URLЗвучит круто!
Фикс просто обалденный
char *fname_esc = (sizeof(tmp) < buf.length * 3 + 1)
- ? tmp
- : wget_malloc(buf.length * 3 + 1);
+ ? wget_malloc(buf.length * 3 + 1)
+ : tmp;
Просто перепутали местами значения в тирнарном операторе.
Код был с Jul 29, 2023Автор и первого б̶е̶к̶д̶о̶р̶а̶ бага и его исправления Tim Rühsen.
Настоящий сидой дыд с "over 30 years of experience"
zymtrace.com/article/welcoming-tim-ruhsen/Maintainer of GNU libidn, GNU libidn2 and GNU Wget. Contributor to GnuTLS and libmicrohttp.
Интересно за 30 лет он код научился тестировать?
Или "и так сойдет")
это ж опен сурсе
для тестирования , да и исправления,есть юзеры
тысячи глаз (тм)
Зато можно с гордостью за свой код писать:
Around 2014, I began contributing to open-source projects and became (co-)maintainer of GNU Wget, GnuTLS, and GNU libidn. Two of my own projects, Wget2 and libpsl, are now packaged in almost every Linux distribution.
Тут явно же видно, что не в перестановке дело а в условии.Наиболее вероятно при просмотре условие инвертировал для читабельности, а выражения местами забыл поменять. Как вариант - отвлекли.
> Наиболее вероятно при просмотре условие инвертировал для читабельности,
> а выражения местами забыл поменять.Никто ничего не менял, код зашел одним коммитом.
gitlab.com/gnuwget/wget2/-/commit/3dc30f5f0c6f8feae97f866c537324f821ea05d6Просто кто-то не умеет в память :)
> Как вариант - отвлекли.
Рептилоиды с Нибиру?)
> Никто ничего не менял, код зашел одним коммитом.Ты явно с Нибиру.
Как то что ты говорил опровергает то, что писал я?
У тебя нибирушная логика.
> Автор и первого б̶е̶к̶д̶о̶р̶а̶ бага и его исправления Tim Rühsen.Немцы те еще бекдорщики :)
> переполнение буфера потенциально способное привести к
> исполнению кодаНикогда такого не было и вот опять!
> при обработке специально оформленных URL на загружаемых страницах
А можно дропать юзверю хомяка?
Офгенное решение чтобы всякие хитрецы не выкачивали сайт wget'ом.
> Например, атакующий может перезаписать содержимое ... ~/.bashrc и добиться выполнения своего кода в системеа в bashrc пишем известную команду по зачиствке хомяка...
> Офгенное решение чтобы всякие хитрецы не выкачивали сайт wget'ом.Удивительная жадность.
А мне кажется, сишники специально делают CVE в своих опусах, ради чёрного пиара своих продуктов. Это же тоже пиар. Больше CVE - больше людей узнают о твоём GNU творении из новостей! Вот так вот!
Зачем было переписывать? Юзаю 1.25 и никаких проблем.
> Зачем было переписывать? Юзаю 1.25 и никаких проблем.Ты реально думаешь, что wget 1 был менее дыряв?
У меня для тебя плохие новости))CVE-2019-5953 9.8 CRITICAL
GNU Wget 1.20.1 and Earlier Buffer Overflow Vulnerability Leading to DoS or Remote Code ExecutionCVE-2014-4877 9.3 HIGH - Public exploit exists!
GNU Wget Absolute Path Traversal via FTP LIST Response Allows Remote Code Execution Before 1.16CVE-2017-13089 9.3 HIGH - Potential exploit
GNU Wget: stack overflow in HTTP protocol handlingCVE-2017-13090 9.3 HIGH
GNU Wget: heap overflow in HTTP protocol handlingCVE-2024-38428 9.1 CRITICAL
GNU Wget url.c Userinfo Semicolon Handling Vulnerability Leading to URI Parsing Errors
Это только со score 9 и больше.
И опять Buffer Overflow, stack overflow, heap overflow
Эээ, а чё ему такие высокие очки накидали? Это юзерспейнсая программа, не требующая особых привилегий, а скор такой, будто баг в ядре нашли или в openssl.
Прямо-таки парад найденных в СПО уязвимостей. Косвенно это говорит о том, что ведется серьезная работа по уменьшению его дырявости, под будущую кибервойну. Можно на уровне сервисов внедрить _более безопасный_ раст, но остаться с дыркой в какой-нибудь крон джобе, использующей вгет.
> Прямо-таки парад найденных в СПО уязвимостей.Системы автоматического поиска проблем просто стали намного круче.
Стали доступны не только спецам.
И внезапно оказалось что диды код писать не умели.
Системы эффективно применить тоже нужны спецы. В конечном счете все сводится к наличию ресурсов на все это.> внезапно оказалось что диды код писать не умели
Спойлерну: отцы, дети и внуки тоже не умеют. Точнее умеют, но не будут. То есть будут, но при финансировании которого не будет, поэтому не будут ))
> диды код писать не умелиИли наоборот - умели? Как история с пейджерами.
wget2 - это то ещё говно. В нём даже базовые фичи вроде SOCKS5 не поддерживаются, зато куча ненужных свистоперделок добавлена.
Блин, эти уязвимости удивительно похожи, такое ощущение, что с ними можно справиться централизованно.
> с ними можно справиться централизованноМожно. Но почему-то не нужно.
> поддерживает протоколы HTTP/2 и TLS 1.3,Остали на 10 лет, однако. Где поддержка HTTP/3, Web 3.0 и вот это все?
> Где поддержка HTTP/3, Web 3.0 и вот это все?Уже не актуально, ты отстал от прогресса.