Софт

индекс
91,16

Софт без багов? Мечтать невредно

imageНе всем софтверным компаниям приходилось иметь дело с ошибками такой степени важности, как были с автомобилями Toyota (на Хабре), но с каждым днем всё более ясно: любая софтверная компания создает продукты со скрытыми дефектами безопасности. Исключений практически нет.

Если верить провайдеру услуг по тестированию ПО Veracode, который подготовил отчет к конференции RSA в Сан-Франциско, около 60 процентов ПО, пропущенного через их тестирование за последние 18 месяцев, провалило первый цикл тестов. Как отметил Роджер Оберг, старший вице президент по маркетингу Veracode, это были приложения от производителей, достаточно заботящихся о безопасности, чтобы в первую очередь использовать сервисы Veracode.

Данные Veracode не уникальны. В прошлом году исследование, проведенное WhiteHat Security, выявило, что 82 процента корпоративных вебсайтов содержали в себе уязвимости типа «высокая, критичная или особой важности» в обозримом прошлом, а 63 процента имели такие уязвимости на момент исследования.

Следует заметить, что исследования консультантов по безопасности чаще носят характер самопиара. Но их результаты нельзя сбрасывать со счетов. Достаточно просто пробежаться по заголовкам, чтобы заметить частоту, с которой уязвимости обнаруживаются в большинстве программных продуктов уважаемых производителей. Независимые разработчики не должны думать, что их продукты хоть чем-то отличаются, просто потому, что ошибок* очень трудно избежать.

Игра для разработчиков: убей хомячка**


Не надо думать, что для взломов используются сложные и малозаметные ошибки. Каждый год институт SANS (SANS Institute) и библиотека распространенных уязвимостей (CWE, Common Weakness Enumiration), спонсируемая правительством сторожевая собака, публикуют 25 наиболее распространенных и опасных программных ошибок. Как и в предыдущие годы, список 2010 не содержал много новинок, разве что непреднамеренный вывод конфиденциальной информации в сообщениях об ошибках или разрешение на неограниченную загрузку файлов опасных типов. Зато там полно таких детских ошибок как состояние гонки, переполнение буфера и неправильная обработка указателей массивов. Это вечные ошибки, уходящие корнями к рассвету программирования, но их распространенность и в 2010 поражает.

В добавок, факты говорят, что даже использование лучших практик может привести к ошибке. В 2006, Джошуа Блох из Google написал в блоге, что нашел ошибку в бинарном алгоритме сортировки из известной книги-справочника «Жемчужины программирования» Джона Бентли, опубликованной впервые в 1986. Хотя Блох и не пытался унизить Бентли, выяснилось, что Блох сам реализовал бинарный алгоритм поиска для JDK, содержащий точно такую же ошибку, и его оплошность оставалась незамеченной порядка девяти лет.

Могут ли разработчики работать лучше? Сервисы тестирования ПО, такие как Veracode, конечно же могут быть полезны, но всё равно такой подход не является идеальным. В некоторых случаях архитектура приложения или язык программирования могут сделать тестирование полностью бессмысленным.

Разработчики приложений с открытым кодом любят расхваливать «закон Линуса», который гласит, что «при наличие достаточного количества глаз, все ошибки выявляются». Другими словами, прозрачность процесса разработки приложений с открытым кодом означает, что ошибки в открытом коде будут обнаруживаться и устраняться быстрее, чем в проприетарном ПО.

Однако, руководитель программы безопасности Microsoft Шон Херман оспаривает это утверждение и не без оснований. По Херману то, что программисты могут осматривать код на наличие ошибок, не означает, что они это делают; более того, практика показывает, что только оплачиваемые программисты на полном рабочем дне достаточно мотивированы на то, чтобы тратить время на осмотр чьего-то кода. Если это так – а мне кажется, что так – то только производители ПО с глубочайшими карманами (и, соответственно, наибольшими коллективами) могут реально выиграть на законе Линуса.

Будьте открыты


Но ничего из выше сказанного не означает, что безопасность ПО гиблый случай. Это не так, ответ кроется в понимании того, что ровно столько можно сделать с кодом. Каждый разработчик несет ответственность за то, чтобы поставлять код наилучшего возможного качества; «наилучшего возможного» является очень важной фразой. После этого, центр усилий любой стратегии безопасности ПО любого разработчика приходится не на процесс разработки, а на то как справиться с инцидентами в безопасности, когда они неизбежно случаться.

