WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 || 3 | 4 |   ...   | 12 |

«Michael Howard David LeBlank WRITING SECURE CODE Second Edition Microsoft Press ...»

-- [ Страница 2 ] --

Вспоминается одно совещание (дело было много лет назад), где мы решали не обходимость устранения ошибки, которая не позволяла масштабировать систе му. Загвоздка заключалась в том, что после исправления приложение стало бы недоступным для японских пользователей! После двух часов жарких дискуссий постановили ошибку не исправлять и пока предоставить обходное решение, а полностью устранить дефект в следующем выпуске. Мы осознавали, что програм Безопасность приложений сегодня 36 Часть I ма небезупречна, но зато работала, как обещалось, и на тот момент этого было достаточно, кроме того, ограничения мы четко описали в документации, Допустимый уровень ошибок нужно определить как можно раньше. Оп зави сит от среды, где будет работать программа, и от того, что пользователи ожидают от нее. Установите планку функциональности ПО высоко, а количества ошибок — низко. Но будьте реалистом: никто не знает, что будет угрожать вашей программе в будущем, поэтому, следуя рекомендациям, изложенным в главе 3, попытайтесь все-таки сократить «площадь поражения». Таким образом вы сузите круг дефек тов защиты, в результате которых возможна серьезная компрометация системы.

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

Внимание! Иногда кажется, что проще всего устранить ошибку, повысив пол номочия учетной записи, под которой работает приложение. Однако имейте в виду: это очень и очень плохое решение, почему — объясняет ся в главе 4.

Предусмотрите проверку группой по безопасности Когда вы решите, что достаточно потрудились над продуктом и он уже весьма хорош и безопасен, пригласите специалистов по безопасности со стороны, что бы они проанализировали вашу работу. Незаинтересованный профессиональный взгляд очень полезен — удается обнаружить недостатки на самой ранней стадии проекта, а не в его конце. В Microsoft большинство проектов на предмет безопас ности анализирует наша команда.

Разработка Разработка — это написание и отладка кода. На этом этапе основной упор дела ется на написание максимально качественного кода. Качество можно считать подмножеством безопасности: качественный код — безопасный код. Так каковы же методы достижения этих целей?

Очень осторожно предоставляйте права на внесение исправлений Буду краток: отзовите у большинства право на создание нового кода и внесение исправлений (check-in) в существующий код. Возможность модифицировать код — это привилегия, а не право. Разработчикам следует предоставлять ее только по сле прохождения курса «Основы безопасности».

Перепроверяйте внесенные исправления Взаимная проверка кода программистами — мой любимый метод, потому что именно он позволяет обнаружить уже допущенные ошибки и предотвратить их развитие в программе. Вообще-то, говоря это, я немного нарушаю общепринятые правила, но все равно стою на своем: обучение и перекрестный контроль кода значительно повышают его безопасность. Не столько из-за обнаружения ошибок, ГЛАВА 2 Активный подход к безопасности при разработке приложений сколько из-за того, что программисты, зная, что кто-то сунет свой нос в их дети ще, стараются изо всех сил. Этот эффект называется эффектом Хоторна (Hawthorn effect) — по названию фабрики в южном пригороде Чикаго, штат Иллинойс*. Ис следователи измерили время, требующееся рабочим на выполнение производствен ных операций, и оказалось, что в присутствии исследователей рабочие выполня ли свою задачу быстрее и эффективнее.

Есть простой способ облегчить проверку исходного кода. Создайте инструмент, который подключается к системе управления версиями и создает HTML- или XML файл с информацией об изменениях, внесенных в код за истекшие сутки. Файл должен содержать различия кода (code diffs), ссылки на все измененные файлы и простой механизм отображения файлов и изменений в них. Например, я нал j сал Perl-про грамму, которая выполняет эту операцию с исходным кодом Windows, Она подключается к нашей системе управления версиями ПО и возвращает спи сок всех изменившихся файлов и короткий перечень изменений. Далее я вызы ваю windiff.exe, чтобы увидеть, какие изменения внесены в файлы.

В таком методе за раз изучается одна крошечная часть исходного текста, п > этому задача эксперта по безопасности сильно упрощается. Заметьте: я сказал «эк сперт по безопасности». Перекрестная проверка кода программистами — э-;

о прекрасно, но до того, как передать код в систему управления версиями, необх' > димо, чтобы его исследовали специалисты по безопасности — они выясняют на личие ошибок защиты, а не общую корректность кода.

Создайте руководство по созданию безопасного кода Рекомендуем создать и активно продвигать минимальный набор правил напис i ния исходного кода: как программистам работать с буферами, как обрабатывать ненадежные данные, как шифровать информацию и т.д. Помните, что этот ми нималъный набор и код, попадающий в систему управления версиями, должен удовлетворять минимальным требованиям, но от команды требуется больше. В приложениях В, Г и Д этой книги вы найдете базовые рекомендации для проек тировщиков, разработчиков и тестировщиков — можете использовать их в каче стве точки отсчета в своих проектах.

Учитесь на предыдущих ошибках О том, как не наступать на одни и те же грабли, рассказывается в главе 3- Здесь же достаточно сказать, что главное — учиться на ошибках прошлого с тем, чтобы не повторять их. Назначьте ответственного за выявление дефектов и меры по их пре дотвращению.

Эффект Хоторна описан американским психологом Элтоном Майо (George Elton Mayo, 1880—1949) на основании исследований, проведенных на Западном заводе электрических изделий г. Хоторна с целью поиска оптимальных условий и режимо!

труда и отдыха. Майо установил, что рост производительности труда рабочих связа.) не столько с условиями труда, сколько с их участием в исследовании. — Прим, перев.

Свободно распространяемая утилита обнаружения и сравнения отличий между фай лами и каталогами. — Прим, перев.

Безопасность приложений сегодня 38 Часть I Поручите анализ безопасности приглашенным специалистам Стоит привлечь внешних специалистов, например из консалтинговой компании, для изучения и анализа кода и планов проекта. Работая в Microsoft, мы обнаружи ли, что внешние исследования оказываются исключительно эффективными глав ным образом потому, что компании-консультанты смотрят на продукт со сторо ны. Не забудьте удостовериться, что специалисты из приглашенной компании имеют опыт работы с технологиями, используемыми в вашем приложении, и что они смогут передать знания вашей команде. Это должна быть независимая ком пания, причем не из тех, которые занимаются формальной сертификацией. Сер тификаты хороши для маркетинга, но смертельно опасны для разработки защи щенного кода, потому что создают ложное ощущение безопасности.

Разверните кампанию по безопасности Начиная с конца 2001 г. в Microsoft регулярно проводятся кампании по безопас ности — security push. Цели этих мероприятий:

• повысить «бдительность» и понимание проблем безопасности всеми членами команды;

• найти и устранить ошибки в коде, а в некоторых случаях — и в проекте при ложения;

• избавиться от «вредных привычек* в процессах разработки ПО;

• создать в команде крепкое ядро из разбирающихся в безопасности сотрудников.

Последние две задачи исключительно важны. Затратив достаточно времени на security push (а в случае Windows они занимали до 8 недель), вы выполните «до машнюю работу* и укрепите навыки, полученные в процессе обучения. Подобная кампания дает всем членам команды редкую возможность сконцентрировать вни мание на защите и избавиться от многих застарелых и опасных программистских привычек. Более того, по завершении кампании возрастает число людей, пони мающих, зачем создавать безопасные системы, и заражающих окружающих сво ей уверенностью. Я слышхч множество раз, что после проведения security push более половины времени совещаний, посвященных изучению и анализу готового кода, тратилось на обсуждение последствий для безопасности приложения, обуслов ленных изменениями в коде или проекте. (Легко догадаться, что совещания, ко торые после security push я посещал лично, практически полностью посвяща лись защите, но, как вы наверняка догадались, это прямое следствие эффекта Хоторна!) Если вы планируете проводить кампанию по безопасности, воспользуйтесь ре комендациями, которые мы сформулировали и проверили на собственной «шкуре»;

• до начала проекта смоделируйте опасности, грозящие еще не созданной про грамме. Как оказалось, в командах, которые занимаются этим в самом начале проекта, возникает меньше затруднений, а процесс разработки идет более глад ко, чем у тех, что делают все параллельно — моделирование, кодирование, со здание тест-планов и проектирование. Причина в том, что моделирование опас ностей позволяет разработчикам и менеджерам сразу выявить части програм ГЛАВА 2 Активный подход к безопасности при разработке приложений мы, подвергающиеся особому риску и поэтому подлежащие более глубокому анализу. О моделировании опасностей рассказывается в главе 4;

• держите в курсе всех членов команды. Информируйте их о новинках в области безопасности и новых типах атак;

воспользуйтесь для этого электронной почтой;

• создайте основную группу безопасности, которая будет собираться каждый день и искать и анализировать ошибки и недостатки защиты в создаваемом ПО. >га группа должна стать движущей силой кампании по безопасности;

• позаботьтесь, чтобы группа безопасности организовала список рассылки или электронный форум, где любой член команды разработчиков мог бы задав.ггь вопросы по защите и получать на них ответы. Помните: команда осваив ICT новую область, поэтому следует быть открытым для новых идей и пожеланлй.

Ни в коем случае не говорите разработчикам, что их идеи или вопросы дурацкие (даже если это так)! Ведь ваша задача развить, а не убить вкус к безопасности;

• учредите призы за обнаружение «лучших» дыр в защите, за нахождение наи большего количества ошибок и т. п. Фанаты любят поощрение!

Не утоните в потоке обнаруженных ошибок защиты Задавшись целью «нарыть» побольше ошибок в защите, вы их найдете, но смот рите, не утоните в них. Известна пара правил: разработчик должен работать не больше, чем с 5-ю ошибками одновременно, а общее количество обнаруженных в программе дефектов не должно более, чем в 3 раза, превышать число разработ чиков. При нарушении любого из них программисты «захлебываются» в работе по латанию уже найденных дыр в защите, и им не хватает времени на поиск но вых «жучков». Но, справившись с выделенным фронтом работ, можно переходить к устранению других недостатков. Умеренный поток выявленных дефектов по. ю жительно сказывается на производительности работы программистов: они оста ются свежими и бодрыми и готовы к новым свершениям.

Следите за уровнем ошибок Обнаруженные бреши в проекте или коде приложения следует регистрировать в специально созданной для этого базе данных, впрочем, это обычная практика.

Однако в каждой записи предусмотрите дополнительное поле, где надо указать, к какому типу опасности относится дефект. Вы вправе применить для классифика ции ошибок описанную в главе 4 методику STRIDE, а в конце разработки проана лизировать, почему, скажем, у вас так много мест, уязвимых для DoS-атак.

Никаких неожиданностей и «пасхальных яиц»!

В программе не должно быть никакого дурацкого скрытого кода, скажем, для ото бражения списка всех сотрудников, участвовавших в создании приложения. Пр IK тически всегда проект с трудом укладывается в график, но откуда же берется вре мя на написание глупых «пасхальных яиц*? Должен сознаться, что «в предыдущей жизни* сам занимался этим, но только не в готовом приложении. Это была программа прототип. Теперь я бы не стал писать «пасхальное яйцо», потому как знаю, что пользователям оно не нужно, да и, откровенно говоря, у меня нет времени на э го!

3- Безопасность приложений сегодня 40 Часть I Тестирование Тестирование защиты настолько важно, что мы посвятили ему отдельную главу.

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

как я говорил ранее, в безопасном продукте не должно быть ни каких «дополнительных» функций, которые могли бы сделать систему уязвимой.

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

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

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

не советую этого делать и вам, Чем ближе «час X», тем труднее устранить неожиданно возникшую проблему, не выбившись при этом из графика. Понятно, что дефекты защиты очень серьез ны и обращаться с ними нужно с предельной внимательностью и осторожнос тью, чтобы не навредить клиентам. Очень возможно, что в случае обнаружения серьезного дефекта, связанного с безопасностью, вам придется скорректировать график и предусмотреть в нем время для исправления недостатка.

Подумайте, может, стоит перечислить известные дыры в файле readme, но имейте в виду, что пользователи редко читают эти файлы. И. конечно же, не ис пользуйте readme-файл как средство обеспечения защиты для клиентов. Устанав ливаемая по умолчанию конфигурация приложения должна быть безопасной, а описания проблем в readme-файле — простыми и понятными даже для неподго товленного пользователя.

Внимание! Не поставляйте приложение, если в нем есть известные, чреватые серьезными нарушениями безопасности ошибки!

ГЛАВА 2 Активный подход к безопасности при разработке приложений Обратная связь После начала эксплуатации продукта в нем неизбежно обнаружатся бреши — одни выявите вы, другие — ваши пользователи. Поэтому следует заранее позаботиться о политике и процедурах решения проблем по мере их возникновения. Обнару женный недостаток должен пройти процедуру «сортировки», при этом определя ется его серьезность, принимается решение, как лучше его устранить и в каком виде предоставить исправление клиентам. Если дефект выявлен в компоненте, последний следует тщательно исследовать на предмет аналогичных недостатков.

Если этого не сделать, повторы не заставят себя долго ждать, кроме того, подоб ное отношение — проявление элементарного неуважения к клиентам. Делайте все правильно и, обнаружив ошибку определенного типа, искореняйте не только ее, но и всех ее «сестриц-близняшек».

