Каковы методы предотвращения атак переполнения буфера? - PullRequest
8 голосов
/ 14 сентября 2010

Каковы идеи предотвращения атак переполнения буфера?и я слышал о Stackguard, но до сих пор эта проблема полностью решается путем применения stackguard или его комбинации с другими методами?

после разогрева, как опытный программист

ПочемуВы думаете, что так трудно обеспечить адекватную защиту для атак переполнения буфера?

Редактировать: спасибо за все ответы и поддержание активной метки безопасности:)

Ответы [ 6 ]

4 голосов
/ 14 сентября 2010

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

Во-первых, если ваш выбор языка поровну (или близок к поровну) между тем, который обеспечивает прямой доступ к памяти, и тем, который нет, выберите тот, который не имеет,То есть используйте Perl, Python, Lisp, Java и т. Д. Поверх C / C ++.Это не всегда вариант, но он помогает вам не выстрелить себе в ногу.

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

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

В-четвертых, используйте инструменты статического анализа кода, такие как Fortify, Qualys или сервис Veracode, чтобы обнаружить переполнения, которые вы не хотели кодировать.,Затем исправьте обнаруженный материал.

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

В-шестых, проверяйте код безопасности отдельно от регулярных проверок кода.Регулярные проверки кода позволяют убедиться, что код работает, проходит функциональные тесты и соответствует политике кодирования (отступы, соглашения об именах и т. Д.).Обзоры безопасного кода специально, в явном виде и предназначены только для поиска проблем безопасности.Делайте безопасные проверки кода на весь код, который вы можете.Если вам нужно расставить приоритеты, начните с критически важных вещей, вещей, где вероятны проблемы (где пересекаются границы доверия (узнайте о диаграммах потоков данных и моделях угроз и создайте их), где используются интерпретаторы, и особенно, когда вводится пользовательский ввод /сохраненные / извлеченные, включая данные, извлеченные из вашей базы данных).

В-седьмых, если у вас есть деньги, наймите хорошего консультанта, такого как Neohapsis, VSR, Matasano и т. д., чтобы проверить ваш продукт.Они найдут гораздо больше, чем просто переполнения, и ваш продукт будет для них лучше.

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

Отредактировано, чтобы добавить: Я неправильно понял вопрос.Название гласит: «Каковы методы», а текст говорит: «Почему это сложно?»

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

Или, чтобы снова ответить на вопрос: почему так сложно писать код без ошибок?

2 голосов
/ 15 сентября 2010

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

К счастью, конкретный случай переполнения буфера долгое время решал проблему . Большинство языков программирования имеют проверку границ массива и не позволяют программам составлять указатели. Только не используйте те, которые разрешают переполнение буфера, такие как C и C ++.

Конечно, это относится ко всему программному стеку, от встроенной прошивки ¹ до вашего приложения.

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

2 голосов
/ 14 сентября 2010

Необходим только один метод: Не доверяйте данным из внешних источников.

2 голосов
/ 14 сентября 2010

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

1 голос
/ 10 марта 2011

Вы можете запустить анализаторы, чтобы помочь вам найти проблемы до того, как код будет запущен в производство. Наш Memory Safety Checker найдет переполнения буфера, неправильные ошибки указателя, ошибки доступа к массиву и ошибки управления памятью в коде C, предоставляя вашему коду возможность отслеживать ошибки в момент их появления. Если вы хотите, чтобы программа на C была невосприимчива к таким ошибкам, вы можете просто использовать результаты анализатора Memory Safety в качестве рабочей версии вашего кода.

0 голосов
/ 14 сентября 2010

В современной эксплуатации большая тройка:

ASLR

Canary

Бит NX

В современных сборках GCC Канарские острова применяются по умолчанию. Не все ASLR созданы одинаково, Windows 7, Linux и * BSD имеют одни из лучших ASLR. OSX имеет худшую реализацию ASLR, ее тривиально обойти. Некоторые из самых современных атак переполнения буфера используют экзотические методы для обхода ASLR. Бит NX - это, безусловно, самый простой способ обойти атаки типа «возврат в libc», что делает его несложным для разработчиков эксплойтов.

...