23.02 // Лишний goto поломал SSL/TLS в iOS
Анализ внезапно выпущенного на днях обновления iOS до версии 7.0.6 выявил замечательную ошибку, позволяющую сайту отдавать iOS-устройствам одноразовые ключи, подписи которых вообще не имели отношения к его сертификату. Т.е. приводящей к фактически полной неработоспособности всего механизма SSL/TLS.
Причина ошибки – лишний goto (привет копипасту), который всегда приводил к переходу в конец функции, минуя проверку sslRawVerify.
А вообще, увидев в 21 веке такое количество goto в коде, хочется передать отдельный привет отпраздновавшему на той неделе 80 лет Вирту. Спагетти-код неистребим.
Источник: http://bugtraq.ru/rsn/archive/2014/02/02.html
Губит людей
не пивоне goto, а бездумная копипаста. Иногда проще использовать goto чем наворачивать лишние сущности. Да какие там макароны, красота сплошная и читабельность.Каждое goto — ветвление в логике. Каждое ветвление увеличивает число вариантов исполнения программы в два раза. Например, 4 ветвления — уже окло 16 вариантов. Человеку их будет тяжело проанализировать, поэтому даже в императивщие goto рекомендуют, только когда уж совсем без него никак. А по-хорошему, императивщина — помойка изначально. К счастью, создатели современных языков это понимают и стараются вводить нужные функциональные концепты в язык, даже если он преимущественно позицинируется, как императивный.
комментариев: 1060 документов: 16 редакций: 32
Я так понимаю, ошибка была в обновлении добавлена? А вот интересно, что вообще надо было исправлять сейчас в таком месте кода?
комментариев: 11558 документов: 1036 редакций: 4118
комментариев: 1060 документов: 16 редакций: 32
Я хочу по итогам
немного побрюзжатьследующее сказать:1) В if-else всегда надо использовать операторные скобки. Два оператора после if – очень частая ошибка. Наличие операторных скобок по крайней мере позволяет заметить, что что-то не так после автоматического переформатирования кода. (У них же есть внутренние стандарты на стиль и форматирование, да?)
2) Появление неиспользуемых участков кода также должно настораживать, особенно, если это не целая функция/метод, а какой-то небольшой участок.
3) Ошибка также могла быть вызвана некорректным слиянием двух веток. Интересно, были ли при это конфликты?
Торчат уши одного небезызвестного агенства? :)
комментариев: 11558 документов: 1036 редакций: 4118
Автор далее рассуждает, почему такой вариант представляется маловероятным.
комментариев: 1060 документов: 16 редакций: 32
комментариев: 9796 документов: 488 редакций: 5664
А Б. Шнайер рассуждает наоборот.
[offtop]
А ещё Шнайер пишет местами бред про пароли.
Эта цитата из блога Шнайера, в общем случае — бред. В словарях Diceware примерно 12.8 бит энтропии на слово. Если фразу выбирать из 10 рэндомных слов, то получится 128-бит стойкости. Мы это уже обсуждали.
[/offtop]
комментариев: 11558 документов: 1036 редакций: 4118
В принципе, каждый, кто много пишет (речь не о выверенных научных статьях) имеет шанс время от времени выдавать какой-нибудь бред.
[/offtopic]
Пользуясь медицинскими аналогиями: наивный подход что к созданию паролей, что к анонимности — лечение симптомов, а не болезни. Вместо того, чтобы найти оценку стойкости пароля, часто пытаются создать методику, устойчивую к уже известным методам перебора по словарю. С анонимностью так же: вместо того, чтобы добиваться неразличимости по всем параметрам, дёргают только некоторые (часто ещё и в сторону уникальности), полностью игнорируя все остальные.
Научных статей это тоже касается, просто вероятность появления бреда ниже. При росте общего числа статей вероятность написать хотя бы одну полностью ошибочную работу стремится к единице. Живой пример.
[/offtopic]
комментариев: 9796 документов: 488 редакций: 5664
Шнайеру уже вроде как напостили комментов с указанием ошибки.
[/offtopic]