Если вы нашли дыру в ПО, которым пользуетесь, проявите сознательность, обратитесь к производителю и сотрудничайте с ним над устранением уязвим- >го места. Много полезного вы почерпнете из следующих публикаций: из бюллете ней «Acknowledgment Policy for Microsoft Security» («Политика по отношению к представлению сообщений о брешах защиты в продуктах Microsoft») (www.mkro soft.com/tecbnet/security/bulletin/policy.asp), RFPolicy (документ о политике откры тости) (www.wiretrip.net/rfp/policybtml) и Интернет-очерка «Responsible Vulnerab: lity Disclosure Process» («Процесс ответственного устранения брешей») Кристи (Chrisi ey) иУайсопала (Wysopal) (http://wmv.ietf.org), Если вам действительно нужны рекомендации, как реагировать на обнаруже ние брешей, посмотрите документ «Common Methodology for Information Technol >gy Security Evaluation* («Стандартная методика оценки безопасности в информа. щ онных технологиях») на странице (wuw.commoncriteria.org/docs/ALC_FLR/alcJlr}jtm{).

Это трудный для чтения текст, но от этого не менее интересный, Ответственность В некоторых компаниях-разработчиках за создание кода и исправление в нем ошибок отвечают разные люди. Это неправильно, и вот почему. Допустим, Джо! \ — программист, создавший часть приложения. После обнаружения бреши в этой части программы устранить недостаток поручили Мэри. Какой урок вынесет из этого Джон? Да никакой! Он продолжит делать те же ошибки, потому что без обратной связи он так и не узнает, что ошибается. Руководству также очень трудно опреде лить динамику развития Джона: растет ли он как программист?

Внимание! Обнаруженную брешь предоставьте латать программисту, который написал «дырявый» код. Только так он сможет понять свою ошибку л исправиться.

Резюме Команде, в которой мало что знают о безопасности систем, не удастся создать безопасный продукт. Собственно говоря, как и той, где отсутствует жесткий к щ троль за безопасностью на каждом этапе процесса. Мы рассказали о некоторых Безопасность приложений сегодня 42 Часть I улучшениях процесса разработки, помогающих создавать приложения, успешно противостоящие атакам. Часть этих рекомендаций следует реализовать немедленно.

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

Не волнуйтесь заранее! Модернизация процессов с целью создания более бе зопасного ПО не так сложна, как кажется! Самое трудное — изменить собствен ное мышления и отношение к безопасности.

ГЛАВА Принципы безопасности, которые следует взять на вооружение Систему безопасности следует проектировать и встраивать в приложение с са мого начала работы над ним. В этой главе речь пойдет о проверенных временем принципах построения системы безопасности, которые следует взять на воору жение и реализовать при разработке общей стратегии. Вы узнаете о том, на что в первую очередь следует обратить внимание менеджерам, проектировщикам и архитекторам приложений при проектировании системы безопасности. Это не означает, что программистам и тестировщикам читать эту главу ни к чему: если они освоят принципы проектирования защиты, то смогут создавать более защи щенные программы. А начнем мы с некоторых общих понятий и правил.

Принцип SD3: безопасно согласно проекту, по умолчанию и при развертывании Работая над инициативой «Безопасная Windows» (Secure Windows Initiative), мы сформулировали концепцию, состоящую из трех частей: безопасность приложе ния должна обеспечиваться на стадии разработки проекта, в конфигурации по умолчанию и при развертывании (в английском варианте: «secure by design, by default and in deployment* — SD4). Как оказалось, подобный подход помогает у ю рядочить процесс разработки и создавать более защищенные системы.

Безопасность приложений сегодня 44 Часть I Безопасно согласно проекту ПО значительно лучше защищено, когда с самого начала проектируется с учетом требований безопасности. Чтобы создать удачный проект, мы рекомендуем вы полнить определенные процедуры.

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

• Обеспечьте обязательный тренинг всего персонала (детально об этом — в гла ве 2).

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

• Придерживайтесь рекомендаций по безопасному проектированию и програм мированию. Их вы найдете в приложениях В, Г и Д. Учтите — это обязатель ный минимум, а вам следует стремиться максимально расширить и обогатить их.

• Как можно раньше устраняйте все ошибки, которые возникают из-за несоблюде ния рекомендаций. Помните: взломщика не интересует, старый это код или но вый. Если в коде есть ошибки, значит, он «дырявый* независимо от «возраста».

• Постоянно обновляйте рекомендации. Злоумышленники постоянно обогаща ют свой опыт, и вы не забывайте публиковать данные о новых брешах и спо собах их устранения.

• Разработайте регрессионные тесты для проверки всех уже исправленных оши бок в системе защиты. Это один из способов обучения на ошибках (подроб нее мы обсудим это далее). Обнаружив очередную брешь в защите, создайте программу, в которой отражена «квинтэссенция» атакующего кода, использу ющего данный тип уязвимости, и тщательно исследуйте остальную часть при ложения на предмет обнаружения похожих ошибок.

• Упростите код и модель защиты. Это нелегко, особенно при наличии большо го количества клиентов, которые активно пользуются приложением. Но все же неплохо продумать планы упрощения старого кода, чтобы избавить его от устаревших и небезопасных функций. Как правило, со временем код усложня ется и хуже поддается сопровождению и поддержке, поэтому время, потраченное на удаление устаревшего кода и, как следствие, на упрощение приложения, вместо добавления новых функций и исправления ошибок, оказывается исклю чительно полезным для повышения безопасности. Старение программы час то называют вырождением кода (code rot).

• Перед началом продаж ПО проведите «тест на выживание» (penetration analysis), Установите тестовые серверы и предложите своей команде, а также сторонним группам взломать систему. По опыту могу сказать, что команду следует сфор мировать из экспертов в области безопасности и освободить ее от других за даний — в противном случае вам практически ничего не удастся выяснить, Недостаточно тщательное тестирование оказывает «медвежью услугу* созда Принципы безопасности, которые следует взять на вооружение ГЛАВА телям приложения — у команды разработчиков создается ложное чувство \ ве рснности в защищенности продукта. Это же справедливо и в отношении гак называемых «хаксрских фестивалей* (hack-fests), когда вы предлагаете всем желающим испытать силы и попытаться взломать вашу систему. Обычно :>то пустая трата времени, если только вы не тестируете приложение на устойчи вость к атакам типа «отказ в обслуживании* (denial of service attack, или DoS атаки) — большинство потенциальных «взломщиков* не слишком-то грамот ны и квалификации и фантазии им хватает лишь на попытку «забить* сер.чер потоком запросов.

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

выбирайте только те, которые потребуются большинству ваших пользовать ей, и позаботьтесь о простом механизме активизации остальных функций.

• Приложение должно работать в условиях минимально возможных привилег ни.

Не требуйте, чтобы ПО работало под учетной записью с высокими полномо чиями, например члена группы Administrators (Администраторы) или Domain Administrators (Администраторы домена), когда без этого можно обойтись, Подробнее этот вопрос обсуждается немного дальше в этой главе, а также в главе 7, которая целиком посвящена этому вопросу.

• Обеспечьте адекватную защиту ресурсов. Конфиденциальные данные и крити чески важные ресурсы обязательно защитите от атак (подробнее — в главе 6), Безопасно при развертывании Это означает, что система должна быть готовой к работе сразу после установки.

Вы можете отлично спроектировать и написать приложение, но если его слоя,но развертывать и администрировать, пользователям будет нелегко обеспечить его безопасность при возникновении новых опасностей. Вот несколько рекоменда ций, которые позволят повысить безопасность создаваемого ПО.

• Позаботьтесь о создании механизма администрирования безопасности ПО.

Ясно, что администратор, не зная параметров подсистемы защиты и конфигу рации приложения, не в состоянии определить уровень защищенности при ложения. Здесь подразумевается также возможность узнать, сколько пакетов исправлений (patch) уже применено к системе.

• Максимально оперативно выпускайте качественные пакеты исправлений под системы безопасности. Обнаружив или узнав о бреши в коде, исправляйте ошиб ку без проволочек, но без излишней спешки — она также весьма опасна! В го рячке можно добавить пару-тройку неприятных ошибок, поэтому тщательно следите за корректностью исправлений.

• Проинформируйте пользователей, как безопасно работать с системой. Не бой тесь разнообразить способы: интерактивная справка, документация или кон текстные подсказки прямо на экране (подробнее — в главе 24) — все уместно!

Часть I Безопасность приложений сегодня Принципы безопасности А теперь мы детально обсудим принцип SD3. Запомните: безопасность нельзя вынести в отдельный отрезок кода. Так же как и производительность, масштаби руемость, управляемость и читабельность кода;

безопасность — это дисциплина, которой должен владеть каждый проектировщик, разработчик и тестировщик. По работав с различными фирмами-разработчиками, мы пришли к выводу, что, если неотступно следовать определенным принципам безопасности при проектиро вании и тщательно продумать организацию процесса разработки, ваш продукт окажется вполне защищенным. Итак, каковы же эти принципы? Вот они • учиться на ошибках;

• уменьшать «площадь» приложения, открытую для нападений;

• создавать систему безопасности с защитой на всех уровнях;

• использовать минимальные привилегии;

• в конфигурации по умолчанию назначать безопасные параметры;

• помнить, что обратная совместимость всегда чревата проблемами;

• всегда предполагать незащищенность внешних систем;

• предусмотреть план действий при сбоях и отказах;

• позаботиться, чтобы при любых сбоях система сохраняла конфиденциальность информации;

• помнить, что возможности подсистемы безопасности — это не то же самое, что безопасные возможности системы;

• никогда не полагаться на защиту, основанную только на ограниченности ин формации (не рассчитывайте, что, если вы скроете информацию о приложе нии, злоумышленник не догадается об уязвимости);

• не смешивать код и данные:

• корректно исправлять ошибки в подсистеме безопасности.

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

Учитесь на ошибках Общеизвестно, что «за одного битого двух небитых дают», но мы готовы покля сться, что в области проектирования ПО не особенно-то быстро учатся на ошиб ках. То же верно и в отношении безопасности. Вот мои любимые цитаты об уче нии на ошибках, История — это огромная система раннего предупреждения.

Норман Козине (Norman Cousins) (1915—1990), американский писатель и редактор Не помнящий прошлого обречен на его повторение.

Джордж Сантаяиа (George Santayana) (1863-1952), американский философ и писатель испанского происхождения Принципы безопасности, которые следует взять на вооружение ГЛАВА Мучительнее извлечения уроков из опыта только их неизвлечеиие.

Арчибальд Маклейш (Archibald McLeish) (1892-1982), американский поэт Обнаружив проблему с защитой в своем приложении или узнав о недостатке безопасности продукта конкурента, постарайтесь извлечь из этого макси;

уум пользы. Задайте себе несколько вопросов.

• Почему возникла ошибка?

• Повторяется ли она в других частях кода?

• Как не допустить тиражирования подобных ошибок?

• Как оградить приложение от ошибок такого рода в будущем?

• Нужно ли обновить инструменты анализа или процедуры обучения?

Относитесь к каждой ошибке, как к возможности поучиться. К сожалению, в стремлении побыстрее «выбросить* продукт на рынок, разработчики пренебре гают этим важным этапом, и в результате мы видим, как одни и те же ошибки «•переползают* из версии в версию. Неспособность учиться на ошибках влет (ет компании в копеечку.

С нашей подачи в Microsoft организована такая важная процедура, как «посмер тное вскрытие» ошибок защиты, которые были зафиксированы в Центре безопас ности Microsoft (Microsoft Security Response Center) — www.microsoft.com/security.

Процесс начинается с заполнения документа об ошибке, который затем наша группа анализирует, пытаясь извлечь полезный опыт. В документе содержатся следующие данные:

• название продукта;

• версия продукта;

• имя контактного лица:

• код ошибки в базе данных;

• описание бреши;

• возможные последствия взлома защиты в этом месте;

• проявляется ли эта ошибка при установке по умолчанию;

• что могут сделать проектировщики, разработчики или тестировщики, для ус транения недоработки;

• детальная информация об исправлении ошибки, включая, если нужно, разли чия кода (code diffs)*.

Как сказал Альберт Эйнштейн, «Опыт — вот единственный источник знаний*, и обучение на ошибках — прекрасный путь к накоплению знаний о слабых мес тах в защите.

Совет В свое время отец мне говорил: «Ты можешь совершить любую ошибку но единственный раз. Вынеси из нее урок и впредь воздержись ее по вторять».

Термин, используемый в системах контроля версий. Обозначает детальную информа цию о различии кода в разных версиях. — Прим. персе.

Безопасность приложений сегодня 48 Часть I Трудный урок Около четырех лет назад в защите продукта, к которому я имел отношение, была найдена ошибка (какая точно, я уже не припомню). После ее исправ-, ления я задал команде разработчиков несколько вопросов, в том числе та кой: «В чем причина появления ошибки?* Менеджер проекта ответил, что команда была слишком занята, чтобы тратить время на такие глупости. В течение следующего года клиенты в программе обнаружили еще три подоб ных ошибки. На исправление каждой потребовалось около 100 человеко часов.

Я познакомил с этой информацией нового менеджера проекта — пре дыдущий ушел «на повышение» —- и заметил, что;

четыре однотипные ошибки, обнаруженные за год, говорят об одном — это не случайность. Он согла сился, и мы потратили четыре часа, пытаясь отыскать причину их появле ния. Дело выеденного яйца не стоило — просто некоторые разработчики неправильно использовали одну функцию. Мы поискали похожие места в коде проекта, нашли еще четыре «дыры* и тут же их «залатали». Затем мы добавили отладочный код в функцию, неправильный вызов которой при водил к аварийному завершению приложения. В заключение мы разослали по электронной почте сообщение всем сотрудникам организации с описа нием ошибки и рекомендация*»!, что следует предпринять, чтобы ошибка не возникала в будущем. На все ушло чуть меньше 20 человеко-часов.

Проблема была решена. Программисты иногда допускают эту ошибку, но команда быстро ее вылавливает благодаря коду проверки ошибки, ко торый мы добавили. Поиск причин проблемы и время, потраченное на искоренение такого класса ошибок, наверняка сэкономило первому менед жеру проекта массу времени на более полезные занятия!

Уменьшайте «площадь» приложения, уязвимую для нападений Увеличивая объем кода и расширяя набор поддерживаемых сетевых протоколов, вы быстро обнаруживаете, что у атакующего появляется больше возможных «то чек входа». Очень важно минимизировать их число, а пользователей заставить активизировать дополнительные возможности только по мере необходимости. В главе 19 я расскажу о технических деталях расчета относительной «открытой площади» программы, пока же запомните, что следует учитывать число;

• открытых сокетов (TCP и UDP);

• открытых именованных каналов (named pipes);

• открытых конечных точек удаленного вызова процедур (RFC endpoints);

• служб;

• служб, запускаемых по умолчанию;

• служб, обладающих высокими полномочиями:

• фильтров и приложений ISAPI;

• динамических Web-страниц;

Принципы безопасности, которые следует взять на вооружение ГЛАВА • учетных записей в группе администраторов;

• файлов, каталогов и параметров реестра с не обеспечивающими должной за щиты списками управления доступом (Access Control List, ACL).

He все из перечисленного применимо к вашему приложению, и конечное число имеет значение только в сравнении с другой версией того же приложения, но в любом случае ваша цель — снизить его насколько возможно. Имейте в виду, службу, которая устанавливается как часть приложения и запускается под учетной запи сью SYSTEM, следует считать за три «точки входа*! При проведении мероприятий по безопасности в Microsoft мы руководствовались ключевой фразой-правилом для проектировщиков, архитекторов и менеджеров проектов: «Делайте все,[ля уменьшения открытой «площади» приложения».

Назначайте безопасные параметры в конфигурации по умолчанию Для уменьшения открытой «площади* приложения необходимо, в том числе, на значать безопасные параметры для конфигурации по умолчанию. Это наиболее труднодостижимая, но в то же время исключительно важная задача разработчика приложения. Следует подобрать удовлетворяющий пользователей набор функции — при условии, что он определен на основе требований пользователей. — и убедиться, что выбранные функции безопасны. Чтобы снизить риск, возможности, исполь зуемые редко, в конфигурации по умолчанию отключаются. Отключенная возм< ш ность не может стать легкой добычей взломщика. Я часто применяю правило Паретп, известное также как правило «80/20»: «Определите 20% функций, с кото рыми работают 80% пользователей*. В конфигурации по умолчанию активны :->ти 20% функций, а остальные 80?-& отключаются, однако пользователям предоставля ются простые инструкции и меню для их активизации. (Различайте простые и слож ные инструкции. Такую, например, как: «Просто добавьте в реестр параметр типа DWORD, в котором младшие 28 бит определяют отключаемые функции», ну ш как нельзя назвать простой!). Конечно, кто-то из команды потребует, чтобы ред ко применяемая функция активизировалась по умолчанию. Часто приходится встре чать программистов, которым собственный опыт диктует особый взгляд на вещи:

его мама пользуется этой функцией, он проектировал или он писал эту функцию.

Примечание Есть и обратная сторона отключения функций в конфигурации по умолчанию: программы установки, использующие отключенную фун кцию, могут не сработать, если они предполагают, что ваше приложе ние работает. Но это никак нельзя считать оправданием для включение функции по умолчанию. Правильное решение в такой ситуации — до работка зависимой программы установки.

Некоторое время назад я анализировал защиту инструмента разработки, вы пуск которого ожидался через несколько месяцев. В приложении была предусмот рена одна потрясающая возможность, которая устанавливалась и активизирова лась по умолчанию. Выслушав 20-минутное объяснение разработчиков, как дей ствует функция, я подвел итог одним предложением: «Насколько я понял, любой может выполнить произвольный код на компьютере, где установлен этот продукт.

Безопасность приложений сегодня 50 Часть I Это верно?» После короткой дискуссии разработчики подтвердили мою догадку.

Я настаивал на том, чтобы устранить проблему. Но до выпуска приложения оста валось мало времени, и кто-то из команды выдвинул такое предложение: «А поче му бы нам не поставлять продукт с этой функцией, включенной по умолчанию, а в документации предупредить пользователей о риске, которому она подвергает безопасность приложения?* Я ответил: «А почему не поставлять продукт с отклю ченной по умолчанию функцией и не сообщить в документации, как ее включить, когда она действительно понадобится?» Мой ответ не понравился лидеру коман ды: «Вы же знаете, что люди не читают документацию, пока не припрет! И наша новинка останется невостребованной*. Улыбнувшись, я ответил: «Верно! "Гак по чему же вы полагаете, что они станут читать документацию и узнают, как отклю чить опасную возможность?" В итоге они вообще выкинули эту функцию, и пра вильно сделали, поскольку и так выбивались из графика!

Другая причина, по которой следует по умолчанию отключать максимум фун кций, не имеет к безопасности никакого отношения: это производительность. Чем больше функций активизировано, тем больше приложение занимает памяти, а это означает более интенсивную подкачку с диска, что бьет по производительности.

Внимание! Включая в конфигурации по умолчанию больше функций, вы уве личиваете вероятность нарушения защиты, поэтому минимизируйте их число. Запрещайте все функции и обеспечьте простой механизм их ак тивизации по мере необходимости. «Помиловать* следует те функции, о которых известно, что их отключение доставит массу неудобств пользо вателям.

Защищайте все уровни Принцип «защиты на всех уровнях» достаточно прост: представьте, что ваше при ложение — последний «оставшийся в живых» компонент, когда все прочие меха низмы защиты уничтожены. Ему придется защищаться самостоятельно. Например, если в обычных условиях приложение защищено брандмауэром, стройте его так.

чтобы оно выстояло даже при компрометации межсетевого экрана.

Помните пример со средневековым замком из первой главы? Предположим, ваши пользователи — владельцы замка, члены знатного в XVI веке рода, а вы на чальник гарнизона крепости. Обнаружив наступление врагов, вы успокаиваете хо зяина: ваши доблестные стрелки, высота стен и глубина рва остановят нападаю щих. Владелец доволен. Спустя два часа вы снова просите аудиенции и доклады ваете, чч'о оборона прорвана и крепостная стена разрушена. На вопрос о дальней шей обороне замка вы бессильно отвечаете, что единственный выход — капиту ляция, так как враг уже в замке. Так карьеру в вооруженных силах не сделать*. Вы должны драться до последней капли крови или пока не получите приказ прекратить сопротивление.

Надо заметить, что в средние века такой трусливый начальник гарнизона рисковал не карьерой, а головой: не собственный господин, так победители ее снесли бы. — Прим. ред.

ГЛАВА 3 Принципы безопасности, которые следует взять на вооружение Еще один пример уже из сегодняшнего времени. Когда вы последний раз ви дели операциониста банка, в кассе которого скопилась куча денег? Чтобы добраться до действительно серьезных денег, придется проникнуть в хранилище, а до этого преодолеть несколько уровней защиты:

• миновать охранника у входа в банк;

• пройти двойные взаимоблокирующиеся двери, которые есть во многих бан ках. Входя в банк, вы попадаете в пуленепробиваемую стеклянную капсулу. Вне шняя дверь закроется, и лишь через несколько секунд откроется внутренняя стеклянная дверь в помещение банка. Это значит, что не удастся быстро забе жать в операционный зал и выскочить из него — уже с деньгами. В сущности, операционист или охранник может заблокировать дверь удаленно и «пойма гь» вора, когда тот попытается выйти;

• миновать охранников внутри банка;

• обойти множество телевизионных камер, которые контролируют все помеще ние и отслеживают перемещения всех людей;

• вы не можете заставить провести вас в хранилище операционистов, у них нет туда доступа (это пример наименьших полномочий, о которых поговорим далее);

• преодолеть несколько уровней защиты хранилища:

D оно открывается только в определенное время;

D у него очень толстые металлические стены и двери;

Q методы доступа в разные отделения хранилища отличаются, К сожалению, подавляющее большинство приложений спроектировано и за программировано так, что взлом брандмауэра ведет к гарантированной компро метации программы. В современных условиях это очень плохо. Вы не вправе признавать поражение только из-за того, что скомпрометирована лишь часть механизмов защиты. В этом сущность защиты на всех уровнях: на каком-то этапе приложение должно постоять за себя. Не полагайтесь на другие системы и при нимайте бой — программы, «железо* и люди могут дать слабину. ПО создают люди, которыми свойственно ошибаться, поэтому в программах возможны погрешнос ти. Вы должны быть готовым к ошибкам и, как следствие, к дырам в защите. Ина че говоря, что вы будете делать, когда единственный внешний контур взломщи кам удастся преодолеть? Защита на всех уровнях позволяет устранить из корпо ративной ИТ-системы точки критического сбоя (single point of failure), разру] ae ние которых приводит к неработоспособности всей инфраструктуры.

Внимание! Предусмотрите в своем приложении средства «самозащиты» от атак, так как внешние средства безопасности могут пасть под напором взлом щика и вы окажетесь беззащитны. Никогда не сдавайтесь!

Используйте наименьшие привилегии Позаботьтесь, чтобы все приложения выполнялись с минимальным набором при вилегий, достаточным для выполнения работы, и не более того. Я часто анализи ровал продукты, которые должны выполняться в контексте безопасности адми Безопасность приложений сегодня 52 Часть I нистратора или. хуже того, как системная служба, и пришел к выводу, что, немно го пораскинув мозгами, проектировщики могли бы снять приложение с «иглы* высоких привилегий. Аргументация о наименьших привилегиях очень проста. Если у приложения есть брешь, позволяющая злоумышленнику внедрить в прикладной процесс свой код и заставить его выполнять нужные хакеру задачи или запустить «троянец» или вирус, вредоносный код получит те же привилегии, что и процесс.

Если программа работает под учетной записью администратора, то и код злоумыш ленника получит административные права. Вот почему мы рекомендуем не запус кать приложения под учетной записью члена группы администраторов — на слу чай внедрения вируса или любого другого злонамеренного кода.

Ну ладно, сознайтесь: ведь вы входите в систему под учетной записью из груп пы локальных администраторов? Я — нет. Уже более трех лет я не пользуюсь для работы административными полномочиями, и вес прекрасно. Я пишу и отлажи ваю код, посылаю письма по электронной почте, синхронизирую данные с моим карманным компьютером, пишу документацию для Интранет-сайта и делаю уйму других вещей. Для всего этого права администратора не нужны, так зачем риско вать? (Должен признать, что, обустраивая новый компьютер, я добавляю себя в группу администраторов, устанавливаю все нужные приложения и незамедлительно удаляю себя из этой группы.) Не наступайте на одни и те же грабли:

не работайте в системе под административной учетной записью Если мне нужно выполнить операцию, требующую административных при вилегий, я либо использую команду runas, либо создаю на рабочем столе ярлык и на его странице свойств устанавливаю флажок Run as different user (Запускать от имени другого пользователя) (в Windows 2000} или Ran with different credentials (Запускать с другими учетными данными) (в Windows ХР). При запуске приложения я ввожу имя учетной записи локального ад министратора и пароль. Б этом случае от имени администратора запуска ется только это приложение. Когда оно закрывается, я больше не админис тратор. Вам следует попробовать этот способ — вы будете гораздо надеж нее защищены от атак!

Создавая приложение, укажите необходимые ресурсы и перечень специальных задач, которые оно должно выполнять. Ресурсам могут быть файлы и разделы реестра, специальными задачами — возможность входа пользователя в систему, отладки процессов или выполнения резервного копирования. Часто оказывает ся, что для выполнения задачи большинство особых привилегий или возможнос тей не требуется. Создав список ресурсов, определите, какие операции с ними выполняет приложение, например, ему нужно читать и писать в ресурсы, но не создавать или удалять их. Эта информация позволит вам определить, нужны ли пользователю права администратора, чтобы запускать приложение. Чаще всего оказывается, что нет.

Вернемся к примеру организации защиты в банке. Наибольшая ценность в банке — хранилище, но у операционистов нет к нему прямого доступа. Грабитель, конечно, может попытаться угрозами заставить операциониста открыть храни ГЛАВА 3 Принципы безопасности, которые следует взять на вооружение лище, но тот просто не знает, как это делается. Так в банке работает принцип ми нимальных привилегий.

Если хотите немного развлечься, посмотрите раздел "Если не использовать учетную запись администратора, программа просто «ломается*» в приложении Б.

где с юмором и наглядно иллюстрируется принцип наименьших полномочий. А в главе 7 исчерпывающе объясняется, как в большинстве случаев удается «обойти* казалось бы неустранимую требовательность приложения, к опасно высоким при вилегиям.

Совет Если ваше приложение или служба не работает при запуске под учет ной записью, отличной от административной или системной, разбери тесь, в чем дело. Велика вероятность, что в повышенных привилегиях нет никакой необходимости, Разделите привилегии Принцип наименьших привилегий также подразумевает разделение привиле! ий:

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

В июне 2002 г. серьезную брешь в версиях 2.3-1 и 3-3 протокола OpenSSH, ко торый входит в Apple Mac OS X, FreeBSD и OpenBSD, удалось устранить за счет предусмотренной по умолчанию поддержки разделения привилегий. Уязвимый код стал работать с меньшими правами, так как параметр UsePrivilegeSeparation уста новили в ssbd_config. Подробнее об этой проблеме на Web-странице www.of.en ssh.com/txt/preauth.adv.

Другой пример разделения привилегий — сервер Microsoft IIS 6, который вхо дит в Windows.NET Server. В отличие от IIS 5, на этом Web-сервере пользователь ский код по умолчанию не запускается с повышенными привилегиями. Все пользо вательские HTTP-запросы обрабатываются внешними рабочими процессами (w3wp.exe), действующими под учетной записью сетевой службы (Network Service), а не бо лее привилегированной локальной системы (Local System). А вот inietinfo.exe, про цесс администрирования и управления процессами, у которого нет прямой свя зи с HTTP-запросами, работает под учетной записью локальной системы.

Еще один пример — Web-сервер Apache. Его работа начинается с запуска глав ного процесса bttpdc полномочиями root;

для обработки запросов он порождает процессы httpcl, которые работают под низкопривилегированной учетной запи сью nobody.

Будьте готовы к проблемам с обратной совместимостью Обратная совместимость — еще одна причина поставлять защищенные приложения с безопасными параметрами по умолчанию. Допустим, ваше приложение, кото рое используют многие крупные корпорации с тысячами, если не с десятками тысяч, клиентских компьютеров, базируется на созданном вами же протоколе, оказав шемся не вполне защищенным. Через пять лет и девять версий у вас наконец.-то Безопасность приложений сегодня 54 Часть I «дошли руки» и вы исправили ошибку в протоколе. Но тут-то и начались пробле мы: новая версия оказалась несовместимой со старой и компьютеры с новой вер сией отказывались взаимодействовать с машинами, оснащенными модифициро ванным приложением. Шансы, что клиенты дружно перейдут на новую версию приложения, минимальны — некоторые из них до сих пор работают на версии и 2. Получается, что «дырявая* версия протокола должна жить вечно!

Одно из хороших решений — предоставить возможность выбора версии про токола с помощью параметров конфигурации. Часть клиентов предпочтет пользо ваться только последней версией, чтобы не рисковать или потому что у них по просту нет клиентов с более старой версией, Совет Решаясь на внесение в продукт существенных изменений, связанных с безопасностью, будьте готовы к появлению вороха проблем с обратной совместимостью, Обратная совместимость: подпись в 8MB и TCP/IP С проблемой обратной совместимости сталкивалась и Microsoft. Протокол SMB (Server Message Block) активно используется в файловых сервисах и сер висах печати в продуктах Microsoft и других поставщиков со времен LAN Manager, то есть с конца 80-х. Новая, более защищенная версия SMB-npo токола, в которой реализована подпись пакетов, стала доступной в Win dows NT 4 с Service Pack 3 и Windows 98. Обновленный протокол существенно улучшен в двух отношениях;

исключена возможность атак посредника (гаап m-he-mid

- С точки зрения безопасности имеет смысл внедрить подпись SMB-паке тов. Однако в этом случае компьютеры смогут взаимодействовать по про токолу SM8 только при условии поддержки подписи, то есть практически все компьютеры компании придется модернизировать ~~ задача не всегда выполнимая. Есть альтернативный путь: после установления соединения между двумя компьютерами пытаться использовать подпись пакетов и в случае неудачи переходить на незащищенную версию протокола. Но в плане безопасности это ничего не дает: нападающий всегда сможет заставить сер вер перейти на опасную версию SiMB.

Другой пример — печально известный своей незащищенностью прото кол TCP/IP. В новом протоколе IPSec (Internet Protocol Security) устранено большинство присущих TCP/IP проблем, но не все серверы его понимают (поэтому по умолчанию он отключен). TCP/IP не скоро сойдет со сцены, поэтому нам еще долго придется бороться с атаками на него.

Принципы безопасности, которые следует взять на вооружение ГЛАВА Принимайте как аксиому, что внешние системы не защищены по определению Предположение о незащищенности внешних систем связано с принципом защи ты на всех уровнях: одна только осторожность при взаимодействии с такими системами — уже неплохое средство безопасности. Любые данные, поступающие из систем, над которыми вы не властны, по определению признаются небезопас ными, а сами системы — потенциальным источником атак. Это особенно важг о в процессах приема данных, введенных пользователем. Пока не доказано обрат ное, любая информация извне должна рассматриваться как потенциальная атака.

Внешние серверы также могут стать мишенью. Существует масса способов перенаправления клиентов на «не тот» сервер. В главе 15 затрагивается эта тема:

система DNS, на которую мы полагаемся при поиске нужного сервера, не слип ком-то надежна. Создавая клиент, не особо рассчитывайте, что приложение все гда будет иметь дело с «легальным» паинькой-сервером.

Не рассчитывайте, что вашему приложению всегда придется общаться с про граммами, которые четко ограничиваются набором команд, доступных в польз! > вательском интерфейсе или интерфейсе Web-клиента приложения. Многие сер веры взламываются лишь из-за легкости, с которой им можно «всучить» вредонос ные данные в обход клиента. Та же опасность грозит и в обратном случае, когда клиентам подсовывают «липовый* сервер.

Внимание! Прочитав следующую главу, вы поймете, что, кроме прочего, деком позиция приложения на ключевые компоненты позволяет разделить источники данных на доверенные и ненадежные. Будьте очень осторожны при передаче данных из ненадежного источника в доверенный процесс, И не говорите потом, что я вас не предупреждал!

Разработайте план действий на случай сбоев и отказов Как я уже говорил, все ломается. Механическое оборудование подвержено изн' > су, а программное и аппаратное обеспечение может содержать «жучки» (bug;

;

).

Ошибки происходят часто, и надо быть к ним готовыми. Разработайте план на случай нарушения защиты. Как быть, если взломали брандмауэр? Что делать, если изуродовали Web-сайт? Или скомпрометировали приложение? «Этого никогда ire может быть, потому что не может быть*, — не ответ. Ситуация сродни разработке плана эвакуации при пожаре: хочется надеяться, что план никогда не пригоди г ся, но если он есть, шансов остаться живым существенно больше, Совет В этом мире несколько неизбежных вещей: смерть, налоги и сбои ком пьютерных систем. К ним следует быть готовыми.

Предусмотрите безопасный сбой Итак, что делать, когда система все-таки «упала»? Ошибка может перевести систе му в один их двух режимов;

защищенный и незащищенный. В первом случае пр i ложение не раскрывает секретные данные, не позволяет их изменить или восполь Безопасность приложений сегодня 56 Часть I зоваться ошибкой для каких бы то ни было других вредоносных действий с ними.

В незащищенном режиме приложение может раскрывать конфиденциальные све дения или допускать «порчу* секретных данных (или что еще похуже). Нас инте ресует последний случай — зная, как «уронить* вашу программу, нападающий обойдет механизмы защиты, поскольку «рухнувшее» приложение не обеспечива ет защиты.

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

Чтобы понять суть «небезопасного» сбоя, посмотрите этот псевдокод и попы тайтесь найти в нем подвох.

DWORD dwfiet = lsAccessAllowed(...);

if (dwRet == ERROR_ACCESS_DENIED) { // Проверку безопасности пройти не удалось.

// Информируем пользователя о запрещении доступа.

} else { // Проверка безопасности прошла успешно.

// Выполняем запрошенную задачу.

На первый взгляд все прекрасно, но что, если произойдет ошибка в функции IsAccessAllowed't Например, когда во время работы функции закончится свободная память или описатели объектов? Пользователь успешно получит доступ, если функция вернет что-то вроде ERROR_NOT_ENOUGH_MEMORY.

Код следует переписать так:

DWORD dwRet = IsAccessAllowed(...);

if {dwRet == NO_ERROR) { // Проверка безопасности прошла успешно, // Выполняем запрошенную задачу.

} else { // Проверку безопасности пройти не удалось.

// Информируем пользователя о запрещении доступа.

} Теперь в случае ошибки при вызове IsAccessAllowed пользователю никак не уда стся получить доступ к выполнению привилегированной задачи, Другой пример — список правил доступа на брандмауэре. Пакет, не удовлет воряющий определенному набору правил, не должен пройти, то есть его отбра сывают. В противном случае будьте уверены, что найдется лазейка, которая по зволит пропихнуть через брандмауэр вредоносный пакет (или целую армию та ких «сюрпризов»). Задача администратора — сконфигурировать брандмауэр так.

чтобы тот пропускал только пакеты определенных, допустимых типов, а все ос тальные надежно блокировал.

Другой сценарий детально описан в главе 10. Речь идет о фильтрации введен ных пользователем данных с целью поиска потенциально опасной информации и немедленному отбрасыванию данных при наличии в них опасных символов.

Потенциальная угроза безопасности существует, если нападающему удастся «под ГЛАВА 3 Принципы безопасности, которые следует взять на вооружение сунуть» вашей программе данные, которые фильтр не перехватывает. Так что вам следует четко определить, что разрешается принимать, а все остальное безогово рочно отвергать.

Примечание Есть замечательная публикация Джерома Зальтцера (Jerome Saltzer) и Майкла Шредера (Michael Schroeder) о безопасных сбоях — «The Protec tion of Information in Computer Systems* (Защита информации в компь ютерных системах) (web.mit.edu/Saltzer/ivww/publications/protection), Совет Запомните золотое правило безопасного сбоя: запрещать все по умол чанию, а разрешать только то, что соответствует всем условиям, Помните, что возможности подсистемы безопасности — это не то же самое, что безопасные возможности системы В презентациях для разработчиков по поводу безопасного проектирования и кодирования я всегда размещаю на втором или третьем слайде такой пункт:

Функции безопасности 1= Безопасные функции Это стало в некотором роде заклинанием в команде Secure Windows Initiative, Оно позволяет нам не забыть, что простое сбрызгивание приложения «живой водой» безопасности не защитит его. Чтобы гарантировать защиту от атак, мы должны быть уверены в том, что включаем корректные функции и адекватно их используем. Нет никакого смысла применять протокол SSL (Secure Socket Layer) или TLS (Transport Layer Security), если вы защищаете не поток данных между кли ентом и сервером. (К слову, один из лучших способов гарантировать примене ние адекватных функций — моделирование опасностей, но об этом — в следу* ) щей главе), Другая причина, по которой функции безопасности не обязательно вылива ются в безопасное приложение, — эти функции часто создают люди, професси j нально занимающиеся безопасностью. А их не особо интересует расширение возможностей самого приложения. (Это не значит, что ПО для защиты не соде > жит ошибок, но вероятность этого все же выше).

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

Не стройте систему защиты на ограничении информации о приложении Всегда предполагайте, что нападающий знает ровно столько же, сколько вы, в тем числе знаком со всеми исходными кодами и проектной документацией. Даже если это не так, при желании взломщику ничего не стоит раскопать информацию, не лежащую на поверхности. Некоторые способы получения подобных сведений описаны и в этой книге. Сокрытие определенной информации годится в качест *е одного из средств защиты, по только не единственного средства обеспечения безопасности. Иначе говоря, неразглашение можно считать малой частью стра тегии «защиты на всех уровнях*, Часть 1 Безопасность приложений сегодня Разделяйте код и данные Смешивание кода и данных — старая проблема, возникшая с выходом версии 2. пакета Lotus 1-2-3 в 1985 г. Это приложение для работы с электронными таблица ми пользовалось бешеной популярностью в конце 80-х и начале 90-х;

от анало гов его отличала возможность выполнения пользовательских макросов. Спрос рождает предложение: разработчики делали огромные деньги на написании и продаже макросов. С тех пор многое изменилось. Тем не менее данные — это дан ные, и если в них добавлять исполняемый код, они становятся опасными. Взять хотя бы многочисленные проблемы с вирусами, которые распространяются по электронной почте за счет того, что сообщения содержат не только данные (соб ственно сообщение), но и код (в виде сценариев и вложений). Или проблемы с защитой в Web-страницах, такие как подмена параметров в URL-адресах с исполь зованием сценариев (cross-site scripting), возникающие из-за совмещения HTML и JavaScript. He поймите меня превратно, слияние кода и данных — исключительно мощная возможность, но на деле она часто ослабляет защиту.

Если в вашем приложении предусматривается смешение кода и данных, мы рекомендуем по умолчанию запрещать выполнение кода и предоставить пользо вателю самостоятельно определять политику, Именно так сделано в Microsoft Office XR По умолчанию никакие макросы не выполняются — решение об их за пуске принимает пользователь.

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

Совет Обнаружив ошибку защиты или архитектурный просчет, устраните его и немедленно проверьте остальные части приложения — вы наверняка найдете аналогичные дефекты, И еще: обнаружив «шаблонную", повторяющуюся раз за разом ошибку, поза ботьтесь о том, чтобы искоренить их как класс, не ограничивайтесь полумерами.

Внося исправления, не делайте из ошибок секрета — сообщайте о них откры то. Если вы исправили три, а не одну ошибку, которую обнаружил исследователь системы, так и скажите! На мой взгляд, это свидетельствует о вашей вниматель ности и тщании в борьбе за безопасность. Сокрытие ошибок безопасности — одна из причин возникновения теорий заговора! Они учат нас осторожности — не сообщайте слишком много деталей, чтобы нападающий не смог атаковать еще не «залатанные* (patched) системы. Моя любимая цитата по этому поводу:

Принципы безопасности, которые следует взять на вооружение ГЛАВА Утаите проблему, и мир будет предполагать худшее.

Марк Валерий Марциал, римский поэт (40—104 годы н. э.) Обнаружив ошибку в защите, старайтесь исправить ее радикально, максимально близко к «корню зла». Например, если ошибка в функции ProcessData, внесите исправления в нее или как можно ближе к ней. Не исправляйте код, которьй вызывает эту функцию. Если хакер сумеет «обмануть» систему и вызвать PrvcessDa'a напрямую или обойти изменения, внесенные вами в код, система окажется безза щитной.

И наконец, если брешь в защите существует из-за какой-либо фундаментадр, ной проблемы, рубите ее на корню. Не лепите «заплатки» — со временем они пре вратятся в снежный ком, так как часто приводят к регрессионным ошибкам. К;

;

к говорится, «лечите болезнь, а не симптомы».

Резюме Мы изложили основные современные принципы разработки ПО. По опыту могу сказать, что их несложно реализовать, по выигрыш при этом получается огром ный. Внедрять их следует как можно быстрее. Если не знаете, с чего начать, нач ните с принципа «безопасные параметры по умолчанию», поскольку это pest о сокращает количество возможностей для атак (и плавно ведет вас «за руку» к при] i ципам «защита на всех уровнях» и «использование минимальных привилегий*), На втором месте принцип «извлечение уроков из ошибок». В этом нет ничего зл зорного — все мы люди и способны ошибаться, но только не надо повторять свои ошибки!

ГЛАВА Моделирование опасностей Внимание! Невозможно создать надежную систему, не понимая, какие опас ности ей угрожают. Запомните эту азбучную истину.

Печально, но факт — многие приложения проектируются в спешке, и в жертву в первую очередь приносится безопасность. Один из методов упорядочения про ектирования прикладных программ заключается в создании модели опасностей (threat model), грозящих системе. Необходимо тщательно проанализировать за щиту продукта, чтобы определить источники наибольшей угрозы его безопасно сти и внешние проявления атак, то есть установить, каким опасностям и как дол жна противостоять система. Суть моделирования — описать защиту приложения определенным формальным способом. Обычно очень много говорят об опасно сти и атаках, но практически ничего — об их моделировании. По собственному опыту знаю, что разработчики, моделирующие опасности, лучше понимают сла бые места своих продуктов и применяют адекватные меры по предотвращению опасностей, а значит, создают более защищенные системы, По завершении кампании Windows Security Push в феврале — марте 2002 года, отвечая на вопрос журналиста о самом полезном навыке, которое за это время приобрели разработчики, тестировщики и архитекторы приложений, я без коле баний ответил, что разработчиков мы научили отслеживать путь каждого байта данных в программе и анализировать даже самые невероятные способы обраще ния с данными, тестировщиков — выявлять возможности мутации данных (по дробнее — в главе 9), а проектировщиков — анализировать опасности. По сути, Windows Security Push (и другие аналогичные кампании в Microsoft) позволили нам сделать вывод, что, с точки зрения безопасности, моделирование опасностей — самая важная составляющая проектирования приложений.

Моделирование опасностей ГЛАВА Моделирование опасностей как средство проектирования защищенных приложений Главная причина, вынуждающая заниматься моделированием опасностей, в то ч, что невозможно создать по-настоящему защищенную систему, не выяснив, что именно ей грозит, и не сделав все для снижения общей уязвимости приложения.

Моделирование опасностей — простой и временами захватывающий процесс, ьо чтобы получить отдачу, вам придется попотеть. Ленивый проектировщик можгт даже указать моделирование в качестве раздела, относящегося к безопасности!

При этом очевидны и другие плюсы.

• Моделирование позволяет лучше разобраться в приложении. Это ясно. Тщатель но, шаг за шагом изучая приложение, вы волей-неволей в деталях изучите, K:IK оно работает! Во время совещаний по моделированию опасностей мне несме г ное число раз приходилось слышать от авторов программы возглас удивления:

«Вот, оказывается, как оно работает!* • Моделирование помогает находить ошибки в программе. Я взял за правило, в какой бы команде я ни работал, заносить информацию об обнаруженных в программе ошибках в базу данных, и со временем в списке возможных значе ний поля «Как обнаружено» появлялось новое — «Моделирование опасностей».

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

Внимание! Если вы никогда до этого не анализировали опасности, кото рые грозят системе, то наверняка в защите есть такие бреши, о кото рых вы даже не подозреваете!

Обнаруживаются сложные ошибки проектирования, которые практически ire удается выявить другими способами. Анализ опасностей — лучшее средство выявить незначительные бреши защиты на различных уровнях, а когда их много, последствия могут оказаться катастрофическими.

Модели опасностей помогают новым сотрудникам детально разобраться в приложении. Любому требуется время, чтобы «включиться в процесс», а иссле дование программы способствует быстрому обучению, О моделях опасностей следует уведомлять разработчиков продукта, «завязан ных» на вашем приложении. По крайней мере дважды на моей памяти возни кала ситуация, когда разработчики программы В, которая зависела от программ ы А, безуспешно боролись с дырявой защитой В, ошибочно предполагая, что в А брешей нет. Все прояснилось только после анализа опасностей, грозящих про грамме А. Подумайте, может, и вам стоит внести в свою модель раздел, в KOTI > ром будут перечислены опасности, влияющие на другие продукты, — тогда разработчикам последних не придется строить громоздкие модели.

Модели опасностей полезны и тестировщикам: проверка ПО на основе мод > ли опасностей поможет разработать новые средства тестирования. Модели Безопасность приложений сегодня 62 Часть I опасностей полезны при организации хорошо продуманного плана тестиро вания защиты — об этом я расскажу в главе 19.

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

Вот как выглядит процесс моделирования опасностей:

1. создание группы моделирования опасностей;

разложение приложения на составляющие;

2.

3. определение опасностей, грозящих системе:

4. упорядочение опасностей в порядке убывания степени их серьезности:

5. определение методов реагирования на опасности;

6. выбор методов борьбы с опасностями;

7. отбор технологий для выбранных методов борьбы с опасностями.

Эту последовательность придется повторить несколько раз (рис. 4-1) — будь вы хоть семи пядей во лбу: выявить все «тонкие места» за один проход не удастся.

К тому же со временем происходят изменения, возникают новые проблемы, ме няется ситуация в отрасли и технике и в системах отыскиваются новые слабые места, Разложение приложения на составляющие Определение опасностей Ранжировка опасностей Предотвращение опасностей Рис. 4-1. Процесс моделирования опасностей Рассмотрим каждый этап этого процесса по отдельности.

Создание группы моделирования опасностей На первом этапе участники проекта собираются для выполнения предваритель ного анализа опасностей. Группу должен возглавить самый компетентный в во просах безопасности человек. «Компетентность» подразумевает умение находить в приложении или его проекте возможные направления атаки системы. Участни ки группы могут даже не разбираться в коде, но они должны знать, как ранее взла мывались подобные приложения. Именно это важно, потому что моделирование ГЛАВА 4 Моделирование опасностей опасностей приносит оольше пользы, если его выполняют люди, разбирающиеся в методах атак.

Позаботьтесь, чтобы на встрече присутствовало по крайней мере по одному представителю от каждой подгруппы, в том числе от проектировщиков, програм мистов, тестировщиков и технических писателей. Чем разнороднее группа, тем шире охват. Если в компании работают знатоки в области безопасности, но они не участвуют в проекте, пригласите их тоже — свежий взгляд и новые вопрось о работе приложения часто приводят к интересным открытиям. Впрочем, не пере борщите: если в группе окажется больше десяти человек, работой будет труд] ю управлять и совещание может закончиться безрезультатно. Думаю, полезно позвать и представителя отдела маркетинга или продаж — не только чтобы выслушать его мнение, но и чтобы он узнал о новых возможностях. К тому же с отделом продаж стоит дружить, тогда его сотрудники будут со знанием дела рассказывать клиен там о том, как компания печется о защите создаваемого ПО. (Присутствие пред ставителей этих отделов на каждом совещании необязательно, зато у вас всегца будет что сказать в ответ на обвинения, что их игнорируют!) До начала работы обратите внимание собравшихся на то, что задача не в ре шении проблем, а в выявлении компонентов системы и путей их взаимодействия, а конечный итог мероприятия — обнаружение как можно большего числа опас ностей, грозящих системе. Изменения в проекте и в коде стоит рассматривать и вносить на следующих встречах. Однако обсуждения методов противодействия и предотвращения опасностей не избежать— просто не позволяйте «горячим го ловам» слишком углубляться в детали или, как мы говорим в Microsoft, «уходить в сторону*.

