Слайды вебинара http://www.ptsecurity.ru/lab/webinars/#42235 :
"Каковы формальные признаки уязвимого и защищенного кода? Что такое уязвимость? Как разглядеть в коде уязвимость для атак, принадлежащих неизвестному классу? Чем уязвимости бизнес-логики отличаются от «традиционных» уязвимостей? Мы ответим на эти вопросы на вебинаре, посвященном теоретическому минимуму предметной области Application Security и практическому применению этих знаний в задачах анализа защищенности и при разработке защищенного кода"
Слайды вебинара http://www.ptsecurity.ru/lab/webinars/#42235 :
"Каковы формальные признаки уязвимого и защищенного кода? Что такое уязвимость? Как разглядеть в коде уязвимость для атак, принадлежащих неизвестному классу? Чем уязвимости бизнес-логики отличаются от «традиционных» уязвимостей? Мы ответим на эти вопросы на вебинаре, посвященном теоретическому минимуму предметной области Application Security и практическому применению этих знаний в задачах анализа защищенности и при разработке защищенного кода"
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
Rambler.iOS #9: Анализируй это! (Сергей Крапивенский).
Доклад посвящён наиболее популярным статическим анализаторам кода для iOS: как ими пользоваться, какие проблемы они решают, как внедрить их в привычный цикл разработки, как писать для них свои правила. Также рассмотрен опыт интеграции статического анализа и CI.
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
"Formal verification of C code" Efremov D.V.
The talk covers the issue of developing correct software applying one of the types of static code analysis. The speaker will also address the matters of using such methods, their weaknesses and limitations, as well as the results they can guarantee.
PHDays VII, PDUG section, Moscow, May 24 2017.
"Формальная верификация кода на языке Си" Ефремов Д.В.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Доклад представлен на конференции PHDays VII (2017) 24 мая в секции PDUG.
Очередной скучный доклад про логгированиеPython Meetup
Стас Рудаков, компания СООО "Гейм Стрим"/Wargaming.net
Значение логов очень часто недооценивается, а зря. Доклад с оживленным диспутом со всеми участниками митапа, чтобы разобраться: как, куда и зачем писать логи. Помимо этого затронут вопрос, как из логов выжать больше информации.
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
РИТ++ 2017, Backend Conf
Зал Кейптаун, 5 июня, 14:00
Тезисы:
http://backendconf.ru/2017/abstracts/2510.html
Я расскажу об опыте разработки REST API сервиса одной рекрутинговой платформы. Стремясь найти простое и масштабируемое решение, мы выбираем PostgreSQL и Node.js, а вместо сессий используем JWT-токены. Избегая ORM, мы пишем большие и сложные, но эффективные SQL-запросы. На помощь приходят SQL-представления, триггеры и небольшая собственная JS-библиотека.
...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
Шаблоны — мощный инструмент, добавляющий в язык новые возможности, а программистам в команде — новые проблемы. Доклад покажет, как тщательно продуманный шаблонный код может не усложнить, а упростить жизнь и дать надёжную абстракцию межпроцессных межъязыковых асинхронных вызовов функций. С помощью шаблонов можно:
адаптировать Promise/A+ из Javascript для C++
автоматически проверять и раскладывать динамический массив аргументов на статичные аргументы функции
сделать аналог std::bind для weak_ptr.
Эти вещи будут показаны на примере взаимных вызовов между C++ и Javascript в одном приложении с помощью CEF3.
This document provides an overview of a presentation on .NET for hackers. The presenter introduces themselves and their background in software development, security, and collaboration with OWASP. The agenda includes introductions to .NET, disassembling binaries, debugging .NET applications, reflection, decompilation techniques, and a malware analysis use case. Key topics covered are the .NET Common Language Runtime environment, .NET file formats, memory models, Just-In-Time compilation, debugging tools like ILDASM and SOS extensions, reflection APIs, decompilation, and anti-decompilation tricks. Examples are provided for debugging and reflection code.
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
Rambler.iOS #9: Анализируй это! (Сергей Крапивенский).
Доклад посвящён наиболее популярным статическим анализаторам кода для iOS: как ими пользоваться, какие проблемы они решают, как внедрить их в привычный цикл разработки, как писать для них свои правила. Также рассмотрен опыт интеграции статического анализа и CI.
Rambler.iOS - митапы iOS-разработчиков, организуемые компанией RAMBLER&Co.
"Formal verification of C code" Efremov D.V.
The talk covers the issue of developing correct software applying one of the types of static code analysis. The speaker will also address the matters of using such methods, their weaknesses and limitations, as well as the results they can guarantee.
PHDays VII, PDUG section, Moscow, May 24 2017.
"Формальная верификация кода на языке Си" Ефремов Д.В.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
Доклад представлен на конференции PHDays VII (2017) 24 мая в секции PDUG.
Очередной скучный доклад про логгированиеPython Meetup
Стас Рудаков, компания СООО "Гейм Стрим"/Wargaming.net
Значение логов очень часто недооценивается, а зря. Доклад с оживленным диспутом со всеми участниками митапа, чтобы разобраться: как, куда и зачем писать логи. Помимо этого затронут вопрос, как из логов выжать больше информации.
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
РИТ++ 2017, Backend Conf
Зал Кейптаун, 5 июня, 14:00
Тезисы:
http://backendconf.ru/2017/abstracts/2510.html
Я расскажу об опыте разработки REST API сервиса одной рекрутинговой платформы. Стремясь найти простое и масштабируемое решение, мы выбираем PostgreSQL и Node.js, а вместо сессий используем JWT-токены. Избегая ORM, мы пишем большие и сложные, но эффективные SQL-запросы. На помощь приходят SQL-представления, триггеры и небольшая собственная JS-библиотека.
...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
Шаблоны — мощный инструмент, добавляющий в язык новые возможности, а программистам в команде — новые проблемы. Доклад покажет, как тщательно продуманный шаблонный код может не усложнить, а упростить жизнь и дать надёжную абстракцию межпроцессных межъязыковых асинхронных вызовов функций. С помощью шаблонов можно:
адаптировать Promise/A+ из Javascript для C++
автоматически проверять и раскладывать динамический массив аргументов на статичные аргументы функции
сделать аналог std::bind для weak_ptr.
Эти вещи будут показаны на примере взаимных вызовов между C++ и Javascript в одном приложении с помощью CEF3.
This document provides an overview of a presentation on .NET for hackers. The presenter introduces themselves and their background in software development, security, and collaboration with OWASP. The agenda includes introductions to .NET, disassembling binaries, debugging .NET applications, reflection, decompilation techniques, and a malware analysis use case. Key topics covered are the .NET Common Language Runtime environment, .NET file formats, memory models, Just-In-Time compilation, debugging tools like ILDASM and SOS extensions, reflection APIs, decompilation, and anti-decompilation tricks. Examples are provided for debugging and reflection code.
Выступление Валерия Боронина, посвященное внедрению безопасной разработки с точки зрения руководителя, на встрече PDUG Meetup: SSDL for Management 25 ноября 2016 года.
The document discusses source code analysis techniques for detecting vulnerabilities. It describes several methodologies used in source code analysis tools, including style checking, semantic analysis, and deep flow analysis. Semantic analysis builds an abstract syntax tree to simulate code execution and check for faults. Deep flow analysis extends semantic analysis to generate control and data flow graphs to find issues like race conditions. The document also provides examples of source code vulnerabilities that can be detected, such as a buffer overflow, and discusses how tools can analyze source code, bytecode, and detect entry points vulnerable to attacks.
3 Things Every Sales Team Needs to Be Thinking About in 2017Drift
Thinking about your sales team's goals for 2017? Drift's VP of Sales shares 3 things you can do to improve conversion rates and drive more revenue.
Read the full story on the Drift blog here: http://blog.drift.com/sales-team-tips
How to Become a Thought Leader in Your NicheLeslie Samuel
Are bloggers thought leaders? Here are some tips on how you can become one. Provide great value, put awesome content out there on a regular basis, and help others.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Formal verification of operating system kernelsDenis Efremov
The speaker will share his experience of participating in projects on formal verification and analysis of access control modules for Astra Linux SE and Elbrus kernels, as well as verification of the Contiki code (OS for IoT) within the European VESSEDIA program. The speaker will disclose details about the development of formal access control models (Rodin/Event-B) and code specifications (Frama-C/ACSL), the use of static and dynamic analyzers, and the inclusion of formal analysis in the continuous integration cycle (continuous verification). Other types of work that help meet the certification requirements will also be considered.
https://standoff365.com/phdays10/schedule/development/formal-verification-of-operating-system-kernels
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
http://techtalks.nsu.ru
Видеозапись: http://www.youtube.com/watch?v=v7uBLSm6ft8
06 октября 2015. Как приручить дракона: введение в LLVM (Дмитрий Кашицын, HDsoft)
«В этом докладе мы кратко расскажем о таком звере, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
10 июня 2015. Дмитрий Кашицын (HDsoft) дает обзор LLVM.
http://techtalks.nsu.ru
Видеозапись: https://plus.google.com/events/ctes98f7uhf19t5jlvlbk24dan4
В этом докладе мы кратко расскажем о таком звере, как LLVM, о котором много кто слышал, но немногие щупали. Что такое компилятор на самом деле? Чем LLVM отличается от других компиляторов? Как в LLVM происходит компиляция программы, как работают оптимизации? Наконец, какой путь проходит программа от разбора исходного текста до генерации исполняемого файла?
Лекция будет обзорной и не потребует от слушателей глубоких знаний теории компиляторов.
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
Методология статического анализа год за годом зарекомендовывает себя в поисках дефектов в исходном коде программ.
Максим расскажет про:
- методологию статического анализа и какие плюсы и минусы у нее есть;
- технологии этой методологии, которые позволяют выявлять разнообразнейшие дефекты в коде;
- интересные примеры ошибок в реальных проектах, которые были найдены при помощи статического анализа;
- интеграцию инструментов статического анализа в проекты любой сложности, и почему так важно регулярное использование подобных инструментов.
Доклад посвящен разработке корректного программного обеспечения с применением одного из видов статического анализа кода. Будут освещены вопросы применения подобных методов, их слабые стороны и ограничения, а также рассмотрены результаты, которые они могут дать. На конкретных примерах будет продемонстрировано, как выглядят разработка спецификаций для кода на языке Си и доказательство соответствия кода спецификациям.
В очередной раз убедился, что программисты пишут программы совершенно безалаберно. И работают они не благодаря их заслугам, а благодаря удачному стечению обстоятельств и заботе разработчиков компиляторов в Microsoft или Intel. Да, да, именно они заботятся и в нужный момент подставляют костылики нашим кривобоким программкам.
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахYandex
В докладе рассказано о вычислительной модели на графах, в основе которой лежит механизм передачи сообщений между вершинами, а также о реализации в рамках данной модели API для написания алгоритмов на C++.
Верификация управляющих программ в системе автоматизации РТК (Iron hand)Alexander Petrov
Программно-аппаратная система моделирования и управления технологическим оборудованием. Основные особенности: высокоуровневые параллельные языки описания технологических процессов, ориентированные на специалистов предметных областей. Возможность предварительной отладки управляющих программ на моделях технологического оборудования.
This document proposes improvements to traditional virtual patching techniques used by web application firewalls (WAFs). It introduces the concepts of Inspected Application Modules (IAM) which use formal methods to evaluate vulnerability formulas generated by static application security testing (SAST). This aims to address issues where traditional approaches only block a single attack vector. The document further proposes Advanced Runtime Application Self-Protection (A-RASP) which instruments application code to provide values for computations and allow blocking attacks with unknown vectors. Finally, Ultimate Runtime Application Self-Protection (U-RASP) is proposed which leverages its own internal SAST to derive formulas and further improve performance and coverage of vulnerabilities compared to traditional and previous approaches.
Hacking an ASP.NET website is possible, though difficult. The document discusses vulnerabilities in ASP.NET applications that could allow an attacker to bypass restrictions or execute code. It notes that interacting with native libraries and using mixed assemblies could enable arbitrary code execution if vulnerabilities are present. Insecure managed code, integer overflows, and hash collisions are also discussed as potential attack vectors. The document advocates testing restrictions bypassing, file inclusion vulnerabilities, and other methods of exploiting ASP.NET applications.
Vladimir Kochetkov discusses automated patching for vulnerable source code. He describes how symbolic execution and generating a symbolic execution context graph (SECG) can be used to understand vulnerabilities and generate patches. The SECG represents the control flow graph of a program with additional context about symbolic variables. This allows finding formal symptoms of vulnerabilities, generating attack vectors, and eliminating symptoms through patching, such as adding validation, sanitization, or typing to make the minimum necessary changes while preserving functionality. He demonstrates this process with an SQL injection example and discusses generating patches for other attack types like buffer overflows.
How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)Vladimir Kochetkov
The document discusses developing secure web applications and changing developer mindsets. It recommends focusing on eliminating vulnerabilities at the cause rather than just addressing consequences. Developers should take a weakness-centric approach and understand how functional weaknesses can lead to vulnerabilities. The document provides examples of secure and insecure code snippets and explains how proper input validation and parameterized queries can fix vulnerabilities. It also includes summaries of threat modeling and the basics of developing securely.
How to Develop a Secure Web Application and Stay in Mind? (PHDays 3)
Современные подходы к SAST
1.
2. Современные подходы к SAST
Владимир Кочетков
Compilable Applications Analyzers Development / Team Lead
Positive Technologies
Образовательная программа «Практическая безопасность»
3. Disclaimer
Контент данного доклада предоставляется на
правах грязной фантазии на тему SAST и, хотя
он действительно имеет пересечение с PT AI,
речь пойдет не столько о конкретном проекте,
сколько о технологиях, которые лежат и/или
могли бы лежать в его основе.
4. Идеальный сферический SAST в вакууме:
― генерация эксплоитов для верификации полученных результатов;
― генерация патчей или подробных рекомендаций по устранению недостатков;
― поддержка нескольких подходов к статическому анализу;
― работа с невалидным исходным кодом;
5. Идеальный сферический SAST в вакууме:
― «еще один SAST, только лучше» - не нужен, нужен ?AST, с требованиями SAST,
но лишенный его ограничений, накладываемых тьюринговой моделью
вычислений;
― анализ по универсальному представлению кода, в которое будут
транслироваться исходники на всех поддерживаемых языках;
― все неразрешенные условия достижимости, не поддающиеся анализу
фрагменты кода и прочее – должно опционально отдаваться пользователю в
виде дополнительных условий уязвимости для их ручной проверки.
6. Теоретические пределы SAST
«Не существует программы, разрешающей
нетривиальные свойства программ» - теорема
Райса-Успенского
7. Теоретические пределы SAST
«Не существует программы, разрешающей
нетривиальные свойства программ» - теорема
Райса-Успенского
==
«Статический анализ защищенности программы
невозможен»
8. Теоретические пределы SAST
«Не существует программы, разрешающей
нетривиальные свойства программ» - теорема
Райса-Успенского
==
«Статический анализ защищенности программы
невозможен»
Но «программа» != «реальное приложение»
9. Проблема останова (внезапно) разрешима для:
― малых машин Тьюринга TM(k,l): k=2,l=3 ; k=2,l=2 ; k=3,l=2 ; k=4,l=2 , где k -
число состояний, l – количество символов входного алфавита;
10. Проблема останова (внезапно) разрешима для:
― малых машин Тьюринга TM(k,l): k=2,l=3 ; k=2,l=2 ; k=3,l=2 ; k=4,l=2 , где k -
число состояний, l – количество символов входного алфавита;
― программ машины Тьюринга с ограниченной памятью или стековых автоматов
с ограниченным стеком: поиск циклов в графе состояний эквивалентного
конечного автомата с Sn*x вершинами, где S – размер входного алфавита, n –
объем памяти, x – число допустимых состояний программы;
11. Проблема останова (внезапно) разрешима для:
― малых машин Тьюринга TM(k,l): k=2,l=3 ; k=2,l=2 ; k=3,l=2 ; k=4,l=2 , где k -
число состояний, l – количество символов входного алфавита;
― программ машины Тьюринга с ограниченной памятью или стековых автоматов
с ограниченным стеком: поиск циклов в графе состояний эквивалентного
конечного автомата с Sn*x вершинами, где S – размер входного алфавита, n –
объем памяти, x – число допустимых состояний программы;
― произвольных конечных автоматов.
13. Анализ в частных случаях
― код без циклов и рекурсии -> конечный или стековый автомат;
― цикл или рекурсия, условие выхода которых не зависит от входных данных ->
конечный или стековый автомат;
― цикл или рекурсия, условие выхода которых зависит от входных данных,
ограниченной длины -> машина Тьюринга или стековый автомат с
ограниченной памятью;
все остальное –> увы и ах
(только динамика, только хардкор).
14. "Modeling Computer Insecurity" (Sophie Engle, Sean Whalen and Matt Bishop):
провести полную динамическую оценку защищенности программы можно, только
выполнив ее на всех возможных наборах входных данных.
Пределы DAST
Статическая оценка защищенности программы, даже в
соответствии с определенными для нее критериями
защищенности, является неразрешимой проблемой.
Определение соответствия текущего состояния потока
вычисления критериям защищенности, очевидно,
разрешимо
32. Возможные типы статического анализа
― Сигнатурный (по AST, сводится к задаче о поиске поддеревьев в дереве):
• быстрый, даже при полном переборе;
• не учитывает семантику кода;
― Классический taint-анализ (по CPG, сводится к задачам обхода графа и поиска
в нем путей):
• просто быстрый;
• не учитывает условия достижимости, работает только с известными функциями;
― Анализ модели вычисления (по дополненному CPG и DFG, сводится к
построению и решению системы уравнений достижимости их вершин):
• учитывает все свойства анализируемой модели, может работать с незнакомыми
функциями;
• экспоненциально медленный.
35. Taint-анализ
var name = Request.Params["name"];
var key1 = Request.Params["key1"];
var parm = Request.Params["parm"];
var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm);
string str1;
if (name + "in" == "admin")
{
if (key1 == "validkey")
{
str1 = Encoding.UTF8.GetString(data);
}
else
{
str1 = "Wrong key!";
}
Response.Write(str1);
}
36. Taint-анализ
var name = Request.Params["name"];
var key1 = Request.Params["key1"];
var parm = Request.Params["parm"];
var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm);
string str1;
if (name + "in" == "admin")
{
if (key1 == "validkey")
{
str1 = Encoding.UTF8.GetString(data);
}
else
{
str1 = "Wrong key!";
}
Response.Write(str1);
}
37. Taint-анализ
var name = Request.Params["name"];
var key1 = Request.Params["key1"];
var parm = Request.Params["parm"];
var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm);
string str1;
if (name + "in" == "admin")
{
if (key1 == "validkey")
{
str1 = Encoding.UTF8.GetString(data);
}
else
{
str1 = "Wrong key!";
}
Response.Write(str1);
}
38. Taint-анализ
var name = Request.Params["name"];
var key1 = Request.Params["key1"];
var parm = Request.Params["parm"];
var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm);
string str1;
if (name + "in" == "admin")
{
if (key1 == "validkey")
{
str1 = Encoding.UTF8.GetString(data);
}
else
{
str1 = "Wrong key!";
}
Response.Write(str1);
}
39. Taint-анализ
var name = Request.Params["name"];
var key1 = Request.Params["key1"];
var parm = Request.Params["parm"];
var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm);
string str1;
if (name + "in" == "admin")
{
if (key1 == "validkey")
{
str1 = Encoding.UTF8.GetString(data);
}
else
{
str1 = "Wrong key!";
}
Response.Write(str1);
}
40. Taint-анализ
var name = Request.Params["name"];
var key1 = Request.Params["key1"];
var parm = Request.Params["parm"];
var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm);
string str1;
if (name + "in" == "admin")
{
if (key1 == "validkey")
{
str1 = Encoding.UTF8.GetString(data);
}
else
{
str1 = "Wrong key!";
}
Response.Write(str1);
}
41. Taint-анализ
var name = Request.Params["name"];
var key1 = Request.Params["key1"];
var parm = Request.Params["parm"];
var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm);
string str1;
if (name + "in" == "admin")
{
if (key1 == "validkey")
{
str1 = Encoding.UTF8.GetString(data);
}
else
{
str1 = "Wrong key!";
}
Response.Write(str1);
}
42. Taint-анализ
var name = Request.Params["name"];
var key1 = Request.Params["key1"];
var parm = Request.Params["parm"];
var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm);
string str1;
if (name + "in" == "admin")
{
if (key1 == "validkey")
{
str1 = Encoding.UTF8.GetString(data);
}
else
{
str1 = "Wrong key!";
}
Response.Write(str1);
}
43. ― невозможно автоматизировать верификацию результатов;
― не учитываются условия достижимости опасной операции;
― семантика трансформирующих операций определяется исключительно базой
знаний;
― подход применим только к классам уязвимостей к атакам, основанным на
передаче в опасную операцию конкретных значений аргументов.
Недостатки taint-анализа
45. AI, SE и PE
Абстрактная интерпретация (AI) – интерпретация семантики кода без его
выполнения в рамках некоторой семантической модели.
Символическое выполнение (SE) – абстрактная интерпретация кода в рамках
семантической модели потоков данных и потоков управления.
Частичное выполнение (PE) – конкретное выполнение отдельных фрагментов
кода в заданном контексте.
46. SE на пальцах
(x – неизвестная переменная, sqrt – неизвестная функция)
2x^2 + 4 = 12
2x^2 = 12 - 4
2x^2 = 12 - 4
x^2 = (12 - 4) / 2
x = sqrt((12 - 4) / 2)
x = sqrt((8) / 2)
x = sqrt(4)
x = 2
47. PT SE
Контекстуальное символическое выполнение – символическое выполнение кода с
целью построения контекстуального графа символического выполнения (SECG).
SECG изоморфен CPG, но позволяет также получить формулу достижимости
любых значений потоков данных в любой точке потока выполнения.
Формула достижимости опасных потоков данных в точке выполнения опасной
операции – формула уязвимости.
По формуле уязвимости строится уравнение, решение которого позволяет
построить контекстный вектор атаки.
55. ОК, модель построена. Но как ее
анализировать? Как строить
формулы и для каких вершин?
56. Формальные признаки инъекции
― Потенциально уязвимая операция PVO(text): операция прямой или косвенной
интерпретации текста text на формальном языке
― text = transform(argument), где argument – элемент множества аргументов
точки входа EP, а transform – функция промежуточных преобразований
― Существует и достижимо хотя бы одно множество таких значений элементов
EP, при которых происходит изменение структуры синтаксического дерева
значения text, достигающего PVO
57. Формализуемость уязвимостей к атакам
Строго формализуемые Слабо формализуемые
Injections Access Control
Buffer Overflow Session Management
Heap Overflow CSRF
Integer Overflow Concurrency
Memory Management Domain(Logical)
… …
58. Request.Params["cond1"] != "true" {
parm' {
Request.Params["cond2"] == "true"
Request.Params["parm2"]
||
Request.Params["cond2"] != "true"
"<div>Harmless value</div>"
}
}
Symbolic Execution Context Graph
По SECG для каждой PVO выводится формула уязвимости
62. Формула уязвимости
Request.Params["cond1"] != "true"
&&
Request.Params["cond2"] == "true" ⇒
Response.Write(
"<a href="" + Request.Params["parm2"] + "">"
)
Значение Request.Params["parm2"], определяемое типом точки инъекции,
приводит к выходу за пределы токена
63. <a href=" ">
Тип точки инъекции вычисляется синтаксической эвристикой в результате
прохода по уязвимому выражению в обе стороны от нее или с помощью
парсеров дополненных грамматик
Вычисление типа точки инъекции
68. Частичное выполнение и обратные функции
var name = Request.Params["name"];
var key1 = Request.Params["key1"];
var parm = Request.Params["parm"];
var data = string.IsNullOrEmpty(parm) ? new char[0]: Convert.FromBase64String(parm);
string str1;
if (name + "in" == "admin")
{
if (key1 == "validkey")
{
str1 = Encoding.UTF8.GetString(data);
}
else
{
str1 = "Wrong key!";
}
Response.Write(str1);
}
69. Частичное выполнение и обратные функции
string.IsNullOrEmpty("<script>alert(/XSS/)</script") =>
str1 = Encoding.UTF8.GetString(
Convert.FromBase64String(
"<script>alert(/XSS/)</script"
)
)
70. Частичное выполнение и обратные функции
true =>
str1 = Convert.ToBase64String (
Encoding.UTF8.GetBytes(
"<script>alert(/XSS/)</script"
)
)
71. Частичное выполнение и обратные функции
true =>
str1 = Convert.ToBase64String (
[…] // массив непечатных байт
)
72. Частичное выполнение и обратные функции
true =>
str1 = PHNjcmlwdD5hbGVydCgvWFNTLyk8L3NjcmlwdA==
73. Частичный фаззинг
Пусть Tf – множество трансформирующих функций с известной семантикой с
мощностью n.
Пусть С– множество всех сочетаний из n по k (k=1..3 хватит всем).
Тогда, для заданной строки s имеем возможных преобразований –
элементов размеченного множества St.
Тогда, имея результат преобразования s с помощью исследуемой функции f,
можем выполнить поиск его значения в St , тем самым, определяя семантику f.
74. Отложенная интерпретация
Интерпретация фрагментов кода, не имеющих побочных эффектов на внешний
контекст, может быть отложена на этап решения формулы уязвимости.
При решении формулы уязвимости каждый отложенный фрагмент
специфицируется текущими предполагаемыми значениями неизвестных и
выполняется конкретно, с помощью песочницы частичного выполнения.
Это позволит интерпретировать значительный процент циклов и рекурсивных
вызовов.
Все прочие неинтерпретированные фрагменты должны быть включены в
дополнительные условия уязвимости.
76. Использованные материалы
― «Modeling and Discovering Vulnerabilities with Code Property Graphs», Fabian
Yamaguchi , Nico Golde , Daniel Arp and Konrad Rieck, https://goo.gl/zSuq1U
― «Modeling Computer Insecurity», Sophie Engle, Sean Whalen and Matt Bishop,
http://goo.gl/B9izbc