Меню

19 смертных грехов угрожающих безопасности программ как не допустить типичных ошибок

Моей потрясающей семье. Ничто не может сравниться с ощущением, которое испытываешь, когда приходишь домой и в ответ на вопрос «Кто дома, ребятки?» слышишь, как два голоска хором кричат: «Папа!»

– Майкл

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

– Дэвид

Маме. Она привила мне интеллектуальное любопытство и всегда была со мной рядом.

-Джон

Об авторах

Майкл Ховард работает старшим менеджером по безопасности программного обеспечения в группе по обеспечению безопасности в Microsoft Corp. Является соавтором удостоенной различных наград книги «Writing Secure Code» (Разработка безопасного кода). Он также совместно с коллегами ведет колонку «Basic Training» в журнале «ШЕЕ Security & Privacy Magazine» и является одним из авторов документа «Processes to Produce Secure Software» («Процессы в производстве безопасного программного обеспечения»), выпущенного организацией National Cyber Security Partnership для Министерства национальной безопасности (Department of Homeland Security). Будучи архитектором «Жизненного цикла разработки безопасного программного обеспечения» в Microsoft, Майкл посвящает большую часть времени выработке и внедрению передового опыта создания безопасных программ, которыми в конечном итоге будут пользоваться обычные люди.

Дэвид Лебланк, доктор философии, в настоящее время работает главным архитектором программ в компании Webroot Software. До этого он занимал должность архитектора подсистемы безопасности в подразделении Microsoft, занимающемся разработкой Microsoft Office, стоял у истоков инициативы Trustworthy Computing и работал «белым хакером» в группе безопасности сетей в Microsoft. Дэвид является соавтором книг «Writing Secure Code» и «Assessing Network Secu–rity» («Оценка безопасности сети»), а также многочисленных статей. В погожие дни он любит конные прогулки вместе со своей женой Дженнифер.

Джон Виега первым дал описание 19 серьезных просчетов при написании программ. Этот труд привлек внимание средств массовой информации и лег в основу настоящей книги. Джон является основателем и техническим директором компании Secure Software (www.securesoftware.com). Он один из авторов первой книги по безопасности программного обеспечения «Building Secure Software» («Создание безопасного программного обеспечения»), а также книг «Network Security and Cryptography with OpenSSL» («Безопасность и криптографические методы в сетях. Подход на основе библиотеки OpenSSL») и «Secure Programming СоокЬоок» («Рецепты для написания безопасных программ»). Он является основным автором процесса CLASP, призванного включить элементы безопасности в цикл разработки программ. Джон написал и сопровождает несколько относящихся к безопасности программ с открытыми исходными текстами. Раньше Джон занимал должности адъюнкт–профессора в техническом колледже штата Вирджиния и старшего научного сотрудника в Институте стратегии кибепространства (Cyberspace Policy Institute). Джон хорошо известен своими работами в области безопасности программ и криптографии, а в настоящее время он трудится над стандартами безопасности для сетей и программ.

О научных редакторах

Алан Крассовски работает главным инженером по безопасности программного обеспечения в компании Symantec Corporation. Он возглавляет группу по безопасности продуктов, в задачу которой входит оказание помощи другим группам разработчиков в плане внедрения безопасных технологий, которые сокращают риски и способствуют завоеванию доверия со стороны клиентов. За последние 20 лет Алан работал над многими коммерческими программными проектами. До присоединения к Symantec он руководил разработками, был инженером–программистом и оказывал консультативные услуги многим компаниям, занимающим лидирующее положение в отрасли, в частности Microsoft, IBM, Tektronix, Step Technologies. Screenplay Systems, Quark и Continental Insurance. Он получил научную степень бакалавра в области вычислительной техники в Рочестерском технологическом институте, штат Нью–Йорк.

Дэвид А. Уилер много лет занимается совершествованием практических методов разработки программ для систем с повышенным риском, в том числе особо крупных и нуждающихся в высокой степени безопасности. Он соавтор и соредактор книги «Software Inspection: An Industry Best Practice» («Инспекция программ: передовой опыт»), а также книг «Ada95: The Lovelace Tutorial» и «Secure Programming for Linux and UNIX HOWTO» («Рецепты безопасного программирования для Linux и UNIX»). Проживает в Северной Вирджинии.

Предисловие

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

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

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

Устранение всех рисков, относящихся к безопасности, – нереальная задача при современном уровне развития систем разработки. У этой проблемы так много аспектов, что, даже для того чтобы просто оставаться в курсе дел, нужно посвящать этому все свое время. Что уж говорить о владении предметом в совершенстве!

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

В бытность начальником отдела в Министерстве национальной безопасности я попросил Джона Виегу составить перечень 19 «грехов» программиста. Первоначальный список был призван поставить корпоративный мир в известность о тех ошибках, которые чаще всего угрожают безопасности, но он не был составлен в форме рецептов. А эта книга именно такова. В ней приводится список проблем, от которых организации–разработчики должны защищаться в первую очередь, и даются рекомендации, как не допустить самого возникновения этих проблем. В книге также показано, как выявить подобные ошибки: посредством анализа кода или тестирования. Описание приемов и методик краткое и точное, авторы четко формулируют, что надо, а чего никогда не надо делать. Авторы проделали огромную работу, чтобы представить вашему вниманию список наиболее распространенных дефектов, от которых страдает безопасность современных программ. Надеюсь, что сообщество разработчиков оценит эту книгу и воспользуется ей для устранения недетерминизма и рисков, с которыми мы постоянно сталкиваемся.

Амит Йоран,

бывший начальник

отдела национальной кибербезопасности

Министерства национальной безопасности

Грейт Фоллс, Вирджиния,

21 мая 2005 г.

Благодарности

Эта книга – косвенный результат дальновидности Амита Йорана. Мы благодарны ему за то, что во время работы в Министерстве национальной безопасности (и позже) он делал все возможное, чтобы привлечь внимание к проблемам безопасности программного обеспечения. Мы также выражаем признательность следующим специалистам в области безопасности за усердие, с которым они рецензировали черновики отдельных глав, за их мудрость и за откровенные комментарии: Дэвиду Рафаэлю (David Raphael), Марку Кэрфи (Mark Curphy), Рудольфу Араю (Rudolph Arauj), Алану Крассовски (Alan Krassowski), Дэвиду Уилеру (David Wheeler) и Биллу Хильфу (Bill Hilf). Эта книга не состоялась бы без настойчивости сотрудников издательства McGraw–Hill. Большое спасибо трем «Дж»: Джейн Браунлоу (Jane Brownlow), Дженнифер Хауш (Jennifer Housh) и Джоди Маккензи Qody McKenzie).

Введение

В 2004 году Амит Йоран, тогда начальник отдела национальной кибербезопасности Министерства национальной безопасности США, объявил, что около 95% всех дефектов программ, относящихся к безопасности, проистекают из 19 типичных ошибок, природа которых вполне понятна. Мы не станем подвергать сомнению ваши интеллектуальные способности и объяснять важность безопасного программного обеспечения в современном взаимосвязанном мире, вы и так все понимаете, но приведем основные принципы поиска и исправления наиболее распространенных ошибок в вашем собственном коде.

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

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

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

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

□ Краткость. Это следствие предыдущего правила: сосредоточившись исключительно на фактах, мы смогли сделать книгу небольшой по объему. Это введение тоже не будет многословным.

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

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

Структура книги

В каждой главе описывается один «смертный грех». Вообще–то они никак не упорядочены, но самые гнусные мы разместили в начале книги. Главы разбиты на разделы:

□ «В чем состоит грех» – краткое введение, в котором объясняется, почему данное деяние считается грехом;

□ «Как происходит грехопадение» – описывается суть проблемы; принципиальная ошибка, которая доводит до греха;

□ «Подверженные греху языки» – перечень языков, подверженных данному греху;

□ «Примеры ошибочного кода» – конкретные примеры ошибок в программах, написанных на разных языках и работающих на разных платформах;

□ «Где искать ошибку» – на что нужно прежде всего обращать внимание при поиске в программе подобных ошибок;

□ «Выявление ошибки на этапе анализа кода» тут все понятно: как найти грехи в своем коде. Мы понимаем, что разработчики – люди занятые, поэтому старались писать этот раздел коротко и по делу;