Для первой встречи достаточно обычной доски, информацию с которой поз же стоит перевести в электронный вид для дальнейшего анализа и повторного просмотра.

Внимание! Не пытайтесь во время таких встреч предлагать решения и устра нять проблемы. Их цель — лишь поиск опасностей, но никак не устра нение. Мой опыт показывает, что на первых «сборах» дело часто не до ходит даже до поиска опасностей, не говоря уже о методах борьбы с ними!

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

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

Прежде чем подробно описать формализованный процесс моделирования опасностей, коротко расскажу об истории его создания. Мы, небольшая группа сотрудников Microsoft, собрались в ноябре 2001 г., чтобы обсудить, как структу Безопасность приложений сегодня 64 Часть I рировать моделирование опасностей. Благодаря помощи специалистов по моде лированию приложений, пришли к выводу, что стоит строить диаграммы пото ков данных, а также другие диаграммы. Мы утвердились в этом мнении в начале 2002 г., когда Microsoft привлекла компанию @stake (http://ivww.atstake.com), спе циализирующуюся на компьютерной безопасности, для анализа безопасности технологий, применяющихся в продуктах Microsoft. В моделях, предложенных @stake, диаграммы потоков данных составляют важную часть процесса разложе ния программы на составляющие, выполняемого до моделирования опасностей.

В это же время разработчики Microsoft SQL Server инициировали крупномас штабную кампанию по безопасности, начав не с анализа кода, а с месячного ра унда моделирования опасностей. Как вы догадываетесь, разработчики SQL Server прекрасно разбираются в данных. Как-никак SQL Server — это база данных, и кому как не ее создателям использовать при моделировании приложений диаграммы потоков данных (data flow diagrams, DFD). Это упрочило нашу веру в то, что та кие методики формальной декомпозиции приложений, как DFD-диаграммы. весьма полезны для моделирования опасностей. Мы применяем чуть модифицированные DFD-диаграммы, добавляя информацию о характере данных и границах облас тей с различным уровнем безопасности. В конце концов, бреши часто возникают из-за ошибочных предположений о данных, особенно когда данные попадают в доверенную область из недоверенной, Формальная декомпозиция приложения Сейчас я расскажу о том, как использовать DFD-диаграммы для разложения ПО на ключевые составляющие перед началом моделирования. Впрочем, я не наста иваю на том, что DFD-диаграммы — единственный метод декомпозиции для ана лиза опасностей. Некоторые элементы UML (Unified Modeling Language), особен но диаграммы операций (activity diagram), отлично подходят для описания про цессов и очень похожи на DFD-диаграммы. Тем не менее UML-диаграммы опера ций в основном описывают потоки управления между процессами, а не потоки данных, как DFD-диаграммы. Эти понятия схожи, но не идентичны.

Примечание Мы не собираемся учить вас создавать DFD-диаграммы или ис пользовать UML. Этому посвящено множество книг — некоторые указа ны в библиографическом списке.

Основополагающий принцип DFD-диаграмм таков: приложение или систему можно разбить на подсистемы, а те, в свою очередь, — на более мелкие подсисте мы следующего уровня. Подобный итерационный подход делает DFD-диаграммы удобным средством декомпозиции приложений. Прежде всего я познакомлю вас с условными обозначениями на DFD-диаграммах (рис. 4-2).

На первой стадии декомпозиции определяют границы или область действия анализируемой системы, а также границы между доверенными и недоверенными компонентами. На DFD-диаграммах границы приложений определяют на основе высокоуровневого представления контекстов. Если не определить область действия приложения, вы потеряете массу времени на анализ тех опасностей, что находятся за пределами «компетенции» приложения и не имеют к нему никакого отноше ния. Заметьте: диаграмма контекста содержит один-единственный процесс и обыч ГЛАВА 4 Моделирование опасностей но не содержит хранилищ данных. Ее можно сравнить с обзором проекта «с вы соты птичьего полета*: пользователь и система — и никаких деталей. На следую щих стадиях вы перемещаетесь на все более низкие уровни — к диаграммам уров ня 0, уровня 1, уровня 2 и т. д. (рис. 4-3).

Процесс Преобразование или обработка данных Группа процессов Преобразование или обработка данных Хранилище данных Место хранения временных или постоянных данных Граница Границы — между машинами, областями с различным уровнем безопасности, адресного пространства и т.п.

Внешний субъект Внешний источник данных Аутентифици Поток данных рованные ^ данные\ Описывает потоки данных из хранилищ данных, процессов и внешних субъектов Рис. 4-2. Основные условные обозначения на DFD-диаграммах Мы не станем теоретизировать по поводу DFD-диаграмм, а объясним все на примере упрощенного Web-приложения для расчета зарплаты.

Совет Все DFD-диаграммы этой главы созданы в шаблоне Data Flow Diagram приложения Microsoft Visio Professional 2002.

На рис. 4-4 показана диаграмма контекстов примера приложения расчета зар платы.

При определении области действия DFD-диаграммы учитывайте следующие моменты:

• игнорируйте внутреннее устройство приложения. На этом этапе вас не долж но интересовать, как оно работает, — вы определяете область действия, а не подробности работы приложения;

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

• определите, какой ответ генерирует процесс. Web-сервис фондовой биря.и может возвращать время и котировки, а также, при возможности, цену прода жи и покупки;

Безопасность приложений сегодня 66 Часть I Контекст Уровень D Уровень Рис. 4-3. Основной принцип анализа на основе DFD-диаграмм. — спуск по иерархической лестнице от диаграммы контекста к низкоуровневом DFD-диаграммам • выявите взаимоотношения источников данных с запросами и откликами. Уч тите, что источники данных делятся на постоянные (файлы, реестр, базы дан ных и т. п.) и временные (данные в кэше);

• определите получателей всех откликов.

Каждый процесс на рис. 4-4 в свою очередь состоит из нескольких более мел ких процессов и поэтому также нуждается в декомпозиции. На рис. 4-5 показана диаграмма уровня 1 для нашего приложения.

Моделирование опасностей ГЛАВА Запрос на админист ративное воздействие Отклик на админист ративное воздействие Запрос информации, о зарплате;

0, Приложение расчета зарплаты Ответ на запрос информации о зарплате Обновленные файлы Записи журнала аудита Рис. 4-4. DFD-диаграмма контекстов приложения расчета зарплаты Создавая DFD-диаграммы, следуйте правилам создания и именования объекте и:

• каждому процессу соответствует как минимум один входящий и один исходи щий поток данных;

• все потоки данных начинаются и заканчиваются на процессах;

• хранилища данных соединяются с процессами через потоки данных;

• хранилища данных никогда не соединяются друг с другом напрямую — толь ко через процессы;

• названия процессов состоят из глаголов и существительных или фраз на ос нове глаголов (например: «Обработать символ акции*, «Поставить оценку за экзамен». «Создать запись в журнале»);

• названия потоков данных — существительные или фразы на их основе (напри мер: «Биржевая цена*, «Экзаменационная оценка», «Результаты аудита событий*);

• названия внешних субъектов — существительные (например: «Биржевой бро кер». «Экзаменуемый»);

68 Безопасность приложений сегодня Часть I Запрос на админист ративное воздейстни 14. Отклик на админист Применение ративное воздействие администра тивной политики Аутентификационные данные Обновленные данные по зарплате Обновленные аутентифи \ кационные данные 6. Аутентификационные данные 12. Данные по зарплате Статус Реквизиты аутентификации Запрос данных по зарплате Запрос информации Запрос данных Запрос информации по зарплате о за плате\ по арппате 5.0 " 9. Применение^ Обработка политики клиентских данных по зарплате Ответ твет на запрос на запрос Данные информации информации по за плате о зарплате •J i J 0 M J i. i l ! ' Новые данные аудита Запрошенная Запрошенная I страница страница 13. Журнал аудита 8. 7. Код Web-сервиса Web-страницы Г7 Центр данных Интрасеть Обновленные Обновленные файлы файлы Записи аудита Рис. 4-5- DFD- диаграмма уровня 1 приложения расчета зарплаты • названия хранилищ данных — существительные (например: «Текущие бирже вые данные», «Итоговый результат экзамена», «Журнал аудита»).

Наконец-то мы добрались до момента, когда становится понятно, как устрое но приложение. Как правило, для моделирования опасностей достаточно спуститься на два, три или четыре уровня. Я сталкивался с 8-уровневыми DFD-диаграммами, но они создавались для проектирования приложения, а не моделирования опас ностей. Достаточным следует считать уровень, на котором начинают проявлять ся возможные опасности — иначе люди потеряют интерес к моделированию, ре шив, что следующую пару месяцев им предстоит только строить DFD-диаграммы!

Моделирование опасностей ГЛАВА Мне встречались великолепные модели опасностей, представленные исключитель но DFD-диаграммами уровня 1, Внимание! Не впадайте в паралич от объема работы — достаточно дойти до уровня, позволяющего выявить опасности. Паралич от анализа наступа ет, когда анализ продолжается слишком долго, растягиваясь чуть ли не на весь период реализации проекта.

На рис. 4-6 показано высокоуровневое физическое представление приложения расчета зарплаты со всеми ключевыми компонентами и основными пользовате лями (или, выражаясь на языке моделирования опасностей, действующих лиц) Администратор Административная консоль Центр данных Данные Аутентификациокные о зарплате данные 4 ф Логика интерфейса Пользовательский администрирования интерфейс Пользователь web- Сервер ба;

ыданн сервер * Web-страницы Данные и код We Ь- се р висов аудита..*.

Клиент Web-сервиса.J Пользователь Интерфейс загрузки информационного наполнения на Web-cepeep Web-разработчик Аудитор Рис. 4-6. Высокоуровневое физическое представление приложения расчета зарплаты Часть I Безопасность приложений сегодня Основные компоненты приложения описаны в табл. 4-1.

Таблица 4-1. Основные компоненты и пользователи приложения расчета зарплаты Компонент или пользователь Примечание Пользователь Пользователи — основные потребители решения. Им разре шено просматривать данные о своей заработной плате, ис торию выплат по крайней мере за последние 5 лет и сведе ния об удержании налогов Пользователям доступно два способа доступа к информа ции: через Web-сайт или клиент Web-сервиса. Выбор — за пользователем Администраторы контролируют всю систему: следят за со Администратор стоянием сервера, управляют данными аутентификации и зарплаты. Заметьте: администраторы лишь управляют по токами данных, а сама информация доступна только сотруд никам отдела заработной платы Web-разработчик Поддерживает код Web-приложения, в том числе код Web страниц и Web-сервисов Аудитор Задача аудитора — просматривать журналы аудита и выяв лять неправомерные или просто подозрительные действия Пользовательский Пользовательский интерфейс реализован на основе HTML интерфейс и представляет собой основное средство доступа пользова телей в систему Клиент Web-сервиса Необязательный интерфейс, возвращающий неформатиро ванные «сырые» данные о зарплате Административная Административный интерфейс, который служит админист консоль ратору для управления серверами и данными приложения Интерфейс загрузки Web-дизайнеры работают с локальными копиями кода информационного приложения, а затем загружают обновленный код или наполнения на сервер Web-страницы, используя этот Web-интерфейс Web-сервер Здесь — просто компьютер с HTTP-сервером Web-страницы Web-страницы исполняют роль основного интерфейса сис темы: в этом основанном на технологии WWW'" решении содержатся динамические и статические страницы, а также графические изображения. Всей этой «кухней» заведуют Web-разработчики Код Web-сервиса Поддерживает работу дополнительного интерфейса систе мы — Web-сервиса. Этот код также поддерживают Web-раз работчики Данные аутентификации Данные аутентификации служат для проверки подлинности пользователей Бизнес-логика Бизнес-логика расчета зарплаты управляет получением расчета зарплаты запросов пользователей и отбором данных для представле ния конкретному пользователю Логика интерфейса Определяет, какие возможности предоставляет пользова администрирования тельский интерфейс администратора. Содержит все правила о том, кому и какие действия с данными разрешены ГЛАВА 4 Моделирование опасностей Таблица 4-1. (окончание) >&&&Я№Ю№Л№&№&а^^ Компонент или пользователь Примечание Сервер базы данных Сервер базы данных управляет доступом и обрабатывает данные по зарплате, а также формирует данные для аудит а Данные о заработной Управляются сервером базы данных. Обязательная часть плате приложения, содержит информацию о зарплате и удержан ных налогах Данные аудита Создаются сервером базы данных, служат для наблюденш за всем происходящим с данными о заработной плате Определение опасностей, грозящих системе Следующий этап — отбор полученных в результате декомпозиции компонентов и использование их в процессе моделирования в качестве подвергающихся опас ности объектов. Анализ структуры приложения нужен не для того, чтоб выяснить, как же все работает, а чтоб получить сведения о компонентах приложения и по токах данных между ними. Компоненты часто называют объектами под угрозой (threat target). Прежде чем заняться выявлением опасностей, грозящих системе, рассмотрим, как опасности делятся на категории. Это пригодится позже, когда, \дя противостояния опасностям разных категорий придется применять различные стратегии, Классификация опасностей: методика STRIDE При анализе опасностей следует исследовать каждый компонент, а для этого : ie обходимо ответить на следующие вопросы;

• может ли неавторизованный пользователь просматривать конфиденциальные данные, пересылаемые по сети;

• может ли посторонний пользователь изменить записи базы данных;

• может ли кто-то помешать работе правомочных пользователей с приложением:

• может ли кто-то воспользоваться недоставками функции или компонента для получения полномочий администратора?

При ответе очень помогает классификация опасностей по категориям. Мы 6yz: ем применять классификацию, называемую STRIDE — по первым буквам английских названий категорий.

• Подмена сетевых объектов (Spoofing identity) Атаки подобного типа по зволяют взломщику выдавать себя за другого пользователя или подменять настоящий сервер подложным. Пример подмены личности пользователя — использование ворованных аутентификационных данных (имени пользователя и пароля) для атаки на систему. Типичный пример подобной бреши «из жиз ни» — применение ненадежных методов аутентификации, например некото рых видов HTTP-аутентификации: базовой (Basic authentication) и аутентифи кации на основе хеша (Digest authentication). Они описаны в RFC 2617. Так.

перехватив пакет HTTP-авторизации и узнав имя и пароль пользователя — Блс йк (Blake), пользователь Флетчер (Fletcher) сможет получить доступ к защищсн 4- Безопасность приложений сегодня 72 Часть I ным данным, выдав себя за Блейка — Флетчеру достаточно пройти стандарт ную процедуру аутентификации и указать имя и пароль Блейка.

Подменой серверов считаются подлог DNS-сервера (DNS spoofing) к моди фикация записей кэша DNS (DNS cache poisoning). Конкретный пример: брешь в утилите обновления ПО на компьютерах Apple. Если вы не знакомы с прин ципами атак на DNS-серверы, почитайте статью на Web-странице news.com.com/ 2100-1001-942265.html, в ней неплохо описаны оба типа атак на DNS-серверы.

Модификация данных (Tampering with data) Атаки этого типа предусмат ривают злонамеренную порчу данных. Примеры: несанкционированные изме нения постоянных данных (например хранящихся в базе данных), а также информации, пересылаемой между компьютерами через открытую сеть (на пример, Интернет). Реальный пример подобной атаки — изменение данных в файле, защищенном недостаточно надежным списком ACL [например. Every one: разрешение Full Control (Все: Полный доступ)].

Отказ от авторства (Repudiation) Контрагент отказывается от совершенного им действия (или бездействия), пользуясь тем, что у другой стороны нет ни какого способа доказать обратное. Например, в системе, где не ведется аудит, пользователь может выполнить запрещенную операцию и отказаться от ее «авторства», а администратору не удастся ничего доказать. Невозможность отрицания авторства (nonrepudiation) — это способность системы противо стоять такой опасности. Купив товар через Интернет, пользователь должен расписаться в его получении. Продавец впоследствии сможет использовать подписанную квитанцию как доказательство того, что пользователь действи тельно получил товар. Понятно, что поддержка невозможности отрицания авторства жизненно важна для приложений электронной коммерции, Разглашение информации (Information disclosure) Подразумевается рас крытие информации лицам, доступ к которой им запрещен, например, про чтение пользователем файла, доступ к которому ему не предоставлялся, а так же способность злоумышленника считывать данные при передаче между ком пьютерами. Пример, иллюстрирующий опасность подмены объектов, одновре менно демонстрирует опасность разглашения информации: прежде чем вос пользоваться реквизитам Блейка, Флетчеру придется их перехватить.

Отказ в обслуживании (Denial of service) В атаках такого типа взломщик пытается лишить доступа к сервису правомочных пользователей, например сделав Web-сервер временно недоступным или непригодным для работы. Не обходимо защищаться от определенных видов DoS-атак — это повысит доступ ность и надежность системы. В качестве примера можно привести такие ата ки типа «распределенный отказ в обслуживании» (distributed denial of service.

DDoS), как Trinoo и Stacheldraht. Подробно о них читайте на Web-странице staff.wasbington.edu/diUrich/misc/ddos./.

Примечание DoS-атаки трудно предотвратить, так как они относительно просты в реализации, причем атакующий остается неизвестным. Воз можна следующая ситуация: полноправному пользователю Шерилу (Cheryl) не удастся разместить свой заказ на Web-сайте, если взлом щик Линн (Lynn) организует массированную атаку на этот сайт, ко Моделирование опасностей ГЛАВА торая «под завязку» загрузит процессор системы. Для Шерил Web сервер станет недоступным, и для заказа нужного товара ей придет ся обратиться в другое место — возможно, к вашему конкуренту.

Повышение привилегий (Elevation of privilege) В данном случае непри вилегированный пользователь получает привилегированный доступ, позволя ющий ему «взломать» или даже уничтожить систему. К повышению привиле гий относятся и случаи, когда злоумышленник удачно проникает через заип IT ные средства системы и становится частью защищенной и доверенной под системы. И это действительно опасно. Приведу пример: в уязвимой системе ничто не запретит злоумышленнику поместить на диск файл, который выпол няется автоматически при входе пользователя в систему, и дождаться вход^ в систему полномочного пользователя. Если это администратор, зловредный код будет выполняться от его имени, Примечание При анализе уязвимых мест важно учитывать как их причи ны, так и последствия. STRIDE — неплохая классификация брешей по последствиям. Классификация по причинам также исключительно полезна. Она со временем превратится в длинный список того, чего не следует делать при программировании и проектировании. Это чрезвычайно удобно, особенно начинающим программистам.

Примечание Принципы классификаций STRIDE и DREAD (о последней чуть позже) придуманы, обоснованы и активно пропагандируются в Microsoft такими людьми, как Лоэн Конелдер (Lohen Kohnelder), Прерит Гарг (Praerit Garg). Джейсон Гармс (Jason Garms) и ваш покорный слуга Майкл Ховард.

Как вы могли заметить, некоторые типы опасностей взаимосвязаны. Если рек визиты пользователей недостаточно надежно защищены, то нередко разглашение информации влечет за собой подмену объектов. И, конечно же, повышение при вилегий приводит к значительно худшим последствиям: если кто-то получит пол номочия администратора или учетной записи root на атакуемом компьютере, псе потенциальные угрозы остальных категорий становятся реальностью. И наобо рот, иногда подмены объектов достаточно для достижения цели, и злоумышле н нику не нужно даже повышать привилегии. Так, «оседлав» SMTP-сервер, злоумыш ленник сможет замечательно повеселиться, разослав электронное письмо от имени генерального директора с объявлением лишнего выходного дня за отлично вы полненную работу. Для успешной атаки такого рода привилегии директора не нужны — хватит и обычных методов социальной инженерии!

А теперь о том. как определять опасности, грозящие системе. Мы построим i ак называемые деревья опасностей (threat trees) и применим к ним классификацию STRIDE.

Примечание Есть еще одна замечательная методика анализа опасностей, она создана в университете Карнеги-Меллона и называется OCTAVE (Operatio nally Critical Threat, Asset, and Vulnerability Evaluation) (http://www.cert.org/ octave).

Безопасность приложений сегодня 74 Часть I Дерево опасностей Для определения возможных видов неисправностей аппаратуры широко исполь зуются деревья неисправностей (fault trees). Оказывается, этот метод годится и для выявления проблем с безопасностью компьютерных систем. Как-никак ошибка в безопасности — только ошибка (или неисправность), способная привести к успеш ной атаке. Применительно к ПО данный метод часто называют деревьями опасно стей. Лучше всего о них рассказано в книге Эдварда Аморосо (Edward Amoroso) «Fundamentals of Computer Security Technology* (Основы технологий обеспечения безопасности компьютеров) — см. библиографический список.

Опасности, уязвимые места, ценные ресурсы, объекты под угрозой, атаки и мотивы Опасностью, грозящей системе, называют вероятность успешной атаки с нежелательными последствиями для системы. Брешь — это слабое место в системе, например ошибка Б программе или недостаток проекта. Атака выполняется, когда у злоумышленника есть мотив (причина для атаки) и возможность воспользоваться брешью для получения доступа к ценному информационному ресурсу (asset). Ценный ресурс в терминах безопаснос ти также называют объектом под угрозой (threat target).

Защиту можно анализировать в терминах опасностей (реализуемых взлом- •' щиками в виде атак), брешей и ценных информационных ресурсов по ана жхгий с пожаром. Для поддержания огня нужны три составляющие: высо кая температура, горючие материалы и кислород. Уберите что-то одно — и пламя потухнет. Как пожарники ликвидируют огонь на нефтяных скважи нах? Они не в силах устранить высокую температуру или горючий матери ал — проблема именно в избытке горючего! Поэтому они перекрывают огню кислород, взрывая нефтяную вышку. Взрыв забирает весь кислород в обла сти вышки, и пламя сникает.

Такова же ситуация и в области безопасности. Если убрать ценные ре сурсы, у хакера исчезнет причина атаковать. Если устранить бреши, злоумыш ленник не сможет воспользоваться ими для доступа к ценным ресурсам. Ну и наконец, если убрать хакера, причины волноваться вообще не будет, Од нако компаниям приходится хранить ценные, требующие защиты активы, системы содержат изъяны, а опасности встречаются на каждом шагу. К тому же у некоторых и мотива-то серьезного нет, а лишь огромное желание на пакостить другим. Хотя ваши активы таких людей совершенно не интере суют, они все равно будут атаковать.

Единственный выход, если речь идет о ПО, — снижение общего риска до приемлемого уровня. Именно в этом заключается конечная цель анали за опасностей, Схема анализа на основе деревьев такова: выявляем, какие элементы приложения могут стать целью атак, выясняем возможное слабое место каждого элемента — именно через них при определенных условиях удастся взломать систему. Дерево опасностей описывает процесс принятия решения злоумышленником при взло ГЛАВА 4 Моделирование опасностей ме компонентов системы. Получив в результате декомпозиции приложения спи сок компонентов, необходимо определить опасности, грозящие каждому из них.

Далее с помощью деревьев опасностей следует установить, как проявляет себя конкретная опасность.

Познакомимся с несколькими простыми примерами деревьев опасностей — гак вы лучше поймете их пользу. Вернемся к DFD-диаграмме приложения. Как вы помните, данные о зарплате передаются с Web-сервера на компьютер служащего (точнее, это делает служба обработки клиентских запросов) (рис. 4-7).

Запрос данных о зарплате 5. Служба обработки клиентских Отклик с данным зарплате Рис. 4-7. Часть DFD-диаграммы у ровня 1, демонстрирующая взаимодействие пользователя с Web-сервером посредством службы обработки клиентских запро< 'ов Данные о зарплате, которые пересылаются от пользователя (служащего) в ца ггр данных и обратно, конфиденциальны — о них должны знать только компании и сам служащий — вы ведь не хотите, чтобы служащий-злоумышленник имел досчуп к информации о зарплате других. То есть решение должно оберегать данные от посторонних глаз. Это еще один пример опасности разглашения информации.

Существует много способов получения доступа к чужим данным: самый простой из них, конечно же, — использование сетевого анализатора (sniffer) в сквозном режиме, шт режиме приема всех пакетов (promiscuous mode), для просмотра всех данных, которыми обмениваются «ничего не подозревающие* пользовательский компьютер-мишень и Web-сервер*. Другой вид атаки — взлом маршрутизатора, расположенного между двумя компьютерами, и перехват трафика, На рис. 4-8 показано дерево опасностей, где вкратце описаны способы, ко го рыми может воспользоваться злоумышленник для просмотра конфиденциальных данных о зарплате другого пользователя.

Следует заметить, что перехват пакетов «в лоб» возможен только в немаршрутизируе мых сетевых сегментах. В сетях с маршрутизаторами или маршрутизирующими кон центраторами применяют другие методы, в том числе подмену сетевых объектов, ) частичном случае которой рассказано далее. — Прим. перев.

Часть I Безопасность приложений сегодня Что такое «сквозной режим» В каждой сетевом сегменте все кадры попадают на каждый компьютер это го сегмента. Однако сетевой адаптер филкгрует кадры, передавая сетевому ПО -только те (их еще называют пакетами), что адресованы данному ком пьютеру- О сетевом адаптере, перехватывающем и передающем в сетевое ПО абсолютно все кадры, говорят, что он работает в сквозном режиме (promis cuous mode). При использовании адаптера, поддерживающего такой режим, сетевой анализатор сохраняет все полученные кадры для последующего анализа.

Опасность № Перехват конфиденциальных данных о зарплате при передаче по линиям связи (I) 1.1 1. НИР-трафик Злоумышленник не защи щен просматривает данные 1.2. 1.2. Т.2. Прослушивание Взлом Прослушивание сетевого трафика, проходящего коммутатора трафика с помощью через маршрутизатор сетевого анализатора 1.2.2.1 1.2,2.2 1.2.2.3 1.2.3. Взлом Маршрутизатор Подбор пароля Различные атаки маршрутизатора не защищен доступа на коммутаторы к маршрутизатору Рис. 4-8. Дерево опасности для процедуры просмотра данных о зарплате на пути от сервера до клиентского компьютера В верхнем прямоугольнике описана основная опасность, а ниже перечислены действия, превращающие ее в реальность. В данном случае опасность представ ляет собой риск раскрытия информации [обозначена как (I)], то есть просмотр злоумышленником информации о зарплате другого пользователя. Заметьте: опас ность относится непосредственно к объекту, выделенному в процессе декомпо зиции, В данном примере это ответ на запрос пользователем (1.0) данных о зар плате у процесса обработки клиентских запросов (5.0), ГЛАВА 4 Моделирование опасностей Внимание! Опасность нужно связывать непосредственно с определенным и процессе декомпозиции объектом.

Обратите внимание: чтобы опасность удалось легко реализовать, HTTP-трафик должен быть не защищен (1.1). а злоумышленник должен активно анализировать трафик, то есть прослушивать сеть (1.2.1) или перехватывать данные, проходящие через маршрутизатор (1.2.2) или коммутатор (1.2.3). Так как данные не защище ны (что нормально для HTTP-трафика), нарушитель получает к ним доступ в с лу чаях 1.2.1 и 1.2.2. Однако мы не хотим, чтобы все без исключения просматривали конфиденциальные данные нашего приложения. Заметьте: для реализации сценария прослушивания трафика на маршрутизаторе требуется одно из двух: взломщик либо должен иметь возможность воспользовался брешью защиты машрутизатора-ми шени (выполнение условий 1.2.2.1 и 1.2.2.2), либо ему необходимо подобрать ад министративный пароль для доступа к маршрутизатору (1.2.2.3). Взаимосвязь диух событий в первом сценарии показана маленькой дутой между двумя узлами (вер шинами). Можно также просто поместить слово «И» между соединяющими их линиями, как на рисунке.

Хотя деревья опасностей хороши для описания общей картины, при построе нии больших моделей опасностей они становятся слишком громоздкими. Суще ствует более компактный способ представления деревьев — в виде многоуровне вого списка. Следующий конспект представляет дерево опасностей, показанное на рис. 4-8.

1.0 Перехват конфиденциальных данных о зарплате при передаче по линиям связи 1.1 HTTP-трафик не защищен (И) 1.2 Злоумышленник просматривает данные 1.2.1 Прослушивание сетевого трафика с помощью сетевого анализатора 1.2.2 Прослушивание трафика, проходящего через маршрутизатор 1.2.2.1 Маршрутизатор не защищен (И) 1.2.2.2 Взлом маршрутизатора 1. 2. 2. 3 Подбор пароля доступа к маршрутизатору 1.2.3 Взлом коммутатора 1.2.3.1 Различные атаки на коммутаторы Как улучшить дерево опасности, чтоб повысить его читабельность Для выделения наиболее вероятных направлений атак в деревья опасностей можно вносить небольшие изменения. Во-первых, для отображения менее вероятных мест атаки используйте пунктирные линии, а для более вероятных — сплошные, tio вторых: под узлами маловероятных событий поместите объяснение, почему опас ность невелика, выделив его кружочком (рис. 4-9).

Учтите, что в процессе моделирования не следует описывать способы предот вращения опасностей. Так вы потеряете динамик}-. Устранение опасностей стоит отложить до лучших времен, когда проект программы начнет обретать очертания.

Полезно в деревьях опасностей использовать «пунктирные линии наибольшего противостояния опасностям*: они становятся механизмом отсечения маловажных ответвлений. На рис. 4-11 видно, что опасность 3.2 маловероятна, так как pea чи зация одной из его частей 3.2.1 и 3.2.2 вряд ли возможна. Чтобы опасность стала Часть I Безопасность приложений сегодня реальной, условия по обеим сторонам оператора логического умножения (И) должны выполняться. Таким образом вы выявите реальные проблемы.

Получение информации о пароле пользователя 1.1 1.2 1. Применение хакерского Прослушивание Валом хранилища подключения, по которому пользовательских ПО дая чтения пароли выполняется базовая реквизитов на сервере локального пользователя аутентификация 'Необходим1 1.3,1 1.3. физический Пользователь внедряет Установка доступ к вирус, позволяющий на компьютере серверу считывать пароль терской программы Необходим физический доступ « компьютеру Рис. 4-9- Коррекция дерева опасностей, улучшающая его читабельность Особенности моделирования опасностей Необходимо учитывать не только название и тип выявленной опасности, но и другие ее свойства (табл. 4-2).

Таблица 4-2. Свойства, которые необходимо фиксировать при моделировании опасностей Примечание Свойство Название Должно быть достаточно информативным, но не слишком длинным. Опасность должна быть легко понятна из назва ния — например. «Нарушитель получил доступ к корзине покупателя* Объект под угрозой Часть приложения, подверженная атаке. Так. объектами под угрозой в приложении расчета зарплаты являются поток данных запроса о зарплате (1.0-5.0) и процесс применения административной политики (14.0) Тип или типы опасности Тип опасности в рамках модели STRIDE. Часто опасность подпадает под несколько категорий STRIDE Риск Используйте свой любимый метод расчета риска, но будьте последовательны и не меняйте метод в процессе анализа Моделирование опасностей ГЛАВА Таблица 4-2. (окончание) Д|ЦиЦ|иШ1ДН1НЫЫЦЦ||Д1иЫЦ^^ Свойство Примечание Дерево атаки Как злоумышленник обнаружит место взлома. Не усложняй те деревья, чтобы не запутаться Методы уменьшения Методы устранения или ослабления опасности. Если он уже опасности применяется, пометьте это. в противном случае переходите (при необходимости) к следующей опасности. Помните, что во время моделирова ния опасностей не нужно искать решений проблем. Стой" отметить степень сложности устранения опасности. Это по может при назначении приоритетов. О некоторых методах я расскажу далее в этой главе Статус методов Уровень устранения опасности. Допустимые значения: «Да», устранения опасности «Нет», "Частично*. "Требует дополнительного изучения» Номер ошибки Если вы поддерживаете базу данных обнаруженных огаиб' ж, (при необходимости) не забывайте нумеровать их. Учтите, что база данных или инструмент моделирования опасностей не заменит БД с об наруженными ошибками. Нет ничего хуже, чем иметь два набора документации о программных ошибках, один из ко торых не потерял актуальность. В процессе моделирования опасностей фиксируйте только необходимую информацию об опасности и параллельно ведите БД программных ошибок Внимание! При моделировании опасностей описывайте все интерфейсы си стемы, независимо от того, задокументированы ли они, Распределение опасностей по мере убывания их серьезности Создав деревья опасностей и собрав информацию об опасностях, следует вычс лить наиболее важные, то есть тс. которые нужно решить в первую очередь. Ме тод количественной оценки риска не слишком важен, если вы будете трезво и последовательно оценивать ситуацию, Простой способ оценки риска (в этом случае назовем его Risk ro ) — умножить важность (величина потенциального ущерба) уязвимого места на вероятность того, что им воспользуются. Критичность и вероятность оценивают по шкале от 1 до 10:

= <Потенциальный ущерб> * <8ероятность возникновений Чем больше полученное число, тем больше угроза системе. Так, максимально возможная оценка риска равна 100 — произведению максимальной важности (10) и вероятности возникновения (10).

DREAD — методика оценки риска Есть еще один способ оценки риска, он появился на свет в процессе работ;

>i в Microsoft, — DREAD (в вычислениях я буду использовать сокращение RiskL)KMD_i — по первым буквам английских названий описанных далее категорий, • Потенциальный ущерб (Damage potential) — мера реального ущерба от успешной атаки. Наивысшая степень (10) опасности означает практически беспрепятственный взлом средств защиты и выполнение практически любых Безопасность приложений сегодня 80 Часть I операций. Повышению привилегий обычно присваивают оценку 10. В других ситуациях оценка зависит от ценности защищаемых данных. Для медицинс ких, финансовых и военных данных она обычно высока.

• Воспроизводимость (ReproducibiHty) — мера возможности реализации опасности. Некоторые бреши доступны постоянно (оценка — 10), другие — только в зависимости от ситуации, и их доступность непредсказуема, то есть нельзя наверняка знать, насколько успешной окажется атака. Бреши в устанав ливаемых по умолчанию функциях характеризуются высокой воспроизводи мостью. Такой показатель — радость для хакеров.

• Подверженность взлому (Exploitability) — мера усилий и квалификации, необходимых для атаки. Так, если се может реализовать неопытный програм мист на домашнем компьютере, ставим большую жирную десятку (10). Если же для ее проведения надо потратить 100 000 000 долларов, оценка опасности — 1. И еще: атака, для которой можно написать алгоритм [а значит, распростра нить в виде сценария среди вандалов-любителей (script kiddies)], также оце нивается в 10 баллов. Следует также учитывать необходимый для атаки уро вень аутентификации и авторизации в системе. Например, если это доступно любому удаленному анонимному пользователю, подобная опасность оценива ется 10 баллами. А вот атака, доступная только доверенному локальному пользо вателю, менее опасна, • Круг пользователей, попадающих под удар (Affected users) — доля пользо вателей, работа которых нарушается из-за успешной атаки. Оценка выполня ется на основе процентной доли: 100% всех пользователей соответствует оценка 10, а 10% — 1 балл. Иногда опасность становится реальной только в системе, сконфигурированной особым образом. Опять же, оценивайте влияние опас ности максимально удобным способом. Чрезвычайно важно проводить границу между сервером и клиентским компьютером: от ущерба, нанесенного серверу, пострадает больше клиентов и, возможно, другие сети. В этом случае балл зна чительно выше, чем оценка атаки только на клиентские компьютеры. Также не следует забывать о размерах рынка и абсолютном, а не только процентном, количестве пользователей. Один процент от 100 млн. пользователей — это все равно много.

• Вероятность обнаружения (Discoverability) — самая сложная для опреде ления оценка. Откровенно говоря, я полагаю, что любая опасность поддается реализации, поэтому выставляю всем по 10 баллов, а при ранжировании опас ностей учитываю другие показатели.

Суммарная DREAD-оценка равна арифметическому среднему всех оценок (то есть надо их просуммировать и поделить на 5). После вычисления риска всех опас ностей отсортируйте их в порядке убывания оценки, начиная с наибольшей. На пример, так:

Опасность №1: Просмотр конфиденциальных данных о зарплате при их пере даче через сеть 8 Потенциальный ущерб: просмотр личных данных о зарплате других пользователей — это серьезно 10 Воспроизводимость: воспроизводима на 100% ГЛАВА 4 Моделирование опасностей Подверженность взлому: злоумышленник должен находиться в одной с сервером или клиентом подсети или взломать маршрутизатор 10 Пользователи под ударом: все, в том числе и генеральный директор Возможность обнаружения: просто предположим, что атака обнаружива ется моментально Risk I J K h ^:(8+10 + 7 + 1 0 + 1 0 ) / 5 = 9 баллов из возможных 10 — это очень серьезная проблема, и устранять ее необходимо немедленно, а приложение нельзя устанавливать, пока опасность не снижена.

Внимание! В некоторых командах, где мне приходилось работать, учитывали также затраты денег и ресурсов на устранение последствий успешной атаки. Помните: пользователей не интересует, во что обойдется исправ ление, они просто не хотят подвергаться атакам! Не забывайте об этом!

Еще один, более гибкий, способ — инвентаризация различных параметров опасностей, грозящих системе и анализ их в плане внедрения. Он очень похож на способ, разработанный Кристофером Клаусом (Christopher W. Klaus) — осно вателем компании Internet Security Systems, для оценки уязвимых мест, обнаружен ных при применении продуктов этой компании. Вот некоторые вопросы, на ко торые следует ответить при рассмотрении опасностей:

• как реализуется атака: при локальном или удаленном доступе? Может ли зло умышленник атаковать, не имея локального доступа? Очевидно, что «удалс н ные» атаки опаснее «локальных»;

• каковы последствия реализации опасности? Если это повышение привилегий, то до какой степени? Существует ли проблема разглашения информации? Влечет ли разглашение информации захват привилегий;

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

Этот метод позволяет построить таблицу с оценками серьезности опасностей и перейти к устранению обнаруженных недостатков.

Объединяем все вместе: декомпозицию, дерево опасностей, методы STRIDE и DREAD Итак, как применять всю эту «кухню». Сначала путем функциональной декомпо зиции определяем объекты под угрозой, затем по методике STRIDE выявляем опас ности, грозящие каждому компоненту, далее с помощью дерева опасностей опре деляем, каким образом опасность превратится в уязвимое место и, наконец, ран жируем, например, по методике DREAD.

Применять STRIDE к дереву опасностей довольно просто. Для этого для каж дого компонента системы надо продумать ответы на следующие вопросы:

• поддается ли компонент подмене;

• возможно ли модифицировать компонент;

• удастся ли злоумышленнику уйти ненаказанным, если он откажется от своих действий;

• возможен ли просмотр компонента;

Безопасность приложений сегодня 82 Часть I удастся ли взломщику блокировать доступ к процессу или потоку данных;

может ли злоумышленник повысить свои полномочия, успешно атаковав процесс?

Анализ путей в дереве опасностей, или как из капель мелких неприятностей рождается море проблем Часто множество незначительных брешей в совокупности создают одну огромную дыру в защите. Поэтому при работе со сложной системой нуж но проверить все возможные пути к той или иной точке на DFD-диаграм м=е. В технике систему, дающую разные результаты при одном и том же на боре входных параметров, называют нелинейной. Поведение таких систем обычно зависит от пройденного пути: получаемый результат определяется тем, откуда начато движение. Похожие проблемы часто возникают в слож ных системах и при их взаимодействии, Во время кампании Windows Security Push я работал с группой, отвеча ющей за сложные системы, и мы частенько не сходились в оценке серьез ности обнаруженных опасностей. Подчас оказывалось, что причина разно гласий в различных предположениях относительно того, какими путями достигается конкретная точка на диаграмме. Степень серьезности пробле мы зависела от пути и, что особенно важно, от того, встречались ли на этом пути другие уязвимые места. Подумайте, может ли злоумышленник изменить путь передачи данных, запустив их по нестандартному или непредусмот ренному пути. Вот вам пример из обычной, некомпьютерной, жизни. До пустим, мне «кровь из носу> надо быть на утреннем совещании без опозда ния, ну а если опоздать, то не более, чем на полчаса. Расчленим процесс на этапы, чтобы выяснить, на каком возможен сбой и. какие сбои могут нало житься друг на друга.

• Будильник прозвенел? Если нет, то не проспал ли я больше, чем на минут?

• Благополучно ли я преодолел душ? Мог ведь поскользнуться и упасть. Если да, то я поранился или только расстроился?

• Автомобиль завелся? Если нет, то как я быстро поставлю его «на колеса* или придется ехать на другом?

• Пробка на дороге? Если да, то насколько ттжушая?

• Встреча с ГАИ? Если да, то как надолго?

Конечно, я с легкостью наверстываю время, упущенное из-за любой из этих проблем. Но представим себе, что мой будильник не прозвенел, я про спал лишние 5 минут, машина не завелась, и, проклиная все на свете, а по тратил еще 5 минут на поиск ключей от другой машины, затем меня оста новил инспектор и 15 минут выписывал мне штраф, затем еще 10 минут я проторчал в пробке. И все — я опоздал и меня ждут крупные неприятнос ти. Я часто замечал, что люди склонны отбрасывать опасности, которые по отдельности существенной проблемы не создавали. Поэтому обязательно анализируйте опасности с учетом того, каким путем вы добрались до рас сматриваемой точки. Подумайте, не сложатся ли несколько мелких непри ятностей в одну большую проблему.

ГЛАВА 4 Моделирование опасностей Вы наверняка заметите, что отдельные элементы DFD-диаграмм подвергают ся опасностям вполне определенного типа (табл. 4-3).

Таблица 4-3. Связь элементов DFD-диаграмм и категорий опасностей в модели STRIDE Затрагивает ли Затрагивает ли Затрагивает ли потоки Затрагивает ли хранилища внешние Тип процессы? данных? субъекты? данных?

опасности Да 3 Да Да 1 L, ( Ца • 1л 1., Да Да 1> Да Да Да Да Некоторые элементы этой таблицы следует пояснить.

• Опасность подмены объектов обычно подразумевает подмену пользователя (получение доступа к реквизитам, что одновременно является разглашением информации), процесса (замена процесса подложным, а это также опасность модификации данных) или сервера, • Изменение процесса означает замену соответствующего исполняемого файла или модификацию памяти процесса.

• Под опасностью разглашения информации в отношении процесса подразуме вается обратный анализ (reverse engineering) для раскрытия принципов его работы или извлечения секретной информации.

• Ко внешнему субъекту неприменимо понятие опасности разглашения инф' >р мации — разглашаться могут только данные о самом субъекте. Если вы CTOIK нулись с опасностью разглашения информации о пользователе, то вероятнее всего утечка в хранилище данных или процессе доступа к данным, • Невозможно ограничить доступ к внешнему субъекту напрямую — скорее все го злоумышленник ограничивает доступ к хранилищу данных, потоку дань ых или процессу, от которых зависит субъект.

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

В следующих таблицах (табл. 4-4 — 4-9) перечислены опасности, грозящие приложению расчета зарплаты. На рис. 4-8 и рис. 4-10 — 4-14 (они следуют пос Безопасность приложений сегодня Часть I ле таблиц) иллюстрируются деревья опасностей для случаев, описанных в табл. 4-4 — 4-9.

Таблица 4-4. Опасность № Просмотр конфиденциальных данных о зарплате Описание опасности при их передаче через сеть Объект под угрозой Ответ на запрос о заработной плате (5.0 -> 1.0) Разглашение информации Категория опасности Потенциальный ущерб: Риск Воспроизводимость: Подверженность взлому: Пользователи под ударом: Вероятность обнаружения: Общая оценка: Примечания Вероятнее всего атака исходит от злоумышленника, воору женного сетевым анализатором. Реализовать такую атаку просто, так как при этом не нужно себя обнаруживать, а времени, усилий и денег требуется очень мало.

Важно отметить опасность, грозящую коммутируемым се тям, так как многие полагают, что они защищены от прослу шивания трафика, но на самом деле это не так. Если не ве рите, почитайте статью «Why your switched network isn't secure* (Почему коммутируемые сети небезопасны) на сайте Таблица 4-5. Опасность № Описание опасности Загрузка хакером подложных Web-страниц и кода на сервер Объект под угрозой Web-страницы (7,0) и код Web-сервиса (8.0) Категория опасности Модификация данных Риск Потенциальный ущерб: Воспроизводимость: Подверженность взлому: Пользователи под ударом: Вероятность обнаружения: Общая оценка: 8, Примечания В утилите установки ПО всегда предусматриваются надеж ные механизмы аутентификации и авторизации. Так что единственной причиной загрузки Web-страниц могут стать просчеты администраторов при конфигурировании. (Под куп персонала считаем маловероятным) Таблица 4-6. Опасность № Описание опасности Блокирование взломщиком доступа к приложению Объект под угрозой Процесс обработки клиентских запросов Категория опасности Отказ в обслуживании Риск Потенциальный ущерб: ГЛАВА 4 Моделирование опасностей Таблица 4-6. (окончание) Описание опасности Блокирование взломщиком доступа к приложению Воспроизводимость: Подверженность взлому: Пользователи под ударом: Вероятность обнаружения: Общая оценка: 7. Примечания Другие части приложения также уязвимы для DoS-атак, од Eiam Web-сервер обработки клиентских запросов находится на «передовой», и поэтому его легче атаковать. Защитив э'т часть приложения, мы уменьшим до приемлемого уровня риск нападения на другие процессы.

Составляющая опасности 3.3: проблема схожа с пробле мой декартова соединения (Cartesian join). Результат тако 'о соединения в запросе к БД — набор всех возможных комби наций всех таблиц, указанных в SQL-запросе. Так, если не указать ограничивающих условий, то при выполнении де картова соединения трех таблиц, одна из которых содержит 650000 записей, вторая — 113 000, а третья — 75 100, пользователь получит результат из 5 1б5 095 000 000 000 за писей.

Составляющая опасности 3.4: Исчерпание свободного дискового пространства представляет реальную опасность.

Если для приложения, управляющего процессом доступа к данным (11.0), не окажется свободного места на диске, оно не запустится, так как в процессе работы оно создает массу временных файлов. Так как все запросы регистрируются в файлах журналов, злоумышленник, направив миллионы запросов (возможно, в рамках распределенной DoS-атаки), добьется переполнения диска и аварийного завершения приложения Таблица 4-7. Опасность № Модификация взломщиком данных о заработной плате Описание опасности Объект под угрозой Данные о заработной плате (12.0) Категория опасности Модификация данных и возможность разглашения инфор мации Риск Потенциальный ущерб: Воспроизводимость: Подверженность взлому: Пользователи под ударом: Вероятность обнаружения: Общая оценка: Опасность 43 заключается в возможности доступа к изме Примечания ненным данным о зарплате при пересылке через сеть от ад министративной консоли (2.0) к процесс}' администрати •-.

ной политики, а затем к хранилищу с данными по зарлла ге (12.0). Как видно на DFD-диаграмме (рис. 4-5). выполняется два перехода через границы машин 86 Безопасность приложений сегодня Часть I Таблица 4-8. Опасность № Повышение взломщиком собственных привилегий за счет Описание опасности изъянов в процессе обработки клиентских запросов Объект под угрозой Сервис обработки клиентских запросов (5.0) Категория опасности Повышение привилегий Риск Потенциальный ущерб: Воспроизводимость;

Подверженность взлому: Пользователи под ударом: Вероятность обнаружения: Общая оценка: Примечания Рассматриваемый объект под угрозой выполняется в про цессе Web-сервера, а код — в контексте локальной системы.

Это означает, что любой недружественный код, выполняе мый в контексте Web-сервера, обладает на компьютере при вилегиями Local System. Воспроизводимость и затраты на организацию низки, потому что единственно возможный способ взлома — эксплуатация уязвимых мест в защите про цесса Web-сервера.

Пострадавших от атаки пользователей немного, так как по ражается только сервер. Впрочем, об этом можно говорить с натяжкой, так ок от взлома сервера страдают практичес ки все пользователи Таблица 4-9. Опасность № Подмена компьютера, на котором выполняется Описание опасности процесс обработки клиентских запросов Объект под угрозой Сервис обработки клиентских запросов (5.0) Категория опасности Подмена сетевого объекта Риск Потенциальный ущерб: Воспроизводимость: Подверженность взлому: Пользователи под ударом: Вероятность обнаружения: Общая оценка: 6, Примечания Есть несколько способов вывести «законный» компьютер из сети: *в лоб» аннулировать его как сетевой объект (переиме нование или выключение питания) или сделать его недо ступным [атаки на DNS или «затопление* (flood) пакетами] Моделирование опасностей ГЛАВА Опасность Ne Загрузка подложных Web-страниц Подкуп Web-разработчика или администратора, имеющих доступ к странице В этом случае проблема намного серьезнее!

Рис. 4-10. Дерево опасностей для опасности № Опасность № Блокирование доступ к приложению 3. Создание множества «Замусоривание» пространства на даем путем переполнения долго исполняющихся журнальных файлов запросов 3.2.1 3.2. Физический доступ Незаметное проникновение в помещение в обход охранника в комнату с компьютером В этом случае проблема намного] серьезнее!

