Подтвердить что ты не робот

Использование теоретических прокси-серверов для поиска атак

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

Мой вопрос: кто-нибудь сделал работу по использованию подобных инструментов для поиска уязвимостей в существующих или предлагаемых системах?


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

4b9b3361

Ответ 1

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

Попробуйте проект Byron Cook TERMINATOR.

И как минимум два видео на Channel9. Здесь один из них

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

Связаны также такие проекты, как SpeС# и Typed-Assembly-Language. В своем стремлении перенести возможность проверки безопасности из среды выполнения обратно во время компиляции, они позволяют компилятору обнаруживать многие неправильные коды кода как ошибки компиляции. Строго говоря, они не помогают вашим заявленным намерениям, но теория, которую они используют, может быть полезна для вас.

Ответ 2

Да, в этой области проделана большая работа. Решатели Solisfiability (SAT и SMT) регулярно используются для обнаружения уязвимостей безопасности. Например, в Microsoft инструмент, называемый SAGE, используется для устранения ошибок переполнения буфера из окон. SAGE использует доказательство теоремы Z3 как средство проверки выполнимости. Если вы выполняете поиск в Интернете с использованием таких ключевых слов, как "умный fuzzing" или "white-box fuzzing", вы найдете несколько других проектов, использующих проверочные проверки для обнаружения уязвимостей безопасности. Идея высокого уровня заключается в следующем: собирать пути выполнения в вашей программе (что вам не удалось выполнить, т.е. Вы не нашли вход, который запустил программу), преобразовать эти пути в математические формулы, и подавать эти формулы в решатель выполнимости. Идея состоит в том, чтобы создать формулу, которая выполнима/выполнима, только если есть вход, который заставит программу выполнить данный путь. Если полученная формула является выполнимой (т.е. Выполнимой), то решатель выполнимости выполнит задание и требуемые входные значения. Бегущие фьюзеры используют разные стратегии для выбора путей выполнения. Основная цель - найти вход, который заставит программу выполнить путь, который приведет к сбою.

Ответ 3

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

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

О матке назад мы столкнулись с проблемой разбора PDF файлов несколькими/более старыми таблицами XREF. Мы не смогли доказать, что синтаксический разбор завершается. Подумав об этом, я построил PDF файл с циклом /Prev Pointers в трейлере (кто бы мог подумать об этом?: -P), что, естественно, заставило некоторых зрителей зацикливаться навсегда. (В частности, почти любой зритель на основе Poppler на Ubuntu. Застал меня смеяться и проклинать Gnome/evince-thumbnailer за то, что он купил весь мой процессор. Думаю, они исправили его сейчас, tho.)


Использование Coq для поиска ошибок нижнего уровня будет затруднительным. Чтобы что-то доказать, вам нужна модель поведения программы. Для проблем с стеком/кучей вам, вероятно, придется моделировать выполнение уровня CPU или, по крайней мере, C-уровня. Хотя технически это возможно, я бы сказал, что это не стоит усилий.

Использование SPLint для C или создание пользовательской проверки на выбранном вами языке должно быть более эффективным.

Ответ 4

STACK и KINT используется ограничение решателей для поиска уязвимостей во многих проектах OSS, таких как ядро ​​linux и ffmpeg. Страницы проекта указывают на документы и код.

Ответ 5

Это не связано с теоретическими доказательствами, но fuzz testing - это распространенный метод автоматического обнаружения уязвимостей.

Ответ 6

Существует L4 проверенное ядро ​​, которое пытается это сделать. Однако, если вы посмотрите на историю эксплуатации, обнаружите совершенно новые шаблоны атаки, и тогда большое количество программного обеспечения, написанного до этого момента, очень уязвимо для атак. Например, уязвимости в формате строки не были обнаружены до 1999 года. Около месяца назад Х.Д. Moore выпустил DLL Hijacking и буквально все под окнами уязвимо.

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

Ответ 7

Отказ от ответственности: у меня мало опыта работы с автоматическими инструкторами теорем

Несколько наблюдений

  • Такие вещи, как криптография, редко бывают "проверенными", считаются безопасными. Если ваша программа использует что-либо подобное, она будет только такой же сильной, как криптограмма.
  • Теоремы-теоретики не могут анализировать все (или они могут решить проблему остановки)
  • Вам нужно было бы четко определить, что небезопасно для проверки. Это само по себе является огромной проблемой.

Ответ 8

Да. Многие проекты доказывания доказательств показывают качество их программного обеспечения, демонстрируя дыры или дефекты в программном обеспечении. Чтобы обеспечить безопасность, просто представьте, что вы найдете дыру в протоколе безопасности. Карлос Олтарт Тезис в Ugo Montanari имеет один такой пример.

Это приложение. На самом деле не теорема о себе, которая имеет какое-либо отношение к безопасности или специальному знанию.