□ «Тестирование» – описываются инструменты и методики тестирования, которые позволят обнаружить признаки рассматриваемого греха;

□ «Примеры из реальной жизни» – реальные примеры данного греха, взятые из базы данных типичных уязвимостей и брешей (Common Vulnerabilities and Exposures – CVE) (www.cve.mitre.org). с сайта BugTraq (www.securityfocus.com) или базы данных уязвимостей в программах с открытыми исходными текстами (Open Source Vulnerability Database) (www.osvdb.org). В каждом случае мы приводим свои комментарии. Примечание: пока мы работали над этой книгой, рассматривался вопрос об отказе с 15 октября 2005 года от номеров CAN в базе данных CVE и переходе исключительно на номера CVE. Если это случится, то все ссылки на номер ошибки «CAN…» следует заменить ссылкой на соответствующий номер CVE. Например, если вы не сможете найти статью CAN–2004–0029 (ошибка Lotus Notes для Linux), попробуйте поискать CVE–2004–0029;

□ «Искупление греха» – как исправить ошибку, чтобы избавиться от греха. И в этом случае мы демонстрируем варианты для разных языков;

□ «Дополнительные защитные меры» – другие меры, которые можно предпринять. Они не исправляют ошибку, но мешают противнику воспользоваться потенциальным дефектом, если вы ее все–таки допустите;

□ «Другие ресурсы» – это небольшая книжка, поэтому мы даем ссылки на другие источники информации: главы книг, статьи и сайты;

□ «Резюме» – это неотъемлемая часть главы, предполагается, что вы будете к ней часто обращаться. Здесь приводятся списки рекомендуемых, нерекомендуемых и возможных действий при написании нового или анализе существующего кода. Не следует недооценивать важность этого раздела! Содержание всех Резюме сведено воедино в Приложении В.

Кому предназначена эта книга

Эта книга адресована всем разработчикам программного обеспечения. В ней описаны наиболее распространенные ошибки, приводящие к печальным последствиям, а равно способы их устранения до того, как программа будет передана заказчику. Вы найдете здесь полезный материал вне зависимости от того, на каком языке пишете, будь то С, С++, Java, С#, ASP, ASP.NET, Visual Basic, PHP, Perl или JSP. Она применима к операционным системам Windows, Linux, Apple Mac OS X, OpenBSD и Solaris, а равно к самым разнообразным платформам: «толстым» клиентам, «тонким» клиентам или пользователям Web. Честно говоря, безопасность не зависит ни от языка, ни от операционной системы, ни от платформы. Если ваш код небезопасен, то пользователи беззащитны перед атакой.

Какие главы следует прочитать

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

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

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

□ Всем рекомендуется ознакомиться с грехами 6, 12 и 13.

□ Если вы программируете наязыках C/C++, то обязаны прочесть о грехах 1, 2 и З.

□ Если вы программируете для Web с использованием таких технологий, как JSP, ASP, ASP.NET, PHP, CGI или Perl, то познакомьтесь с грехами 7 и 9.

□ Если вы создаете приложения для работы с базами данных, например Oracle, MySQL, DB2 или SQL Server, прочтите о грехе 4.

□ Если вы разрабатываете сетевые системы (клиент–серверные, через Web и прочие), не проходите мимо грехов 5, 8, 10, 14 и 15.

□ Если в вашем приложении каким–то образом используется криптография или пароли, обратите внимание на грехи 8, 10, 11, 17 и 18.

□ Если ваша программа работает в ОС Linux, Mac OS X или UNIX, следует прочесть о грехе 16.

□ Если с вашим приложением будут работать неопытные пользователи, взгляните на описание греха 19.

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

Майкл Ховард, Дэвид Лебланк, Джон Виега, июль 2005 г.

Грех 1.
Переполнение буфера

В чем состоит грех

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

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

Результатом переполнения буфера может стать что угодно – от краха программы до получения противником полного контроля над приложением, а если приложение запущено от имени пользователя с высоким уровнем доступа (root, Administrator или System), то и над всей операционной системой и другими пользователями. Если рассматриваемое приложение – это сетевая служба, то ошибка может привести к распространению червя. Первый получивший широкую известность Интернет–червь эксплуатировал ошибку в сервере finger, он так и назывался – «finger–червь Роберта Т. Морриса» (или просто «червь Морриса»). Казалось бы, что после того как в 1988 году Интернет был поставлен на колени, мы уже должны научиться избегать переполнения буфера, но и сейчас нередко появляются сообщения о такого рода ошибках в самых разных программах.

Быть может, кто–то думает, что такие ошибки свойственны лишь небрежным и беззаботным программистам. Однако на самом деле эта проблема сложна, решения не всегда тривиальны, и всякий, кто достаточно часто программировал на С или С++, почти наверняка хоть раз да допускал нечто подобное. Автор этой главы, который учит других разработчиков, как писать безопасный код, сам однажды передал заказчику программу, в которой было переполнение на одну позицию (off–by–one overflow). Даже самые лучшие, самые внимательные программисты допускают ошибки, но при этом они знают, насколько важно тщательно тестировать программу, чтобы эти ошибки не остались незамеченными.

Подверженные греху языки

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

В языках более высокого уровня, появившихся позже, программист уже не имеет прямого доступа к памяти, хотя за это и приходится расплачиваться производительностью. В такие языки, как Java, С# и Visual Basic, уже встроены строковый тип, массивы с контролем выхода за границы и запрет на прямой доступ к памяти (в стандартном режиме). Кто–то может сказать, что в таких языках переполнение буфера невозможно, но правильнее было бы считать, что оно лишь гораздо менее вероятно. Ведь в большинстве своем эти языки реализованы на С или С++, а ошибка в реализации может стать причиной переполнения буфера. Еще один потенциальный источник проблемы заключается в том, что на какой–то стадии все эти высокоуровневые языки должны обращаться к операционной системе, а уж она–то почти наверняка написана на С или С++. Язык С# позволяет обойти стандартные механизмы .NET, объявив небезопасный участок с помощью ключевого слова unsafe. Да, это упрощает взаимодействие с операционной системой и библиотеками, написанными на C/C++, но одновременно открывает возможность допустить обычные для C/C++ ошибки. Даже если вы программируете преимущественно на языках высокого уровня, не отказывайтесь от тщательного контроля данных, передаваемых внешним библиотекам, если не хотите пасть жертвой содержащихся в них ошибок.

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

Майкл Ховард, Дэвид Лебланк, Джон Виега

19 смертных грехов, угрожающих безопасности программ. Как не допустить типичных ошибок

Моей потрясающей семье. Ничто не может сравниться с ощущением, которое испытываешь, когда приходишь домой и в ответ на вопрос «Кто дома, ребятки?» слышишь, как два голоска хором кричат: «Папа!»

– Майкл

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

– Дэвид

Маме. Она привила мне интеллектуальное любопытство и всегда была со мной рядом.

-Джон

Об авторах

Майкл Ховард работает старшим менеджером по безопасности программного обеспечения в группе по обеспечению безопасности в Microsoft Corp. Является соавтором удостоенной различных наград книги «Writing Secure Code» (Разработка безопасного кода). Он также совместно с коллегами ведет колонку «Basic Training» в журнале «ШЕЕ Security & Privacy Magazine» и является одним из авторов документа «Processes to Produce Secure Software» («Процессы в производстве безопасного программного обеспечения»), выпущенного организацией National Cyber Security Partnership для Министерства национальной безопасности (Department of Homeland Security). Будучи архитектором «Жизненного цикла разработки безопасного программного обеспечения» в Microsoft, Майкл посвящает большую часть времени выработке и внедрению передового опыта создания безопасных программ, которыми в конечном итоге будут пользоваться обычные люди.

Дэвид Лебланк, доктор философии, в настоящее время работает главным архитектором программ в компании Webroot Software. До этого он занимал должность архитектора подсистемы безопасности в подразделении Microsoft, занимающемся разработкой Microsoft Office, стоял у истоков инициативы Trustworthy Computing и работал «белым хакером» в группе безопасности сетей в Microsoft. Дэвид является соавтором книг «Writing Secure Code» и «Assessing Network Secu–rity» («Оценка безопасности сети»), а также многочисленных статей. В погожие дни он любит конные прогулки вместе со своей женой Дженнифер.