Рис. 4-11. Дерево опасностей для опасности № Часть I Безопасность приложений сегодня Опасность № Модификация данных о заработной плате 4. Подкуп администратора, Модификация данных чтобы тот изменил из процесса административной политики данные В этом случае проблема намного серьезнее!

Использовать SSL Рис. 4-12. Дерево опасностей для опасности № Опасность Na Повышение привилегий за счет изъянов Web-сервера 5. администратора, нтоёы тот установил хакерское 5.2, Ошибка администратора, позволяющая взломщику загрузить свой код на Web-сервер Рис. 4-13- Дерево опасностей для опасности № ГЛАВА 4 Моделирование опасностей Опасность № Подмена одного или нескольких Web-серверов 6.1 6. Создание сервера Вывод из строя с именем, идентичным "настоящего" сервера имени Web-cepeepafOB) 6.2.3 6,2. 6.2. Переполнение сервер! Отключение питаний Переименование "битыми- IP-пакеташ сервера сервера,..-- •" - -* 6.2,4. 6.2.3. 6.2.3. Получение доступа Получение доступа Физический к линии питания доступ к выключателю питания серверной комнаты к компьютеру Необходим физический доступ в запретную^ зону T*w#^ Рис. 4-14. Дерево опасностей для опасности №б Подсчет суммарного риска Как оценить общий риск для системы при условии, что какая-либо второстепен ная опасность реализована в виде атаки? При расчете общей оценки по выбран ной вами методике рассматривайте наиболее вероятный путь атаки (иначе гов' > ря, путь наименьшего сопротивления). Взгляните на рис. 4-10. Видно, что опас ность 2.3 маловероятна и. следовательно, характеризуется низким риском, так K;

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

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

