Дэвид Лебланк , Майкл Ховард , Джон Виега - 19 смертных грехов, угрожающих безопасности программ
Название: | 19 смертных грехов, угрожающих безопасности программ | |
Автор: | Дэвид Лебланк , Майкл Ховард , Джон Виега | |
Жанр: | Другие языки и системы программирования, Учебники и самоучители по компьютеру, Компьютерная безопасность, Современные российские издания, Литература ХXI века (эпоха Глобализации экономики), .NET Framework, Basic, Visual Basic, VB Script, VBA и т.п., C, C++, C#, PHP, Python, Java, Java Script | |
Изадано в серии: | неизвестно | |
Издательство: | неизвестно | |
Год издания: | - | |
ISBN: | неизвестно | |
Отзывы: | 1 комментарий | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "19 смертных грехов, угрожающих безопасности программ"
Эта книга необходима всем разработчикам программного обеспечения, независимо от платформы, языка или вида приложений. В ней рассмотрены 19 грехов, угрожающих безопасности программ, и показано, как от них избавиться. Рассмотрены уязвимости на языках C/C++, C#, Java, Visual Basic, Visual Basic.NET, Perl, Python в операционных системах Windows, Unix, Linux, Mac OS, Novell Netware. Авторы издания, Майкл Ховард и Дэвид Лебланк, обучают программистов, как писать безопасный код в компании Microsoft. На различных примерах продемонстрированы как сами ошибки, так и способы их исправления и защиты от них. Если вы программист, то вам просто необходимо прочесть эту книгу.
Перевод: А. Слинкин
Читаем онлайн "19 смертных грехов, угрожающих безопасности программ" (ознакомительный отрывок). [Страница - 6]
Возникает вопрос: почему мы продолжаем пользоваться столь очевидно опасной системой? Избежать проблемы, по крайней мере частично, можно было бы, перейдя на 64–разрядный процессор Intel Itanium, где адрес возврата хранится в регистре. Но тогда пришлось бы смириться с утратой обратной совместимости, хотя на момент работы над этой книгой представляется, что процессор х64 в конце концов станет популярным.
Можно также спросить, почему мы не переходим на языки, осуществляющие строгий контроль массивов и запрещающие прямую работу с памятью. Дело в том, что для многих приложений производительность высокоуровневых языков недостаточно высока. Возможен компромисс: писать интерфейсные части программ, с которыми взаимодействуют пользователи, на языке высокого уровня, а основную часть кода – на низкоуровневом языке. Другое решение–в полной мере задействовать возможности С++ и пользоваться написанными для него библиотеками для работы со строками и контейнерными классами. Например, в Web–сервере Internet Information Server (IIS) 6.0 обработка всех входных данных переписана с использованием строковых классов; один отважный разработчик даже заявил, что даст отрезать себе мизинец, если в его коде отыщется хотя бы одно переполнение буфера. Пока что мизинец остался при нем, и за два года после выхода этого сервера не было опубликовано ни одного сообщения о проблемах с его безопасностью. Поскольку современные компиляторы умеют работать с шаблонными классами, на С++ теперь можно создавать очень эффективный код.
Но довольно теории, рассмотрим пример.
...
tinclude <stdio.h>Откомпилируем эту программу и посмотрим, что произойдет. Для демонстрации автор собрал приложение, включив отладочные символы и отключив контроль стека. Хороший компилятор предпочел бы встроить такую короткую функцию, как DontDoThis, особенно если она вызывается только один раз, поэтому оптимизация также была отключена. Вот как выглядит стек непосредственно перед вызовом strcpy:void DontDoIhis (char* input)
{
char buf[16];
strcpy(buf, input);
printf("%s\n» , buf);
}
int main(int argc, char* argv[])
{
// мы не проверяем аргументы
// а чего еще ожидать от программы, в которой используется
// функция strcpy?
DontDoThis(argv[l]);
return 0;
}
...
0x0012FEC0 с8 fe 12 00 .. <– адрес аргумента bufНапомним, что стек растет сверху вниз (от старших адресов к младшим). Этот пример выполнялся на процессоре Intel со схемой адресации «little–endian». Это означает, что младший байт хранится в памяти первым, так что адрес возврата «3f104000» на самом деле означает 0x0040103f.0x0012FEC4 с4 18 32 00 .2. <– адрес аргумента input
0x0012FEC8 d0 fe 12 00 .. <– начало буфера buf
0x0012FECC 04 80 40 00 .<<Unicode: 80>>@.
0x0012FED0 el 02 3f 4f .?0
0x0012FED4 66 00 00 00 f… <– конец buf
0x0012FED8 e4 fe 12 00 .. <– содержимое регистра EBP
0x0012FEDC 3f 10 40 00 ?.@. <– адрес возврата
0x0012FEE0 c4 18 32 00 .2. <– адрес аргумента DontDoThis
0x0012FEE4 cO ff 12 00 ..
0x0012FEE8 10 13 40 00 ..@. <– адрес, куда вернется main()
А теперь посмотрим, что происходит, когда буфер buf переполняется. Сразу вслед за buf находится сохраненное значение регистра EBP (Extended Base Pointer – расширенный указатель на базу). ЕВР содержит указатель кадра стека; при ошибке на одну позицию его значение будет затерто. Если противник сможет получить контроль над областью памяти, начинающейся с адреса 0x0012fe00 (последний байт вследствие ошибки обнулен), то программа перейдет по этому адресу и выполнит помещенный туда противником код.
Если не ограничиваться переполнением на один байт, то следующим будет затерт адрес возврата. Коль скоро противник сумеет получить контроль над этим значением и записать в буфер, адрес которого известен, достаточное число байтов ассемблерного кода, то мы будем иметь классический пример переполнения буфера, допускающего написание эксплойта. Отметим, что ассемблерный код (его обычно называют shell–кодом, потому что чаще всего задача эксплойта – получить доступ к оболочке (shell)) необязательно размещать именно в перезаписываемом буфере. Это типичный случай, но, вообще говоря, код можно внедрить в любое место вашей программы. Не обольщайтесь, полагая, что переполнению подвержен только очень небольшой участок.
После того как адрес возврата переписан, в распоряжении --">Книга охватывает широкий спектр уязвимостей, включая:
* Буферные переполнения
* Инъекции SQL
* Межсайтовый скриптинг
* Подделка межсайтовых запросов
* Обход проверки подлинности
Лебланк подробно объясняет каждый грех, предоставляя конкретные примеры, иллюстрирующие его потенциальные последствия. Он также предлагает практические рекомендации по их предотвращению и устранению.
Несмотря на техническую тему, книга написана понятным и лаконичным языком. Лебланк не перегружает читателя излишними деталями, а вместо этого сосредоточивается на самых важных концепциях и их практических приложениях.
Книга содержит множество реальных примеров уязвимостей безопасности, которые привели к значительным нарушениям, таким как хакерские атаки и утечки данных. Лебланк анализирует эти случаи, предоставляя ценные уроки о том, как их избежать.
Лебланк на протяжении всей книги подчеркивает соответствие стандартам и лучшим практикам безопасности, таким как OWASP Top 10 и NIST Cybersecurity Framework. Он показывает, как применять эти стандарты для создания более безопасных приложений.
Книга предназначена для широкой аудитории, включая:
* Разработчики программного обеспечения
* Специалисты по безопасности
* Тестировщики программного обеспечения
* Руководители проектов
"19 смертных грехов, угрожающих безопасности программ" - это исчерпывающее руководство по наиболее распространенным ошибкам в разработке программного обеспечения, влияющим на безопасность. Ясный и лаконичный стиль книги, реальные примеры и практические рекомендации делают ее ценным ресурсом для тех, кто стремится создавать надежные и защищенные приложения. Настоятельно рекомендуется всем, кто работает в области разработки программного обеспечения и обеспечения безопасности.
Книги схожие с «19 смертных грехов, угрожающих безопасности программ» по жанру, серии, автору или названию:
Джонатан Стейнхарт - Тайная жизнь программ. Как создать код, который понравится вашему компьютеру Жанр: Другие языки и системы программирования Год издания: 2023 Серия: Для профессионалов |