The OpenNET Project / Index page

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

Ошибка в GCC привела к игнорированию режима выявления проблем с форматированием строк

19.03.2017 11:23

Разработчики Fedora Linux столкнулись с заслуживающей внимания проблемой, связанной с ненадлежащей работой предоставляемых в GCC дополнительных проверок для блокирования проблем, вызванных ошибками форматирования строки. Начиная с Fedora 21 пакеты в дистрибутиве собираются с опцией "-Werror=format-security", которая приводит к выводу ошибки в случае выявления компилятором GCC проблем с форматированием строк, которые потенциально могут привести к появлению уязвимостей.

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

Проблема всплыла только после внесения в GCC 7 изменения, исправляющего ошибку разбора параметров командной строки (одновременное указание "-Werror=format-security" и "-Wall" или "-Wformat" приводило к игнорированию "-Werror=format-security"). Ошибка присутствует достаточно давно и проявлялась как минимум в ветке GCC 4. При обновлении GCC 7 некоторые пакеты в Fedora перестали собираться и уполномоченным разработчикам пришлось в экстренном порядке вносить правки (как правило замена printf(variable) на printf("%s", variable)), не дожидаясь реакции мэйнтейнеров.

Дополнительно можно отметить решение отложить альфа-выпуск Fedora 26 на одну неделю в связи с невыполнением критериев качества. В частности, в репозитории остаются неисправленными 4 проблемы, которые отнесены к категории блокирующих выпуск: проблемы с настройкой ssh-ключей в cloud-init, сбой в запуске gnome-initial-setup, если в инсталляторе не был добавлен пользователь, крах пакета с ядром на Allwinner SoC, проблемы с настройкой FreeIPA в инсталляторе. В качестве новой даты релиза Fedora 26 названо 20 июня, вместо изначально запланированного 6 июня. Напомним, что начиная с Fedora 27 подготовка альфа-выпуска будет упразднена.

  1. Главная ссылка к новости (https://lists.fedoraproject.or...)
  2. OpenNews: В DNS-сервере BIND устранен серьёзный сбой, возникший из-за изменений в оптимизаторе GCC
  3. OpenNews: Разработчики Mozilla столкнулись с проблемой производительности в GCC 4.5
  4. OpenNews: Линус Торвальдс выступил с резкой критикой GCC 4.9.0
  5. OpenNews: Оптимизация кода компилятором может привести к появлению проблем безопасности в приложениях
  6. OpenNews: Дэниэл Бернштейн выступил с инициативой создания Си-компилятора для защищённого ПО
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/46224-gcc
Ключевые слова: gcc
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (36) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 11:43, 19/03/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А почему не на puts(variable)?
     
     
  • 2.6, фывфыв (?), 12:17, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • +10 +/
    Потому-что puts() добавляет '\n' в конце.
     
     
  • 3.25, ytrewq (?), 19:07, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • –7 +/
    не заблуждай, почитай ман вначале
     
     
  • 4.31, фывфыв (?), 22:39, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Не тупи, прочитай стандарт.
    > 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

     
  • 2.28, Sabakwaka (ok), 20:26, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >> А почему не на puts(variable)

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

     
  • 2.30, Я (??), 22:01, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Потому что компилятор сам заменит printf() на puts()
     
     
  • 3.42, Мальчикдевопс (?), 10:17, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • +/
    но только если в конце printf есть '\n'
     

  • 1.5, Аноним (5), 12:13, 19/03/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –12 +/
    у gcc вообще основная фича, в том что они косячут и годами эти ошибки не хотят исправлять. причем ошибки на ошибки у них там вполне накладываться друг на друга могу. ну а то что все управляющие флаги игнорируются в чём то, и всегда генерется определенный код это уже каноническая особенность gcc, например попробуйте без cmov комманд бинарник делать.
     
     
  • 2.7, freehck (ok), 12:20, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > у gcc вообще основная фича, в том что они косячут и годами эти ошибки не хотят исправлять.

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

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

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

     
     
  • 3.10, нонанон (?), 12:33, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • +5 +/
    > А может быть проблема в том, что Fedora, которая испытательный-полигон-на-пользователях-для-RedHat пихает в продакшен нерелизнутые версии компилятора?

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

     
     
  • 4.15, freehck (ok), 13:25, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    На то он и тестируемая ветвь компилятора, чтобы выявлять вот такие вот баги. Да, некоторые из них старые, но ведь вскрылось-то только сейчас. Это вообще весьма распространённое явление в больших проектах, когда две ошибки компенсируют друг друга, и остаются незамеченными долгое время.

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

     
     
  • 5.16, Аноним (-), 13:46, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Короче, мы вас поняли, все версии gcc с 4 по 7 - тестовый полигон, косяки в них не считаются.
     
  • 4.19, Аноним (-), 14:16, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Ошибка в том что компилировалось, хотя не должно было. А в GCC 7 исправили. И теперь не компилится.
     
     
  • 5.44, Michael Shigorin (ok), 11:07, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Ошибка в том что компилировалось, хотя не должно было.
    > А в GCC 7 исправили. И теперь не компилится.

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

     
  • 4.20, Аноним (-), 14:31, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    До этой части что не позволило дочитать?
    > Проблема всплыла только после внесения в GCC 7 изменения, исправляющего ошибку разбора параметров командной строки
     

  • 1.23, Аноним (-), 15:19, 19/03/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    > в которой будет задействован GCC 7 (релиз GCC 7 ожидается в апреле),

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

     
     
  • 2.24, axredneck (?), 16:45, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    С gcc 4, 5, 6 та же проблема
     
  • 2.26, Аноним (-), 19:20, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Наоборот, в GCC 7 поправили древний баг и после этого в Fedora перестала собираться куча пакетов.
     
     
  • 3.27, Аноним (-), 20:06, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Наоборот, в GCC 7 поправили древний баг и после этого в Fedora перестала собираться куча пакетов.

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

     
     
  • 4.33, Аноним (-), 23:46, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Эти пакеты не должны были собираться с опцией "-Werror=format-security", так как в них был кривой код, на который эта опция обязана выдавать ошибку.
     
     
  • 5.43, Аноним (-), 10:36, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • +/
    https://linux.slashdot.org/story/09/07/29/1925224/alan-cox-quits-as-linux-tty- (там есть ссылка на lkml.org)
     
  • 3.29, RobotsCantPoop (?), 21:09, 19/03/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А если в GCC исправить все баги, то перестанет собираться вообще всё?
     
     
  • 4.39, nobody (??), 09:47, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Не исключено :-) В мире GNU во всяком случае.
    Ну а вообще в MS VC++ всё ещё хуже. Там десятилетиями даже С++98 правильно не реализован. Сейчас, вроде, взялись за ум, даже на обратную совместимость плюнули. Поглядим, что из этого выйдет
     
     
  • 5.51, Аноним (-), 15:35, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Зачем MS какие-то стандарты? Они сами - стандарт!
     
     
  • 6.56, nobody (??), 09:59, 21/03/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Вот слава Аллаху, что эти времена проходят. Сейчас осталось только две программные платформы: POSIX и Windows. Жду не дождусь, когда последняя или сдохнет, или переродится в POSIX. Это будет оргазм для системного программиста
     
  • 5.55, Led (ok), 00:46, 21/03/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Поглядим, что из этого выйдет

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


     
  • 3.49, анонимус вульгарис (?), 14:27, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, поправили древний баг, после чего стала собираться кучка пакетов с дырявым кодом, который должен был зафейлить сборку.
     

  • 1.34, Аноним (-), 04:26, 20/03/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > printf(variable) на printf("%s", variable))

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

     
     
  • 2.35, Аноним (-), 05:37, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Больше чем ты думаешь. Такое даже в sudo находили (кажется было в отладочных сообщениях, включалось через -vvvvvv).
     

  • 1.40, nobody (??), 09:50, 20/03/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    > Ошибка присутствует достаточно давно и проявлялась как минимум в ветке GCC 4
    > отложить альфа-выпуск Fedora 26 на одну неделю в связи с невыполнением критериев качества. В частности, в репозитории остаются неисправленными 4 проблемы, которые отнесены к категории блокирующих выпуск

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

     
  • 1.41, anonymous (??), 09:53, 20/03/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    > одновременное указание "-Werror=format-security" и "-Wall" или "-Wformat"

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

     
  • 1.45, snmp agent (?), 13:04, 20/03/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Интересно, я один не врубался, о каких "проблемах с форматированием строк" речь, пока не посмотрел в man gcc?
     
     
  • 2.50, анонимус вульгарис (?), 14:32, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Рекомендую почитать:
    https://www.securecoding.cert.org/confluence/display/c/FIO30-C.+Exclude+user+i
    Там ещё много интересного.
     
  • 2.53, Аноним (-), 18:42, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Интересно, я один не врубался, о каких "проблемах с форматированием строк" речь,
    > пока не посмотрел в man gcc?

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

     

  • 1.48, Аноним (-), 14:04, 20/03/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Уж сколько лет известно об printf format string уязвимостях, а люди упорно используют printf даже в С++ программах, вместо iostreams.
     
     
  • 2.54, freehck (ok), 21:39, 20/03/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Ну так уязвимости форматных строк - сродни XSS в браузерах. Не давайте пользователю заполнять формат, и всё будет хорошо.
     

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



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

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