Так что наиболее вероятной возможностью остается опасность так называе мой «атаки нулевого дня* (zero-day attack) на сервер, то есть в те периоды, когда уязвимое место в продукте уже обнаружено, но компания-разработчик еще не ус пела выпустить «заплату*, а хакеры уже оперативно соорудили exploit, Безопасность приложений сегодня 90 Часть I DREAD-оценка опасности является результатом прохождения дерева именно по пути наименьшего сопротивления.

Внимание! Определите в дереве опасностей путь наименьшего сопротивления, Это не значит, что взломщики не пойдут по другим маршрутам — пой дут, не сомневайтесь, — но первым скорее всего выберут самый легкий путь.

Повторение моделирования опасности Напомню вам все этапы процесса моделирования опасностей еще раз, чтобы вы убедились, что полностью усвоили материал.

• Этап 1. Выполните декомпозицию приложения на объекты под угрозой по одному из методов анализа, например с помощью DFD-диаграмм. В DFD-ди аграммах объектами под угрозой считаются все источники данных, процес сы, потоки данных, внешние субъекты и действующие лица.

• Этап 2. По методике STRIDE определите опасности, возможные для каждого объекта под угрозой. Они становятся вершинами деревьев опасностей, для каж дого объекта под угрозой строится одно дерево.