Джон Виега первым дал описание 19 серьезных просчетов при написании программ. Этот труд привлек внимание средств массовой информации и лег в основу настоящей книги. Джон является основателем и техническим директором компании Secure Software (www.securesoftware.com). Он один из авторов первой книги по безопасности программного обеспечения «Building Secure Software» («Создание безопасного программного обеспечения»), а также книг «Network Security and Cryptography with OpenSSL» («Безопасность и криптографические методы в сетях. Подход на основе библиотеки OpenSSL») и «Secure Programming СоокЬоок» («Рецепты для написания безопасных программ»). Он является основным автором процесса CLASP, призванного включить элементы безопасности в цикл разработки программ. Джон написал и сопровождает несколько относящихся к безопасности программ с открытыми исходными текстами. Раньше Джон занимал должности адъюнкт–профессора в техническом колледже штата Вирджиния и старшего научного сотрудника в Институте стратегии кибепространства (Cyberspace Policy Institute). Джон хорошо известен своими работами в области безопасности программ и криптографии, а в настоящее время он трудится над стандартами безопасности для сетей и программ.

О научных редакторах

Алан Крассовски работает главным инженером по безопасности программного обеспечения в компании Symantec Corporation. Он возглавляет группу по безопасности продуктов, в задачу которой входит оказание помощи другим группам разработчиков в плане внедрения безопасных технологий, которые сокращают риски и способствуют завоеванию доверия со стороны клиентов. За последние 20 лет Алан работал над многими коммерческими программными проектами. До присоединения к Symantec он руководил разработками, был инженером–программистом и оказывал консультативные услуги многим компаниям, занимающим лидирующее положение в отрасли, в частности Microsoft, IBM, Tektronix, Step Technologies. Screenplay Systems, Quark и Continental Insurance. Он получил научную степень бакалавра в области вычислительной техники в Рочестерском технологическом институте, штат Нью–Йорк.

Дэвид А. Уилер много лет занимается совершествованием практических методов разработки программ для систем с повышенным риском, в том числе особо крупных и нуждающихся в высокой степени безопасности. Он соавтор и соредактор книги «Software Inspection: An Industry Best Practice» («Инспекция программ: передовой опыт»), а также книг «Ada95: The Lovelace Tutorial» и «Secure Programming for Linux and UNIX HOWTO» («Рецепты безопасного программирования для Linux и UNIX»). Проживает в Северной Вирджинии.

Предисловие

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

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

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

Устранение всех рисков, относящихся к безопасности, – нереальная задача при современном уровне развития систем разработки. У этой проблемы так много аспектов, что, даже для того чтобы просто оставаться в курсе дел, нужно посвящать этому все свое время. Что уж говорить о владении предметом в совершенстве!

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

В бытность начальником отдела в Министерстве национальной безопасности я попросил Джона Виегу составить перечень 19 «грехов» программиста. Первоначальный список был призван поставить корпоративный мир в известность о тех ошибках, которые чаще всего угрожают безопасности, но он не был составлен в форме рецептов. А эта книга именно такова. В ней приводится список проблем, от которых организации–разработчики должны защищаться в первую очередь, и даются рекомендации, как не допустить самого возникновения этих проблем. В книге также показано, как выявить подобные ошибки: посредством анализа кода или тестирования. Описание приемов и методик краткое и точное, авторы четко формулируют, что надо, а чего никогда не надо делать. Авторы проделали огромную работу, чтобы представить вашему вниманию список наиболее распространенных дефектов, от которых страдает безопасность современных программ. Надеюсь, что сообщество разработчиков оценит эту книгу и воспользуется ей для устранения недетерминизма и рисков, с которыми мы постоянно сталкиваемся.

Амит Йоран,

бывший начальник

отдела национальной кибербезопасности

Министерства национальной безопасности

Грейт Фоллс, Вирджиния,

21 мая 2005 г.

Благодарности

Эта книга – косвенный результат дальновидности Амита Йорана. Мы благодарны ему за то, что во время работы в Министерстве национальной безопасности (и позже) он делал все возможное, чтобы привлечь внимание к проблемам безопасности программного обеспечения. Мы также выражаем признательность следующим специалистам в области безопасности за усердие, с которым они рецензировали черновики отдельных глав, за их мудрость и за откровенные комментарии: Дэвиду Рафаэлю (David Raphael), Марку Кэрфи (Mark Curphy), Рудольфу Араю (Rudolph Arauj), Алану Крассовски (Alan Krassowski), Дэвиду Уилеру (David Wheeler) и Биллу Хильфу (Bill Hilf). Эта книга не состоялась бы без настойчивости сотрудников издательства McGraw–Hill. Большое спасибо трем «Дж»: Джейн Браунлоу (Jane Brownlow), Дженнифер Хауш (Jennifer Housh) и Джоди Маккензи Qody McKenzie).

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

Загрузка…

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

Рассмотрены уязвимости на языках C/C++, C#, Java, Visual Basic, Visual Basic .NET, Perl, Python в операционных системах Windows, Unix, Linux, Mac OS, Novell Netware. Авторы бестселлеров Майкл Ховард и Дэвид Лебланк, обучающие программистов в Microsoft, как писать безопасный код, объединили усилия с Джоном Виега, человеком, который сформулировал 19 смертных грехов программиста, и решили написать это руководство.

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

5,600 просмотров всего, 1 просмотров сегодня

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

Моей потрясающей семье. Ничто не может сравниться с ощущением, которое испытываешь, когда приходишь домой и в ответ на вопрос «Кто дома, ребятки?» слышишь, как два голоска хором кричат: «Папа!»

Майкл

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

Дэвид

Маме. Она привила мне интеллектуальное любопытство и всегда была со мной рядом.

-Джон

Об авторах

Майкл Ховард работает старшим менеджером по безопасности программного обеспечения в группе по обеспечению безопасности в Microsoft Corp. Является соавтором удостоенной различных наград книги «Writing Secure Code» (Разработка безопасного кода). Он также совместно с коллегами ведет колонку «Basic Training» в журнале «ШЕЕ Security & Privacy Magazine» и является одним из авторов документа «Processes to Produce Secure Software» («Процессы в производстве безопасного программного обеспечения»), выпущенного организацией National Cyber Security Partnership для Министерства национальной безопасности (Department of Homeland Security). Будучи архитектором «Жизненного цикла разработки безопасного программного обеспечения» в Microsoft, Майкл посвящает большую часть времени выработке и внедрению передового опыта создания безопасных программ, которыми в конечном итоге будут пользоваться обычные люди.

Дэвид Лебланк, доктор философии, в настоящее время работает главным архитектором программ в компании Webroot Software. До этого он занимал должность архитектора подсистемы безопасности в подразделении Microsoft, занимающемся разработкой Microsoft Office, стоял у истоков инициативы Trustworthy Computing и работал «белым хакером» в группе безопасности сетей в Microsoft. Дэвид является соавтором книг «Writing Secure Code» и «Assessing Network Security» («Оценка безопасности сети»), а также многочисленных статей. В погожие дни он любит конные прогулки вместе со своей женой Дженнифер.

Джон Виега первым дал описание 19 серьезных просчетов при написании программ. Этот труд привлек внимание средств массовой информации и лег в основу настоящей книги. Джон является основателем и техническим директором компании Secure Software (www.securesoftware.com). Он один из авторов первой книги по безопасности программного обеспечения «Building Secure Software» («Создание безопасного программного обеспечения»), а также книг «Network Security and Cryptography with OpenSSL» («Безопасность и криптографические методы в сетях. Подход на основе библиотеки OpenSSL») и «Secure Programming СоокЬоок» («Рецепты для написания безопасных программ»). Он является основным автором процесса CLASP, призванного включить элементы безопасности в цикл разработки программ. Джон написал и сопровождает несколько относящихся к безопасности программ с открытыми исходными текстами. Раньше Джон занимал должности адъюнктпрофессора в техническом колледже штата Вирджиния и старшего научного сотрудника в Институте стратегии кибепространства (Cyberspace Policy Institute). Джон хорошо известен своими работами в области безопасности программ и криптографии, а в настоящее время он трудится над стандартами безопасности для сетей и программ.

