URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 110730
[ Назад ]

Исходное сообщение
"Ошибка в GCC привела к игнорированию режима выявления пробле..."

Отправлено opennews , 19-Мрт-17 11:43 
Разработчики Fedora Linux столкнулись (https://lists.fedoraproject.org/archives/list/devel-announce.../) с заслуживающей внимания проблемой, связанной с ненадлежащей работой предоставляемых в GCC дополнительных проверок для блокирования проблем, вызванных ошибками форматирования строки. Начиная с Fedora 21 пакеты в дистрибутиве собираются (https://fedoraproject.org/wiki/Changes/FormatSecurity) с опцией "-Werror=format-security", которая приводит к выводу ошибки в случае выявления компилятором GCC проблем с форматированием строк, которые потенциально могут привести к появлению уязвимостей.


В процессе тестирования новой ветки Fedora, в которой будет задействован GCC 7 (релиз GCC 7 ожидается в апреле), разработчики столкнулись с ошибкой, вызванной тем, что флаг "-Werror=format-security" игнорировался при определённом стечении обстоятельств. В итоге возникла ситуация когда массовая пересборка всех пакетов проходила без ошибок, но фактически сборка ряда пакетов должна была завершиться ошибкой, чего не произошло и проблемы с форматированием строк в данных пакетах оставались незамеченными.


Проблема всплыла только после внесения в GCC 7 изменения (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677), исправляющего ошибку (https://bugzilla.redhat.com/show_bug.cgi?id=1425825) разбора параметров командной строки (одновременное указание "-Werror=format-security" и "-Wall" или "-Wformat" приводило к игнорированию "-Werror=format-security"). Ошибка присутствует достаточно давно и проявлялась (https://gcc.gnu.org/ml/gcc-bugs/2012-04/msg02134.html) как минимум в ветке GCC 4. При обновлении GCC 7 некоторые пакеты в Fedora перестали собираться и уполномоченным разработчикам пришлось в экстренном порядке вносить правки (как правило замена  printf(variable) на printf("%s", variable)), не дожидаясь реакции мэйнтейнеров.


Дополнительно можно отметить решение (https://lists.fedoraproject.org/archives/list/devel-announce.../) отложить альфа-выпуск Fedora 26 на одну неделю  в связи с невыполнением критериев качества.
В частности, в репозитории остаются неисправленными 4 проблемы (https://qa.fedoraproject.org/blockerbugs/milestone/26/alpha/...), которые отнесены к категории блокирующих выпуск: проблемы с настройкой ssh-ключей в cloud-init, сбой в запуске gnome-initial-setup, если в инсталляторе не был добавлен пользователь, крах пакета с ядром на  Allwinner SoC, проблемы с настройкой FreeIPA  в инсталляторе. В качестве новой даты релиза Fedora 26 названо (https://fedoraproject.org/wiki/Releases/26/Schedule) 20 июня, вместо изначально запланированного 6 июня.  Напомним, что начиная с Fedora 27 подготовка альфа-выпуска будет упразднена (https://www.opennet.ru/opennews/art.shtml?num=46173).

URL: https://lists.fedoraproject.org/archives/list/devel-announce.../
Новость: https://www.opennet.ru/opennews/art.shtml?num=46224


Содержание

Сообщения в этом обсуждении
"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 19-Мрт-17 11:43 
А почему не на puts(variable)?

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено фывфыв , 19-Мрт-17 12:17 
Потому-что puts() добавляет '\n' в конце.

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено ytrewq , 19-Мрт-17 19:07 
не заблуждай, почитай ман вначале

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено фывфыв , 19-Мрт-17 22:39 
Не тупи, прочитай стандарт.
> The puts function writes the string pointed to by s to the stream pointed to by stdout, and appends a new-line character to the output.

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Sabakwaka , 19-Мрт-17 20:26 
>> А почему не на puts(variable)

Потому, что строковая строка?


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Я , 19-Мрт-17 22:01 
Потому что компилятор сам заменит printf() на puts()

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Мальчикдевопс , 20-Мрт-17 10:17 
но только если в конце printf есть '\n'

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 19-Мрт-17 12:13 
у gcc вообще основная фича, в том что они косячут и годами эти ошибки не хотят исправлять. причем ошибки на ошибки у них там вполне накладываться друг на друга могу. ну а то что все управляющие флаги игнорируются в чём то, и всегда генерется определенный код это уже каноническая особенность gcc, например попробуйте без cmov комманд бинарник делать.

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено freehck , 19-Мрт-17 12:20 
> у gcc вообще основная фича, в том что они косячут и годами эти ошибки не хотят исправлять.

Ммм, как интересно.

> В процессе тестирования новой ветки Fedora, в которой будет задействован GCC 7 (релиз GCC 7 ожидается в апреле)

А может быть проблема в том, что Fedora, которая испытательный-полигон-на-пользователях-для-RedHat пихает в продакшен нерелизнутые версии компилятора?


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено нонанон , 19-Мрт-17 12:33 
> А может быть проблема в том, что Fedora, которая испытательный-полигон-на-пользователях-для-RedHat пихает в продакшен нерелизнутые версии компилятора?

Ну сказано же ну: "Ошибка присутствует достаточно давно и проявлялась как минимум в ветке GCC 4"


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено freehck , 19-Мрт-17 13:25 
На то он и тестируемая ветвь компилятора, чтобы выявлять вот такие вот баги. Да, некоторые из них старые, но ведь вскрылось-то только сейчас. Это вообще весьма распространённое явление в больших проектах, когда две ошибки компенсируют друг друга, и остаются незамеченными долгое время.

Вот если бы об ошибке знали, начиная с релиза GCC4 и игнорировали - был бы уже другой разговор. А вот на таких вот новостях кричать "косячат и не хотят исправлять" - нонсенс.


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 19-Мрт-17 13:46 
Короче, мы вас поняли, все версии gcc с 4 по 7 - тестовый полигон, косяки в них не считаются.

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 19-Мрт-17 14:16 
Ошибка в том что компилировалось, хотя не должно было. А в GCC 7 исправили. И теперь не компилится.

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Michael Shigorin , 20-Мрт-17 11:07 
> Ошибка в том что компилировалось, хотя не должно было.
> А в GCC 7 исправили. И теперь не компилится.

Как там было у Немет: "если программа собралась с первого раза -- позовите системного программиста, он исправит компилятор".


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 19-Мрт-17 14:31 
До этой части что не позволило дочитать?
> Проблема всплыла только после внесения в GCC 7 изменения, исправляющего ошибку разбора параметров командной строки

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 19-Мрт-17 15:19 
> в которой будет задействован GCC 7 (релиз GCC 7 ожидается в апреле),

Я правильно понял: взяли сырой билд и надулись, что он не работает как стабильный релиз?


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено axredneck , 19-Мрт-17 16:45 
С gcc 4, 5, 6 та же проблема

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 19-Мрт-17 19:20 
Наоборот, в GCC 7 поправили древний баг и после этого в Fedora перестала собираться куча пакетов.

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 19-Мрт-17 20:06 
> Наоборот, в GCC 7 поправили древний баг и после этого в Fedora перестала собираться куча пакетов.

Руководи Линус разработкой gcc, он бы откатил этот патч, как это было сделано несколько лет назад с подсистемой терминалов, после чего мейнтейнер сложил обязанности по поддержанию подсистемы и теперь она никем не поддерживается.


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 19-Мрт-17 23:46 
Эти пакеты не должны были собираться с опцией "-Werror=format-security", так как в них был кривой код, на который эта опция обязана выдавать ошибку.

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 20-Мрт-17 10:36 
https://linux.slashdot.org/story/09/07/29/1925224/alan-cox-q... (там есть ссылка на lkml.org)

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено RobotsCantPoop , 19-Мрт-17 21:09 
А если в GCC исправить все баги, то перестанет собираться вообще всё?

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено nobody , 20-Мрт-17 09:47 
Не исключено :-) В мире GNU во всяком случае.
Ну а вообще в MS VC++ всё ещё хуже. Там десятилетиями даже С++98 правильно не реализован. Сейчас, вроде, взялись за ум, даже на обратную совместимость плюнули. Поглядим, что из этого выйдет

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 20-Мрт-17 15:35 
Зачем MS какие-то стандарты? Они сами - стандарт!

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено nobody , 21-Мрт-17 09:59 
Вот слава Аллаху, что эти времена проходят. Сейчас осталось только две программные платформы: POSIX и Windows. Жду не дождусь, когда последняя или сдохнет, или переродится в POSIX. Это будет оргазм для системного программиста

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Led , 21-Мрт-17 00:46 
> Поглядим, что из этого выйдет

Вендузятник должен не поглядеть, а страдать.



"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено анонимус вульгарис , 20-Мрт-17 14:27 
Нет, поправили древний баг, после чего стала собираться кучка пакетов с дырявым кодом, который должен был зафейлить сборку.

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 20-Мрт-17 04:26 
> printf(variable) на printf("%s", variable))

Что за адский хардкодер лабает такие вещи?


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 20-Мрт-17 05:37 
Больше чем ты думаешь. Такое даже в sudo находили (кажется было в отладочных сообщениях, включалось через -vvvvvv).

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено nobody , 20-Мрт-17 09:50 
> Ошибка присутствует достаточно давно и проявлялась как минимум в ветке GCC 4
> отложить альфа-выпуск Fedora 26 на одну неделю в связи с невыполнением критериев качества. В частности, в репозитории остаются неисправленными 4 проблемы, которые отнесены к категории блокирующих выпуск

То есть больше 10 лет баги никто не видел, с ними выпускали релизы, а тут вдруг внезапно они стали блокирующими :-\


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено anonymous , 20-Мрт-17 09:53 
> одновременное указание "-Werror=format-security" и "-Wall" или "-Wformat"

а так же стопятьсот избыточных, повторяющихся и взаимно-противоречивых опций, которые сборщики федоры подсовывают в сборку пакетов...


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено snmp agent , 20-Мрт-17 13:04 
Интересно, я один не врубался, о каких "проблемах с форматированием строк" речь, пока не посмотрел в man gcc?

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено анонимус вульгарис , 20-Мрт-17 14:32 
Рекомендую почитать:
https://www.securecoding.cert.org/confluence/display/c/FIO30...
Там ещё много интересного.

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 20-Мрт-17 18:42 
> Интересно, я один не врубался, о каких "проблемах с форматированием строк" речь,
> пока не посмотрел в man gcc?

Нет, вас таких много:
https://www.cvedetails.com/google-search-results.php?q=forma...


"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено Аноним , 20-Мрт-17 14:04 
Уж сколько лет известно об printf format string уязвимостях, а люди упорно используют printf даже в С++ программах, вместо iostreams.

"Ошибка в GCC привела к игнорированию режима выявления пробле..."
Отправлено freehck , 20-Мрт-17 21:39 
Ну так уязвимости форматных строк - сродни XSS в браузерах. Не давайте пользователю заполнять формат, и всё будет хорошо.