• Этап 3. В зависимости от ситуации постройте одно или более деревьев опас ностей для каждого объекта под угрозой, • Этап 4. Оцените риск безопасности для каждого дерева опасностей по мето дике DREAD или аналогичному методу ранжирования опасностей, • Этап 5. Отсортируйте опасности в порядке убывания риска.

Закончив с этим, переходят к следующему этапу — определению методов реа гирования на опасности.

Реакция на опасность При анализе опасностей и выборе способа противостояния им возможны четы ре варианта поведения:

• ничего не предпринимать:

• предупредить пользователей:

• устранить причину опасности вместе с частью приложения;

• устранить причины, из-за которых система подвергается опасности.

Вариант 1: ничего не предпринимать Первый вариант — оставить все как есть — редко оказывается удачным, потому что проблема в приложении остается и существует вероятность ее обнаружения, так что вам все равно рано или поздно придется устранять брешь. Такой подход пагубен для бизнеса и неприемлем для клиентов, ведь вы подвергаете их опасно сти. Если вы все-таки решили ничего не предпринимать, то по крайней мере по заботьтесь об отключении опасной функции в конфигурации по умолчднию. Но мой вам совет: попытайтесь все же выбрать один из следующих вариантов, ГЛАВА 4 Моделирование опасностей Вариант 2: предупредить пользователей Вторая возможность — оповестить пользователей о проблеме и предоставить км самим решать, применять ли небезопасную функцию. В Microsoft Internet Infor mation Services (IIS) некоторые проблемы решены именно так: когда админист ратор выбирает базовую аутентификацию (basic authentication), появляется ди алоговое окно с предупреждением, что пароли пользователей будут пересылать ся в незашифрованном виде, если только их не защитить другим способом, на пример средствами протокола SSL/TLS.

Pages:     | 1 || 3 | 4 |   ...   | 12 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.