О научных редакторах

Алан Крассовски работает главным инженером по безопасности программного обеспечения в компании Symantec Corporation. Он возглавляет группу по безопасности продуктов, в задачу которой входит оказание помощи другим группам разработчиков в плане внедрения безопасных технологий, которые сокращают риски и способствуют завоеванию доверия со стороны клиентов. За последние 20 лет Алан работал над многими коммерческими программными проектами. До присоединения к Symantec он руководил разработками, был инженеромпрограммистом и оказывал консультативные услуги многим компаниям, занимающим лидирующее положение в отрасли, в частности Microsoft, IBM, Tektronix, Step Technologies. Screenplay Systems, Quark и Continental Insurance. Он получил научную степень бакалавра в области вычислительной техники в Рочестерском технологическом институте, штат НьюЙорк.

Дэвид А. Уилер много лет занимается совершествованием практических методов разработки программ для систем с повышенным риском, в том числе особо крупных и нуждающихся в высокой степени безопасности. Он соавтор и соредактор книги «Software Inspection: An Industry Best Practice» («Инспекция программ: передовой опыт»), а также книг «Ada95: The Lovelace Tutorial» и «Secure Programming for Linux and UNIX HOWTO» («Рецепты безопасного программирования для Linux и UNIX»). Проживает в Северной Вирджинии.

Предисловие

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

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

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

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

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

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

Амит Йоран,

Эта книга необходима всем разработчикам программного обеспечения, независимо от платформы, языка или вида приложений. В ней рассмотрены 19 грехов, угрожающих безопасности программ, и показано, как от них избавиться. Рассмотрены уязвимости на языках C/C++, C#, Java, Visual Basic, Visual Basic.NET, Perl, Python в операционных системах Windows, Unix, Linux, Mac OS, Novell Netware. Авторы издания, Майкл Ховард и Дэвид Лебланк, обучают программистов, как писать безопасный код в компании Microsoft. На различных примерах продемонстрированы как сами ошибки, так и способы их исправления и защиты от них. Если вы программист, то вам просто необходимо прочесть эту книгу.

Оглавление

Введение

В 2004 году Амит Йоран, тогда начальник отдела национальной кибербезопасности Министерства национальной безопасности США, объявил, что около 95% всех дефектов программ, относящихся к безопасности, проистекают из 19 типичных ошибок, природа которых вполне понятна. Мы не станем подвергать сомнению ваши интеллектуальные способности и объяснять важность безопасного программного обеспечения в современном взаимосвязанном мире, вы и так все понимаете, но приведем основные принципы поиска и исправления наиболее распространенных ошибок в вашем собственном коде.

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

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

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

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

□ Краткость. Это следствие предыдущего правила: сосредоточившись исключительно на фактах, мы смогли сделать книгу небольшой по объему. Это введение тоже не будет многословным.

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

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

Структура книги

В каждой главе описывается один «смертный грех». Вообще–то они никак не упорядочены, но самые гнусные мы разместили в начале книги. Главы разбиты на разделы:

□ «В чем состоит грех» — краткое введение, в котором объясняется, почему данное деяние считается грехом;

□ «Как происходит грехопадение» — описывается суть проблемы; принципиальная ошибка, которая доводит до греха;

□ «Подверженные греху языки» — перечень языков, подверженных данному греху;

□ «Примеры ошибочного кода» — конкретные примеры ошибок в программах, написанных на разных языках и работающих на разных платформах;

□ «Где искать ошибку» — на что нужно прежде всего обращать внимание при поиске в программе подобных ошибок;

□ «Выявление ошибки на этапе анализа кода» тут все понятно: как найти грехи в своем коде. Мы понимаем, что разработчики — люди занятые, поэтому старались писать этот раздел коротко и по делу;

□ «Тестирование» — описываются инструменты и методики тестирования, которые позволят обнаружить признаки рассматриваемого греха;

□ «Примеры из реальной жизни» — реальные примеры данного греха, взятые из базы данных типичных уязвимостей и брешей (Common Vulnerabilities and Exposures — CVE) (www.cve.mitre.org). с сайта BugTraq (www.securityfocus.com) или базы данных уязвимостей в программах с открытыми исходными текстами (Open Source Vulnerability Database) (www.osvdb.org). В каждом случае мы приводим свои комментарии. Примечание: пока мы работали над этой книгой, рассматривался вопрос об отказе с 15 октября 2005 года от номеров CAN в базе данных CVE и переходе исключительно на номера CVE. Если это случится, то все ссылки на номер ошибки «CAN…» следует заменить ссылкой на соответствующий номер CVE. Например, если вы не сможете найти статью CAN–2004–0029 (ошибка Lotus Notes для Linux), попробуйте поискать CVE–2004–0029;

□ «Искупление греха» — как исправить ошибку, чтобы избавиться от греха. И в этом случае мы демонстрируем варианты для разных языков;

□ «Дополнительные защитные меры» — другие меры, которые можно предпринять. Они не исправляют ошибку, но мешают противнику воспользоваться потенциальным дефектом, если вы ее все–таки допустите;

□ «Другие ресурсы» — это небольшая книжка, поэтому мы даем ссылки на другие источники информации: главы книг, статьи и сайты;

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

Кому предназначена эта книга

Эта книга адресована всем разработчикам программного обеспечения. В ней описаны наиболее распространенные ошибки, приводящие к печальным последствиям, а равно способы их устранения до того, как программа будет передана заказчику. Вы найдете здесь полезный материал вне зависимости от того, на каком языке пишете, будь то С, С++, Java, С#, ASP, ASP.NET, Visual Basic, PHP, Perl или JSP. Она применима к операционным системам Windows, Linux, Apple Mac OS X, OpenBSD и Solaris, а равно к самым разнообразным платформам: «толстым» клиентам, «тонким» клиентам или пользователям Web. Честно говоря, безопасность не зависит ни от языка, ни от операционной системы, ни от платформы. Если ваш код небезопасен, то пользователи беззащитны перед атакой.

Какие главы следует прочитать

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

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

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

□ Всем рекомендуется ознакомиться с грехами 6, 12 и 13.

□ Если вы программируете наязыках C/C++, то обязаны прочесть о грехах 1, 2 и З.

□ Если вы программируете для Web с использованием таких технологий, как JSP, ASP, ASP.NET, PHP, CGI или Perl, то познакомьтесь с грехами 7 и 9.

□ Если вы создаете приложения для работы с базами данных, например Oracle, MySQL, DB2 или SQL Server, прочтите о грехе 4.

□ Если вы разрабатываете сетевые системы (клиент–серверные, через Web и прочие), не проходите мимо грехов 5, 8, 10, 14 и 15.

□ Если в вашем приложении каким–то образом используется криптография или пароли, обратите внимание на грехи 8, 10, 11, 17 и 18.

□ Если ваша программа работает в ОС Linux, Mac OS X или UNIX, следует прочесть о грехе 16.

□ Если с вашим приложением будут работать неопытные пользователи, взгляните на описание греха 19.

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

Майкл Ховард, Дэвид Лебланк, Джон Виега, июль 2005 г.

Смотрите также

19 смертных грехов, угрожающих безопасности программ. Как не допустить типичных ошибок

Автор: umkaS от 23-03-2022, 09:52, Коментариев: 0

Категория: КНИГИ » ПРОГРАММИРОВАНИЕ

Название: 19 смертных грехов, угрожающих безопасности программ: Как не допустить типичных ошибок
Автор: Лебланк Дэвид, Ховард Майкл, Виега Джон
Издательство: ДMK
Год: 2006
Формат: PDF/DjVu
Страниц: 288
Размер: 17 MB
Язык: Русский

Эта книга необходима всем разработчикам программного обеспечения, независимо от платформы, языка или вида приложений. В ней рассмотрены 19 грехов, угрожающих безопасности программ, и показано, как от них избавиться. Рассмотрены уязвимости на языках C/C++, C#, Java, Visual Basic, Visual Basic.NET, Perl, Python в операционных системах Windows, Unix, Linux, Mac OS, Novell Netware. Авторы издания, Майкл Ховард и Дэвид Лебланк, обучают программистов, как писать безопасный код в компании Microsoft. На различных примерах продемонстрированы как сами ошибки, так и способы их исправления и защиты от них. Если вы программист, то вам просто необходимо прочесть эту книгу.