Давно минули дни, когда обновления*** доставлялись на CD и дискетах. Сейчас пользователи ожидают быстрого появления обновлений, практически со скоростью обнаружения уязвимостей. Хотя зачастую это может быть непрактичным, производители задерживают распространение критичных обновлений на свой страх и риск.
Напомню вам, что то как производитель распространяет обновления, может быть проблемой само по себе. Было время, когда Microsoft распространяла обновления сразу же, как только они были доступны. Но клиенты жаловались, что создается непомерная нагрузка на ИТ-персонал, который должен постоянно проверять и развертывать обновления. В ответ, Microsoft переключилась на текущую модель распространения – «Вторник обновлений», дважды в месяц. Этот подход тоже подвергся критики, в основном со стороны тех, кто говорит, что «Вторник обновлений» приводит к «Среде взломов»****, когда хакеры охотятся на тех, кто еще не установил последние обновления.

Клиенты всегда будут недовольны сбоями в безопасности и необходимостью их устранять. Единственный выход для разработчиков – быть открытыми и искренними, насколько это возможно в вопросах сбоев безопасности их ПО, и прилагать все усилия для разрешения проблем заказчиков, которых сбой может затронуть, еще до того как выйдет обновление.

Альтернативой является насаждение культуры молчания и скрытности во всём, что касается сбоев безопасности; это прямой путь к провалу. Ситуация с Toyota отчасти нетипичная. Ближе к теме то, с каким нетерпением веб-разработчики ждут HTML 5, который, как ожидается, освободит их от кажущейся бесконечной череды ошибок, пролезших в расширения вроде Adobe Reader и Flash, и которые зачастую не устраняются неделями или даже дольше.

Чем больше исследований типа тех, что делают Veracode и WhiteHat Security, увидят свет, тем лучше заказчики будут понимать, что сбои безопасности являются частью жизни. Как только такое восприятие возобладает, заказчики потребуют не только обновлений, но и более тщательного поиска уязвимостей в безопасности. Вскоре, компании которые не будут регулярно выявлять угрозы в безопасности не смогут выглядеть производителями высококлассных приложений; они стану теми, у кого есть что скрывать.

Пометки к переводу
* — под ошибкой в тексте именуется баг (bug)
** — в оригинале, whack-a-mole, игра в которой из лунок вылезает зверек и по нему нужно ударить молотком; как это называется в русском языке я не знаю, в повседневной жизни использую название «убей хомячка»
*** — под обновлением в тексте подразумевается патч (patch), т.е. исправление ошибки, а не добавление нового функционала
**** — более точно «Среда эксплойтов» (Exploit Wednesday)

P.S. Согласен с мнением автора, иначе не переводил бы. На мой субъективный взгляд, применимо ко всем типам ошибок, а не только в сфере безопасности.
+3
11 марта 2010, 18:16
1

комментарии (27)

+1
DileSoft #
На самом деле, основная ошибка кроется в архитектуре языков программирования и баз данных. Если в C++ для работы в массивами и строками приходится вручную контролировать память, то ОБЯЗАТЕЛЬНО будет уязвимость переполнения буфера. Если язык веб-программирования позволяет отдавать системные команды и выполнять запросы к базам данным с использованием любых входных данных, то ОБЯЗАТЕЛЬНО будет дыра с инъекцией. Надо реально построить языки программирования, где безопасность будет вшита в среду исполнения, а не строится каждым начинающим программистом заново.
+1
unconnected #
такие попытки были и есть, Java например
другое дело, что среду исполнения тоже люди будут создавать :)
в общем — чтобы понять рекурсию, нужно понять рекурсию
0
DileSoft #
Ну, все-таки, когда баги на уровне среды, то их достаточно заделать разработчику среды, а остальным обновить среду. А вот то что PHP например до сих пор позволяет выполнять СУБД-запросы без проверки входным данных, это очень печально.
0
Bonart #
Там не в работе СУБД дело, а в отвратительном механизме подстановки значений переменных в строку и не менее отвратительных заплатках на него вроде magic quote.
0
DileSoft #
Я про то и говорю. Запросы в БД должны оформляться особым образом, каждое входное значение должно обязательно быть передано с указанием типа.
0
Bonart #
Так запросы всегда можно сделать через одно место — воспретить это средствами языка не выйдет.
Проблема в том, что в PHP удобные базовые средства форматирования строк с низким порогом вхождения непригодны для продакшена как дырявые by design.
Т.е. язык не просто позволяет написать плохо, но внедряет антипаттерн с начала обучения.
0
DileSoft #
Почему же, возможно mysql-функции делать такими, в которые нельзя впендюрить переменные прямо в текст, а только как прогнанные через очистительные функции. Язык можно сделать любым, но фишка в том что мало в каком языке это есть.
0
Bonart #
Не поможет — для формирования строки запроса начинающие все равно будут использовать «удобное» встроенное форматирование и поствалидация не спасет.
Все нормальные библиотеки доступа к БД поддерживают параметры запросов сами и делают это максимально удобно для пользователя. В PHP же ввели простое форматирование строк на уровне языка (которое по определению пригодно только для вывода пользователю, и не подходит для обработки ввода и кодогенерации, о чем учебники деликатно умалчивают), но столь же простых средств формирования запросов (не только к БД) не сделали даже в штатных библиотеках. Результат — львиная доля кодя принципиально дырява как Тришкин кафтан.
+3
Novikov #
Ну еще бы! В заголовке баг: «не вредно» надо писать раздельно ;-) Люди на родном-то языке не всегда пишут без багов ;-)
–3
unconnected #
учебник русского языка вам в помощь :)
хотя там тоже баги должны быть
+2
DileSoft #
Вы хотите сказать, «невредно» пишется слитно? о_О
0
unconnected #
да,
не помню правило с точностью, но суть следующая: если есть синоним без частицы «не», то слово пишется слитно
в данном случае проверочное слово «полезно»
грамота.ру меня поддерживает
0
freiman #
а мне кажется, что «не вредно» таки пишется раздельно. дайте, пожалуйста, ссылку на правило с грамоты.ру
0
freiman #
www.orfo.ru/Tutorial/Html/Tutorial.htm