Нашел ошибку? Есть жалоба? Жми!
Пожаловаться администрации

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

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

Эта книга необходима всем разработчикам программного обеспечения, независимо от платформы, языка или вида приложений. В ней рассмотрены 19 грехов, угрожащих безопасности программ, и показано как от них избавиться. Рассмотрены уязвимости на языках C/C++, C#, Java, Visual Basic, Visual Basic .NET, Perl, Python в операционных системах Windows, Unix, Linux, Mac OS, Novell Netware. Авторы издания, Майкл Ховард и Дэвид Лебланк, обучают программистов как писать безопасный код в компании Microsoft. На различных примерах продемонстрированы как сами ошибки, так и способы их исправления и защиты от них. Если вы — программист, то вам просто необходимо прочесть эту книгу.

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

Майкл Ховард, Дэвид Лебланк, Джон Виега

19 смертных грехов,
угрожающих безопасности программ

Как не допустить типичных ошибок

Предисловие Амита Йорана
DEADLY
SINS

OF
SOFTWARE
SECURITY

Programming Flaws and
How to Fix Them

MICHAEL HOWARD
DAVID LEBLANC
JOHN VIEGA

McGrawHill/Osborne
New York    Chicago    San Francisco
Lisbon    London    Madrid    Mexico City
Milan    New Delhi    San Juan    Seoul
Singapore    Sydney    Toronto
СМЕРТНЫХ

ГРЕХОВ,

УГРОЖАЮЩИХ

БЕЗОПАСНОСТИ
ПРОГРАММ

Как не допустить типичных ошибок

Москва

МАЙКЛ ХОВАРД
ДЭВИД ЛЕБЛАНК

ДЖОН ВИЕГА
УДК 004.4
ББК 32.973.26018.2

М97

Ховард М., Лебланк Д., Виега Д.

Х68
19 смертных грехов, угрожающих безопасности программ.
Как не допустить типичных ошибок . – М.: ДМК Пресс. – 288 с.: ил.

ISBN 597060027Х

Эта книга необходима всем разработчикам программного обеспечения,

независимо от платформы, языка или вида приложений. В ней рассмотрены 
19 грехов, угрожащих безопасности программ, и показано как от них избавиться. 
Рассмотрены уязвимости на языках C/C++, C#, Java, Visual Basic,
Visual Basic .NET, Perl, Python в операционных системах Windows, Unix,
Linux, Mac OS, Novell Netware. Авторы издания, Майкл Ховард и Дэвид
Лебланк, обучают программистов как писать безопасный код в компании
Microsoft. На различных примерах продемонстрированы как сами ошибки,
так и способы их исправления и защиты от них. Если вы – программист, то
вам просто необходимо прочесть эту книгу.

УДК 004.4
ББК 32.973.26018.2

Original English language edition published by McGrawHill Companies. Copyright © by

McGrawHill Companies. All rights reserved.

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

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

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

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

ISBN 0-07-226085-8 (àíãë.)
Copyright © by McGrawHill Companies.

ISBN 5-9706-0027-Õ
© Ïåðåâîä íà ðóññêèé ÿçûê, îôîðìëåíèå, èçäàíèå,

Èçäàòåëüñêèé Äîì ÄÌÊ-ïðåññ
Моей потрясающей семье.
Ничто не может сравниться с ощущением,
которое испытываешь, когда приходишь домой
и в ответ на вопрос «Кто дома, ребятки?» слышишь,
как два голоска хором кричат: «Папа!»
– Майкл

Моему отцу, который объяснил мне,
почему надо постоянно учиться
и принимать новые вызовы.
– Дэвид

Маме. Она привила мне интеллектуальное
любопытство и всегда была со мной рядом.
– Джон
Содержание

Об авторах .................................................................................... 18

О научных редакторах .................................................................. 19

Предисловие ................................................................................ 20

Благодарности ............................................................................. 22

Введение....................................................................................... 23

Структура книги.......................................................................... 24
Кому предназначена эта книга ................................................... 25
Какие главы следует прочитать .................................................. 25

Грех 1. Переполнение буфера ................................................ 26

В чем состоит грех ..................................................................... 26
Подверженные греху языки ........................................................ 27
Как происходит грехопадение .................................................... 27
Греховность C/C++................................................................. 31
Родственные грехи................................................................. 33
Где искать ошибку ...................................................................... 33
Выявление ошибки на этапе анализа кода ................................. 33
Тестирование ............................................................................. 34
Примеры из реальной жизни ...................................................... 35
CVE19990042 ....................................................................... 35
CVE20000389 – CVE20000392 ........................................... 35
CVE20020842, CVE20030095, CAN20030096 ................... 35
CAN20030352....................................................................... 36
Искупление греха ....................................................................... 37
Замена опасных функций работы со строками....................... 37
Следите за выделениями памяти ........................................... 37
Проверьте циклы и доступ к массивам ................................... 37
Пользуйтесь строками в стиле C++, а не C ............................. 37
Пользуйтесь STLконтейнерами вместо статических
массивов ................................................................................ 38
Содержание
Содержание
Содержание
Содержание
Содержание

Пользуйтесь инструментами анализа .................................... 38
Дополнительные защитные меры............................................... 38
Защита стека.......................................................................... 39
Запрет исполнения в стеке и куче .......................................... 39
Другие ресурсы .......................................................................... 39
Резюме....................................................................................... 40

Грех 2. Ошибки, связанные с форматной строкой ............ 42

В чем состоит грех ..................................................................... 42
Подверженные греху языки ........................................................ 42
Как происходит грехопадение .................................................... 43
Греховность C/C++................................................................. 45
Родственные грехи................................................................. 45
Где искать ошибку ...................................................................... 46
Выявление ошибки на этапе анализа кода ................................. 46
Тестирование ............................................................................. 46
Примеры из реальной жизни ...................................................... 47
CVE20000573 ....................................................................... 47
CVE20000844 ....................................................................... 47
Искупление греха ....................................................................... 47
Искупление греха в C/C++ ...................................................... 48
Дополнительные защитные меры............................................... 48
Другие ресурсы .......................................................................... 48
Резюме....................................................................................... 48

Грех 3. Переполнение целых чисел ....................................... 49

В чем состоит грех ..................................................................... 49
Подверженные греху языки ........................................................ 49
Как происходит грехопадение .................................................... 49
Греховность C и C++ .............................................................. 50
Поразрядные операции ......................................................... 55
Греховность C# ...................................................................... 55
Греховность Visual Basic и Visual Basic .NET ........................... 56
Греховность Java.................................................................... 57
Греховность Perl..................................................................... 58
Где искать ошибку ...................................................................... 59
Выявление ошибки на этапе анализа кода ................................. 59
C/C++ ..................................................................................... 59
C# .......................................................................................... 61
Java ........................................................................................ 62
Visual Basic и Visual Basic .NET ................................................ 62
Содержание
Содержание
Содержание
Содержание
Содержание

Perl ......................................................................................... 62
Тестирование ............................................................................. 62
Примеры из реальной жизни ...................................................... 62
Ошибка в интерпретаторе Windows Script позволяет
выполнить произвольный код ................................................ 63
Переполнение целого в конструкторе объекта
SOAPParameter....................................................................... 63
Переполнение кучи в HTRдокументе, передаваемом
поблочно, может скомпрометировать Webсервер ................ 63
Искупление греха ....................................................................... 64
Дополнительные защитные меры............................................... 66
Другие ресурсы .......................................................................... 66
Резюме....................................................................................... 66
Не рекомендуется .................................................................. 66

Грех 4. Внедрение SQLкоманд .............................................. 67