Отрицательная частица не пишется раздельно

Существительные, прилагательные и наречия на -о имеют или подразумевают противопоставление: не правда, а ложь; не хороший, а дурной; не далеко, а близко
0
unconnected #
это когда идет противопоставление, тут вы правы
когда самостоятельно — пишется слитно
0
unconnected #
в догонку — если кидаете ссылками, читайте и другие правила
www.orfo.ru/Tutorial/Html/Tutorial.htm
Отрицательная частица не- пишется слитно
# Слова без не не употребляются: неистовство, необходимый, нельзя, ненавидеть.
# Существительные, прилагательные и наречия на -о образуют с не новое слово (его можно заменить синонимом): неправда (‘ложь’), неплохой (‘хороший’), недалеко (‘близко’).

0
Nickel3000 #
Т.е. нет слова истово (напр. молиться)? Хоть и устаревшее.
А вы попробуйте в гугле набрать «мечтать невредно», мне выдает «мечтать не вредно» — 275 000 результатов, «мечтать невредно» — 0. Правило не помню, но думаю это весомое доказательство.
–1
unconnected #
помните старый анекдот про миллион обезьян и «войну и мир»?
0
unconnected #
во зануды!
gramota.ru/slovari/dic/?word=%ED%E5%E2%F0%E5%E4%ED%EE&all=x
slovari.yandex.ru/search.xml?text=%D0%BD%D0%B5%D0%B2%D1%80%D0%B5%D0%B4%D0%BD%D0%BE&st_translate=0
точную формулировку правила без меня ищите, мне лень
0
ayambit #
Невредно, действительно, можно и так и так писать. Не знал. Но вот:
— «на сколько» таки слитно;
— что такое состояние гонки? Состояние соревнования я еще могу понять.
0
unconnected #
да, верно, про «насколько»
в оригинале «race condition», использовал трактовку википедии, т.к. сам не знал как это перевести
0
ayambit #
Да, правильно про гонку. Буду знать.
0
Novikov #
Насколько хороша она в постели?

но

На сколько баксов она тебя развела?
0
Evengard #
Помоему всё таки раздельно… «Мечтать не вредно» — устоявшееся выражение (ИМХО)
Есть даже фильм с таким названием — весьма маловероятно, что создатели фильма писали бы специально с ошибкой.
+1
Novikov #
Оу йес! Кто бы говорил!
+1
ayambit #
Теперь это статья — обсуждение грамотности.
+1
baskius #
Возможно, не совсем в тему, хотя… В общем, захотелось рассказать. На счет ошибок. В т.ч. в тексте. Этот случай мне рассказал мой дипломный руководитель, когда я очень нервничала по поводу «ошибок» в моём дипломе и «Что же будет?!».
История — классика.
В общем, времена Сталина. Был затеян выпуск Большой Советской Энциклопедии. Принимал сам Сталин. Люди страшно нервничали. Вплоть до скорых на рабочих местах, нервных срывов, отпусков за свой счет, и прочего. Проверяли все. Каждую строчку. Каждую букву. Напряжение было колоссальным (ну, еще бы!).
Выпустили сигнальный экземпляр (первый), отнесли его Сталину.
На титульной странице сигнального экземпляра было написано: Большая Советская ЭнциклопУдия.

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