В чем состоит грех ..................................................................... 67
Подверженные греху языки ........................................................ 67
Как происходит грехопадение .................................................... 68
Греховность C# ...................................................................... 68
Греховность PHP .................................................................... 69
Греховность Perl/CGI.............................................................. 69
Греховность Java.................................................................... 70
Греховность SQL .................................................................... 71
Родственные грехи................................................................. 72
Где искать ошибку ...................................................................... 72
Выявление ошибки на этапе анализа кода ................................. 72
Тестирование ............................................................................. 73
Примеры из реальной жизни ...................................................... 75
CAN20040348....................................................................... 75
CAN20020554....................................................................... 75
Искупление греха ....................................................................... 75
Проверяйте все входные данные ........................................... 76
Никогда не применяйте конкатенацию для построения
SQLпредложений .................................................................. 76
Дополнительные защитные меры............................................... 79
Другие ресурсы .......................................................................... 79
Резюме....................................................................................... 80

Грех 5. Внедрение команд....................................................... 82

В чем состоит грех ..................................................................... 82
Содержание
Содержание
Содержание
Содержание
Содержание

Подверженные греху языки ........................................................ 82
Как происходит грехопадение .................................................... 82
Родственные грехи................................................................. 84
Где искать ошибку ...................................................................... 84
Выявление ошибки на этапе анализа кода ................................. 84
Тестирование ............................................................................. 86
Примеры из реальной жизни ...................................................... 86
CAN20011187....................................................................... 86
CAN20020652....................................................................... 87
Искупление греха ....................................................................... 87
Контроль данных .................................................................... 87
Если проверка не проходит .................................................... 90
Дополнительные защитные меры............................................... 90
Другие ресурсы .......................................................................... 91
Резюме....................................................................................... 91

Грех 6. Пренебрежение обработкой ошибок....................... 92

В чем состоит грех ..................................................................... 92
Подверженные греху языки ........................................................ 92
Как происходит грехопадение .................................................... 92
Раскрытие излишней информации ........................................ 92
Игнорирование ошибок ......................................................... 93
Неправильная интерпретация ошибок ................................... 93
Бесполезные возвращаемые значения .................................. 94
Обработка не тех исключений, что нужно ............................... 94
Обработка всех исключений .................................................. 94
Греховность C/C++................................................................. 94
Греховность C/C++ в Windows ................................................ 95
Греховность C++ .................................................................... 96
Греховность C#, VB.NET и Java .............................................. 96
Родственные грехи................................................................. 97
Где искать ошибку ...................................................................... 97
Выявление ошибки на этапе анализа кода ................................. 97
Тестирование ............................................................................. 97
Примеры из реальной жизни ...................................................... 98
CAN20040077 do_mremap в ядре Linux................................. 98
Искупление греха ....................................................................... 98
Искупление греха в C/C++ ...................................................... 98
Искупление греха в C#, VB.NET и Java.................................... 99
Другие ресурсы .......................................................................... 99
Резюме..................................................................................... 100
10
10
10
10
Содержание
Содержание
Содержание
Содержание
Содержание

Грех 7. Кросссайтовые сценарии....................................... 101

В чем состоит грех ................................................................... 101
Подверженные греху языки ...................................................... 101
Как происходит грехопадение .................................................. 101
Греховное ISAPIрасширение или фильтр на C/C++ ............. 102
Греховность ASP .................................................................. 103
Греховность форм ASP.NET .................................................. 103
Греховность JSP................................................................... 103
Греховность PHP .................................................................. 103
Греховность Perlмодуля CGI.pm.......................................... 103
Греховность modperl........................................................... 104
Где искать ошибку .................................................................... 104
Выявление ошибки на этапе анализа кода ............................... 104
Тестирование ........................................................................... 105
Примеры из реальной жизни .................................................... 106
Уязвимость IBM Lotus Domino для атаки
с кросссайтовым сценарием и внедрением HTML .............. 106
Ошибка при контроле входных данных в сценарии isqlplus,
входящем в состав Oracle HTTP Server, позволяет
удаленному пользователю провести атаку
с кросссайтовым сценарием .............................................. 106
CVE20020840 ..................................................................... 107
Искупление греха ..................................................................... 107
Искупление греха в ISAPIрасширениях и фильтрах
на C/C++ .............................................................................. 107
Искупление греха в ASP ....................................................... 108
Искупление греха в ASP.NET ................................................. 108
Искупление греха в JSP ........................................................ 108
Искупление греха в PHP ....................................................... 110
Искупление греха в Perl/CGI ................................................. 110
Искупление греха в modperl ................................................ 111
Замечание по поводу HTMLкодирования ............................ 111
Дополнительные защитные меры............................................. 112
Другие ресурсы ........................................................................ 112
Резюме..................................................................................... 113

Грех 8. Пренебрежение защитой сетевого трафика ....... 114

В чем состоит грех ................................................................... 114
Подверженные греху языки ...................................................... 114
Как происходит грехопадение .................................................. 115
Родственные грехи............................................................... 117
11
11
11
11
Содержание
Содержание
Содержание
Содержание
Содержание

Где искать ошибку .................................................................... 117
Выявление ошибки на этапе анализа кода ............................... 118
Тестирование ........................................................................... 121
Примеры из реальной жизни .................................................... 121
TCP/IP .................................................................................. 121
Протоколы электронной почты............................................. 122
Протокол E*Trade ................................................................. 122
Искупление греха ..................................................................... 122
Рекомендации низкого уровня ............................................. 123
Дополнительные защитные меры............................................. 126
Другие ресурсы ........................................................................ 126
Резюме..................................................................................... 126

Грех 9. Применение загадочных URL и скрытых
полей форм ............................................................................... 128

В чем состоит грех ................................................................... 128
Подверженные греху языки ...................................................... 128
Как происходит грехопадение .................................................. 128
Загадочные URL ................................................................... 128
Скрытые поля формы ........................................................... 129
Родственные грехи............................................................... 129
Где искать ошибку .................................................................... 130
Выявление ошибки на этапе анализа кода ............................... 130
Тестирование ........................................................................... 131
Примеры из реальной жизни .................................................... 131
CAN20001001..................................................................... 132
Модификация скрытого поля формы в программе
MaxWebPortal ....................................................................... 132
Искупление греха ..................................................................... 132
Противник просматривает данные ....................................... 132
Противник воспроизводит данные ....................................... 133
Противник предсказывает данные ....................................... 135
Противник изменяет данные ................................................ 136
Дополнительные защитные меры............................................. 137
Другие ресурсы ........................................................................ 137
Резюме..................................................................................... 137

Грех 10. Неправильное применение SSL и TLS ................. 138

В чем состоит грех ................................................................... 138
Подверженные греху языки ...................................................... 138
Как происходит грехопадение .................................................. 139
12
12
12
12
Содержание
Содержание
Содержание
Содержание
Содержание

Родственные грехи............................................................... 142
Где искать ошибку .................................................................... 142
Выявление ошибки на этапе анализа кода ............................... 143
Тестирование ........................................................................... 144
Примеры из реальной жизни .................................................... 145
Почтовые клиенты ................................................................ 145
Webбраузер Safari ............................................................... 146
SSLпрокси Stunnel .............................................................. 146
Искупление греха ..................................................................... 147
Выбор версии протокола ..................................................... 147
Выбор семейства шифров ................................................... 148
Проверка сертификата......................................................... 149
Проверка имени хоста.......................................................... 150
Проверка отзыва сертификата ............................................. 151
Дополнительные защитные меры............................................. 153
Другие ресурсы ........................................................................ 153
Резюме..................................................................................... 154

Грех 11. Использование слабых систем
на основе паролей ................................................................... 155

В чем состоит грех ................................................................... 155
Подверженные греху языки ...................................................... 155
Как происходит грехопадение .................................................. 155
Родственные грехи............................................................... 158
Где искать ошибку .................................................................... 158
Выявление ошибки на этапе анализа кода ............................... 158
Политика управления сложностью пароля ........................... 158
Смена и переустановка пароля ............................................ 159
Протоколы проверки паролей .............................................. 159
Ввод и хранение паролей ..................................................... 160
Тестирование ........................................................................... 160
Примеры из реальной жизни .................................................... 161
CVE20051505 ..................................................................... 161
CVE20050432 ..................................................................... 162
Ошибка в TENEX ................................................................... 162
Кража у Пэрис Хилтон .......................................................... 163
Искупление греха ..................................................................... 163
Многофакторная аутентификация ....................................... 163
Хранение и проверка паролей.............................................. 164
Рекомендации по выбору протокола .................................... 167
Рекомендации по переустановке паролей ........................... 168
13
13
13
13
Содержание
Содержание
Содержание
Содержание
Содержание

Рекомендации по выбору пароля ......................................... 169
Прочие рекомендации ......................................................... 170
Дополнительные защитные меры............................................. 170
Другие ресурсы ........................................................................ 170
Резюме..................................................................................... 170
Не рекомендуется ................................................................ 171
Стоит подумать .................................................................... 171

Грех 12. Пренебрежение безопасным хранением
и защитой данных.................................................................... 172

В чем состоит грех ................................................................... 172
Подверженные греху языки ...................................................... 172
Как происходит грехопадение .................................................. 172
Слабый контроль доступа к секретным данным ................... 172
Греховность элементов управления доступом ..................... 174
Встраивание секретных данных в код .................................. 176
Родственные грехи............................................................... 177
Где искать ошибку .................................................................... 177
Выявление ошибки на этапе анализа кода ............................... 178
Тестирование ........................................................................... 178
Примеры из реальной жизни .................................................... 181
CVE20000100 ..................................................................... 181
CAN20021590..................................................................... 181
CVE19990886 ..................................................................... 181
CAN20040311..................................................................... 182
CAN20040391..................................................................... 182
Искупление греха ..................................................................... 182
Использование технологий защиты, предоставляемых
операционной системой ...................................................... 183
Искупление греха в C/C++ для Windows 2000
и последующих версий......................................................... 183
Искупление греха в ASP.NET версии 1.1 и старше ................ 185
Искупление греха в C# на платформе .NET Framework 2.0 ... 185
Искупление греха в C/C++ для Mac OS X версии v10.2
и старше............................................................................... 186
Искупление греха без помощи операционной системы
(или «храните секреты от греха подальше») ......................... 186
Замечание по поводу Java и Java KeyStore ........................... 188
Дополнительные защитные меры............................................. 189
Другие ресурсы ........................................................................ 190
Резюме..................................................................................... 191
14
14
14
14
Содержание
Содержание
Содержание
Содержание
Содержание

Грех 13. Утечка информации ................................................ 192

В чем состоит грех ................................................................... 192
Подверженные греху языки ...................................................... 192
Как происходит грехопадение .................................................. 193
Побочные каналы ................................................................. 193
Слишком много информации! .............................................. 194
Модель безопасности информационного потока ................. 196
Греховность C# (и других языков)........................................ 198
Родственные грехи............................................................... 198
Где искать ошибку .................................................................... 199
Выявление ошибки на этапе анализа кода ............................... 199
Тестирование ........................................................................... 200
Имитация кражи ноутбука .................................................... 200
Примеры из реальной жизни .................................................... 200
Атака с хронометражем Дэна Бернстайна на шифр AES ...... 201
CAN20051411..................................................................... 201
CAN20051133..................................................................... 201
Искупление греха ..................................................................... 202
Искупление греха в C# (и других языках) ............................. 203
Учет локальности.................................................................. 203
Дополнительные защитные меры............................................. 203
Другие ресурсы ........................................................................ 204
Резюме..................................................................................... 204

Грех 14. Некорректный доступ к файлам........................... 206

В чем состоит грех ................................................................... 206
Подверженные греху языки ...................................................... 206
Как происходит грехопадение .................................................. 207
Греховность C/C++ в Windows .............................................. 207
Греховность C/C++............................................................... 208
Греховность Perl................................................................... 208
Греховность Python .............................................................. 208
Родственные грехи............................................................... 209
Где искать ошибку .................................................................... 209
Выявление ошибки на этапе анализа кода ............................... 209
Тестирование ........................................................................... 210
Примеры из реальной жизни .................................................... 210
CAN20050004..................................................................... 210
CAN20050799..................................................................... 211
CAN20040452 и CAN20040448 ......................................... 211
CVE20040115 Microsoft Virtual PC для Macintosh ................ 211
15
15
15
15
Содержание
Содержание
Содержание
Содержание
Содержание

Искупление греха ..................................................................... 211
Искупление греха в Perl ........................................................ 212
Искупление греха в C/C++ для Unix ...................................... 212
Искупление греха в C/C++ для Windows ............................... 213
Получение места нахождения временного каталога
пользователя ....................................................................... 213
Искупление греха в .NET ...................................................... 213
Дополнительные защитные меры............................................. 214
Другие ресурсы ........................................................................ 214
Резюме..................................................................................... 214

Грех 15. Излишнее доверие к системе разрешения
сетевых имен ............................................................................ 215

В чем состоит грех ................................................................... 215
Подверженные греху языки ...................................................... 215
Как происходит грехопадение .................................................. 215
Греховные приложения ........................................................ 218
Родственные грехи............................................................... 218
Где искать ошибку .................................................................... 219
Выявление ошибки на этапе анализа кода ............................... 219
Тестирование ........................................................................... 220
Примеры из реальной жизни .................................................... 220
CVE20020676 ..................................................................... 220
CVE19990024 ..................................................................... 221
Искупление греха ..................................................................... 221
Другие ресурсы ........................................................................ 222
Резюме..................................................................................... 223

Грех 16. Гонки........................................................................... 224

В чем состоит грех ................................................................... 224
Подверженные греху языки ...................................................... 224
Как происходит грехопадение .................................................. 224
Греховность кода ................................................................. 226
Родственные грехи............................................................... 227
Где искать ошибку .................................................................... 227
Выявление ошибки на этапе анализа кода ............................... 228
Тестирование ........................................................................... 229
Примеры из реальной жизни .................................................... 229
CVE20011349 ..................................................................... 229
CAN20031073..................................................................... 230
CVE20040849 ..................................................................... 230
16
16
16
16
Содержание
Содержание
Содержание
Содержание
Содержание

Искупление греха ..................................................................... 230
Дополнительные защитные меры............................................. 232
Другие ресурсы ........................................................................ 232
Резюме..................................................................................... 233

Грех 17. Неаутентифицированный обмен ключами ........ 234

В чем состоит грех ................................................................... 234
Подверженные греху языки ...................................................... 234
Как происходит грехопадение .................................................. 234
Родственные грехи............................................................... 236
Где искать ошибку .................................................................... 236
Выявление ошибки на этапе анализа кода ............................... 236
Тестирование ........................................................................... 237
Примеры из реальной жизни .................................................... 237
Атака с «человеком посередине» на Novell Netware .............. 237
CAN20040155..................................................................... 238
Искупление греха ..................................................................... 238
Дополнительные защитные меры............................................. 239
Другие ресурсы ........................................................................ 239
Резюме..................................................................................... 239

Грех 18. Случайные числа криптографического
качества ..................................................................................... 240

В чем состоит грех ................................................................... 240
Подверженные греху языки ...................................................... 240
Как происходит грехопадение .................................................. 240
Греховность некриптографических генераторов ................. 241
Греховность криптографических генераторов ..................... 242
Греховность генераторов истинно случайных чисел ............ 242
Родственные грехи............................................................... 243
Где искать ошибку .................................................................... 243
Выявление ошибки на этапе анализа кода ............................... 244
Когда следует использовать случайные числа ..................... 244
Выявление мест, где применяются PRNGгенераторы ........ 244
Правильно ли затравлен CRNGгенератор ........................... 245
Тестирование ........................................................................... 245
Примеры из реальной жизни .................................................... 246
Браузер Netscape ................................................................. 246
Проблемы в OpenSSL ........................................................... 246
Искупление греха ..................................................................... 247
17
17
17
17
Содержание
Содержание
Содержание
Содержание
Содержание

Windows ................................................................................ 247
Код для .NET......................................................................... 248
Unix ...................................................................................... 248
Java ...................................................................................... 249
Повторное воспроизведение потока случайных чисел ......... 250
Дополнительные защитные меры............................................. 250
Другие ресурсы ........................................................................ 250
Резюме..................................................................................... 251
Стоит подумать .................................................................... 251

Грех 19. Неудобный интерфейс ........................................... 252

В чем состоит грех ................................................................... 252
Подверженные греху языки ...................................................... 252
Как происходит грехопадение .................................................. 252
Каков круг ваших пользователей? ........................................ 253
Минное поле: показ пользователям информации
о безопасности .................................................................... 254
Родственные грехи............................................................... 254
Где искать ошибку .................................................................... 255
Выявление ошибки на этапе анализа кода ............................... 255
Тестирование ........................................................................... 255
Примеры из реальной жизни .................................................... 256
Аутентификация сертификата в протоколе SSL/TLS ............ 256
Установка корневого сертификата в Internet Explorer 4.0 ..... 257
Искупление греха ..................................................................... 257
Делайте интерфейс пользователя простым и понятным ...... 258
Принимайте за пользователей решения,
касающиеся безопасности................................................... 258
Упрощайте избирательное ослабление политики
безопасности ....................................................................... 259
Ясно описывайте последствия ............................................. 260
Помогайте пользователю предпринять действия................. 262
Предусматривайте централизованное управление.............. 263
Другие ресурсы ........................................................................ 263
Резюме..................................................................................... 264

Приложение A. Соответствие между 19 смертными
грехами и «10 ошибками» OWASP ........................................ 265

Приложение B. Сводка рекомендаций ............................... 266

Предметный указатель .......................................................... 276
Об авторах

Майкл Ховард работает старшим менеджером по безопасности программного обеспечения 
в группе по обеспечению безопасности в Microsoft Corp. Является соавтором 
удостоенной различных наград книги «Writing Secure Code» (Разработка безопасного 
кода). Он также совместно с коллегами ведет колонку «Basic Training»
в журнале «IEEE Security & Privacy Magazine» и является одним из авторов документа «
Processes to Produce Secure Software» («Процессы в производстве безопасного 
программного обеспечения»), выпущенного организацией National Cyber
Security Partnership для Министерства национальной безопасности (Department
of Homeland Security). Будучи архитектором «Жизненного цикла разработки безопасного 
программного обеспечения» в Microsoft, Майкл посвящает большую
часть времени выработке и внедрению передового опыта создания безопасных
программ, которыми в конечном итоге будут пользоваться обычные люди.
Дэвид Лебланк, доктор философии, в настоящее время работает главным архитектором 
программ в компании Webroot Software. До этого он занимал должность 
архитектора подсистемы безопасности в подразделении Microsoft, занимающемся 
разработкой Microsoft Office, стоял у истоков инициативы Trustworthy
Computing и работал «белым хакером» в группе безопасности сетей в Microsoft.
Дэвид является соавтором книг «Writing Secure Code» и «Assessing Network Secu-
rity» («Оценка безопасности сети»), а также многочисленных статей. В погожие
дни он любит конные прогулки вместе со своей женой Дженнифер.
Джон Виега первым дал описание 19 серьезных просчетов при написании программ. 
Этот труд привлек внимание средств массовой информации и лег в основу
настоящей книги. Джон является основателем и техническим директором компании 
Secure Software (www.securesoftware.com). Он один из авторов первой книги
по безопасности программного обеспечения «Building Secure Software» («Создание 
безопасного программного обеспечения»), а также книг «Network Security and
Cryptography with OpenSSL» («Безопасность и криптографические методы в сетях. 
Подход на основе библиотеки OpenSSL») и «Secure Programming Cookbook»
(«Рецепты для написания безопасных программ»). Он является основным автором 
процесса CLASP, призванного включить элементы безопасности в цикл разработки 
программ. Джон написал и сопровождает несколько относящихся к безопасности 
программ с открытыми исходными текстами. Раньше Джон занимал
должности адъюнктпрофессора в техническом колледже штата Вирджиния и
старшего научного сотрудника в Институте стратегии кибепространства (Cyber-
space Policy Institute). Джон хорошо известен своими работами в области безопасности 
программ и криптографии, а в настоящее время он трудится над стандартами 
безопасности для сетей и программ.
О научных редакторах

Алан Крассовски работает главным инженером по безопасности программного
обеспечения в компании Symantec Corporation. Он возглавляет группу по безопасности 
продуктов, в задачу которой входит оказание помощи другим группам
разработчиков в плане внедрения безопасных технологий, которые сокращают
риски и способствуют завоеванию доверия со стороны клиентов. За последние
20 лет Алан работал над многими коммерческими программными проектами. До
присоединения к Symantec он руководил разработками, был инженеромпрограм-
мистом и оказывал консультативные услуги многим компаниям, занимающим
лидирующее положение в отрасли, в частности Microsoft, IBM, Tektronix, Step
Technologies. Screenplay Systems, Quark и Continental Insurance. Он получил научную 
степень бакалавра в области вычислительной техники в Рочестерском технологическом 
институте, штат НьюЙорк.
Дэвид А. Уилер много лет занимается совершествованием практических методов 
разработки программ для систем с повышенным риском, в том числе особо
крупных и нуждающихся в высокой степени безопасности. Он соавтор и соредактор 
книги «Software Inspection: An Industry Best Practice» («Инспекция программ:
передовой опыт»), а также книг «Ada95: The Lovelace Tutorial» и «Secure Program-
ming for Linux and UNIX HOWTO» («Рецепты безопасного программирования
для Linux и UNIX»). Проживает в Северной Вирджинии.
Предисловие
Предисловие
Предисловие
Предисловие
Предисловие

Предисловие

В основе теории компьютеров лежит предположение о детерминированном поведении 
машин. Обычно мы ожидаем, что компьютер будет вести себя так, как мы
его запрограммировали. На самом деле это лишь приближенное допущение. Современные 
компьютеры общего назначения и их программное обеспечение стали
настолько сложными, что между щелчком по кнопке мыши и видимым результатом 
лежит множество программных слоев. И мы вынуждены полагаться на то, что
все они работают правильно.
Любой слой программного обеспечения может содержать ошибки, изза которых 
оно работает не так, как хотел автор, или, по крайней мере, не соответствует
ожиданиям пользователя. Эти ошибки вносят в систему неопределенность, что
может приводить к серьезным последствиям с точки зрения безопасности. Проявляться 
они могут поразному: от простого краха системы, и тогда ошибку можно
использовать, чтобы вызвать отказ от обслуживания, до переполнения буфера,
позволяющего противнику выполнить в системе произвольный код.
Коль скоро поведение программных систем недетерминировано изза ошибок, 
то самые лучшие идеи по их защите – не более чем гипотезы. Мы можем воздвигать 
межсетевые экраны, реализовывать технологии защиты от переполнения
буфера на уровне ОС, применять самые разнообразные методики, но все это никоим 
образом не изменит фундаментальную парадигму безопасности. И лишь за
счет радикального улучшения качества программ и сокращения числа ошибок мы
можем надеяться на успешность попыток обеспечить безопасность программного
обеспечения.
Устранение всех рисков, относящихся к безопасности, – нереальная задача
при современном уровне развития систем разработки. У этой проблемы так много
аспектов, что, даже для того чтобы просто оставаться в курсе дел, нужно посвящать 
этому все свое время. Что уж говорить о владении предметом в совершенстве!

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

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

Амит Йоран,
бывший начальник
отдела национальной кибербезопасности
Министерства национальной безопасности
Грейт Фоллс, Вирджиния,
21 мая 2005 г.

Предисловие
Предисловие
Предисловие
Предисловие
Предисловие
Благодарности

Эта книга – косвенный результат дальновидности Амита Йорана. Мы благодарны 
ему за то, что во время работы в Министерстве национальной безопасности
(и позже) он делал все возможное, чтобы привлечь внимание к проблемам безопасности 
программного обеспечения. Мы также выражаем признательность следующим 
специалистам в области безопасности за усердие, с которым они рецензировали 
черновики отдельных глав, за их мудрость и за откровенные комментарии:
Дэвиду Рафаэлю (David Raphael), Марку Кэрфи (Mark Curphy), Рудольфу Араю
(Rudolph Arauj), Алану Крассовски (Alan Krassowski), Дэвиду Уилеру (David
Wheeler) и Биллу Хильфу (Bill Hilf). Эта книга не состоялась бы без настойчивости 
сотрудников издательства McGrawHill. Большое спасибо трем «Дж»: Джейн
Браунлоу (Jane Brownlow), Дженнифер Хауш (Jennifer Housh) и Джоди Маккензи (
Jody McKenzie).

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • 1962 ошибка леново error
  • 19561 ошибка фольксваген пассат б5