SlideShare uma empresa Scribd logo
1 de 136
Как разработать защищенное
веб-приложение и не сойти
при этом с ума?
Владимир Кочетков
специалист по анализу защищенности веб-приложений
Positive Technologies
Positive Hack Days III
Краткое
содержание
― Эффективная разработка защищенного кода требует
изменений в образе мышления вовлеченных участников.
― Существующие обучающие ресурсы навязывают
изучение причин по их следствиям и противодействие
следствиям вместо устранения причин.
― Следуя общепринятым подходам, разработчик должен
стать квалифицированным пентестером, чтобы начать
писать защищенный код.
Это НЕ РАБОТАЕТ!
Почему?
GET /api/shop/discount?shopId=3&productId=1584&coupon=1y3z9 HTTP/1.1
Host: superdupershop.com
Cookie: ASP.NET_SessionId=10g5o4zjkmbd2i552d5j3255;.ASPXAUTH=
f2d345118221742ee0316d4080a53af014eb8a3161db421d36aa6a86ffea6781b558
4f4157ec85ae5956cfc54cc93c34a3f9449c8ef4c70b5b54d46e0def3677cce9a810
5340b8ccc6c8e64dfa37ae953f987517
Внимание, черный ящик!
var shopId = Request["shopId"];
var productId = Request["productId"];
var coupon = Request["coupon"];
var couponPattern = string.Format("{0}-{1}-{2}", shopId, productId, coupon);
var sqlCommandTxt = string.Format(" SELECT value FROM Discounts WHERE coupon LIKE {0}", coupon);
var cmd = new SqlCommand(sqlCommandTxt, dataConnection);
// Execute query, process result etc...
Внимание, белый ящик!
var shopId = Request["shopId"];
var productId = Request["productId"];
var coupon = Request["coupon"];
var couponPattern = string.Format("{0}-{1}-{2}", shopId, productId, coupon);
var cmd = new SqlCommand("SELECT * FROM Discounts WHERE coupon LIKE @couponPattern",
dataConnection);
cmd.Parameters.Add(new SqlParameter("@couponPattern", couponPattern));
// Execute query, process result etc...
Уязвимости устранены?
var shopId = 0;
if (!int.TryParse(Request["shopId"], out shopId))
{
throw new InvalidArgumentException();
}
var productId = 0;
if (!int.TryParse(Request["productId"], out productId))
{
throw new InvalidArgumentException();
}
var coupon = Request["coupon"];
if (!Regex.IsMatch(coupon, "^[A-Za-z0-9]{5}$"))
{
throw new InvalidArgumentException();
}
var couponPattern = string.Format("{0}-{1}-{2}", shopId, productId, coupon);
var cmd = new SqlCommand("SELECT * FROM Discounts WHERE coupon=@couponPattern", dataConnection);
cmd.Parameters.Add(new SqlParameter("@couponPattern", couponPattern));
// Execute query, process result etc...
Теперь– да!
Глоссарий
ИС защищена, если не нарушен ряд свойств всех ее
информационных потоков:
• модель CIA:
—конфиденциальность
—доступность
—целостность
• модель STRIDE – CIA плюс:
—аутентифицированность
—авторизованность
—неотказуемость
Защищенная ИС
― То, что может сделать с информацией атакующий,
называется угрозой (threat)
― То, благодаря чему он может это сделать, называется
уязвимостью (vulnerability), обусловленной недостатком
(weakness)
― То, как он может это сделать, называется атакой (attack)
― То, с какой вероятностью у него это удастся и какие
последствия может повлечь, называется риском (risk)
― То, что не позволяет атакующему провести атаку,
обеспечивает защищенность (security)
― То, что минимизирует риск, обеспечивает безопасность
(safety)
Памятка по терминам ИБ
Причины и следствия
Недостаток Угроза
Уязвимость Атака
Риск
Незащищенность
Небезопасность
Бороться необходимо с причинами, а не со следствиями!
Почему борьба с атаками сложнее, чем с недостатками или
ASP.NET Request Validation versus IRV
http://habrahabr.ru/company/pt/blog/178357/
Демо
Типичный образ
мышления
― Фокус на функциональных требованиях
― Знает о:
• 10 рисках (OWASP Top 10)
• 1 угрозе (срыв дедлайна)
• Недостатки? Нет, не слышал
― Сконцентрирован на рисках
«I know when I’m writing code I’m not
thinking about evil, I’m just trying to think
about functionality» (с) Scott Hanselman
“Разработчик”
* на основе результатов опроса http://www.rsdn.ru/?poll/3488
Осведомленность разработчиков*
0.00%
10.00%
20.00%
30.00%
40.00%
50.00%
60.00%
70.00%
80.00%
90.00%
AbuseofFunctionality
BruteForce
Buffer/FormatStringOverflow
ContentSpoofing
Credential/SessionPrediction
Cross-SiteRequestForgery
Cross-SiteScripting
DenialofService
Fingerprinting
HPP/HPC
HRS
IntegerOverflows
LDAPInjection
MailCommandInjection
NullByteInjection
OSCommanding
PathTraversal
PredictableResourceLocation
Remote/LocalFileInclusion
RoutingDetour
SessionFixation
SOAPArrayAbuse
SQLInjection
SSIInjection
URLRedirectorAbuse
XMLAttributeBlowup
XMLEntityExpansion
XMLExternalEntities
XMLInjection
XPath/XQueryInjection
Attacks based on WASC classification Attacks included at OWASP Top 10 risks
Риски — для менеджеров…
… не для разработчиков!
“Безопасник”
― Фокус на требованиях к защищенности
― Отличает атаки от уязвимостей 
― Сконцентрирован на уязвимостях
«If you don't understand the
business, you can't see business logic
flaws.» (с) OWASP
Недостатки функционала
…тоже являются причинами
уязвимостей!
Рефакторинг образа мышления
― «Разработчик»:
• выбросить из головы все хит-парады безопасности
• сконцентрироваться на недостатках
― «Безопасник»:
• взаимодействовать с разработчиками
• учитывать специфику функционала
• сконцентрироваться на уязвимостях
Что такое уязвимость?
Немного скучной теории
Математическая абстракция, представляющая
универсальную вычислительную машину.
― Машина Тьюринга состоит из:
• бесконечной ячеистой ленты;
• управляющего устройства с конечным числом состояний;
• таблицы переходов между состояниями.
― На каждой итерации можно:
• изменить текущую ячейку;
• перейти в другое состояние;
• переместиться на соседнюю ячейку.
Машина Тьюринга
МТ: семерка M=(Q,Γ,b,Σ,δ,q0,F)где:
Q - конечное непустое множество состояний;
Γ - конечное непустое множество символов алфавита;
b∈Γ - пустой символ;
Σ⊆Γ∖b - множество входных символов;
q0∈Q - начальное состояние;
F⊆Q - множество финальных состояний;
δ:Q∖F Γ → Q Γ {L,R} - частичная функция перехода, где:
• L- сдвиг по ленте влево
• R - сдвиг по ленте вправо
Формальное определение
Теорема останова: не существует алгоритма, способного
определить, остановится ли программа на заданном наборе
данных;
Теорема Клини о неподвижной точке: не существует
алгоритма, преобразующего программы, который бы по
каждой программе давал другую, не эквивалентную ей;
Теорема Успенского-Райса: не существует
алгоритма, разрешающего нетривиальные свойства
программ;
Пределы МТ
Удаление всех вхождений символа «a»
Что произойдет, если входная строка будет
содержать пустой символ или ‘#’?
Демо
?
Машина с состояниями, в которой:
― функции перехода и/или множество состояний искажены
входными данными;
― на каждой итерации происходит непредсказуемый
переход в некорректное состояние.
Эксплуатация weird-машины
может дать полный или частичный
контроль над исходной машиной.
Weird-машина
Конфигурация: состояние, содержимое ленты, позиция на
ленте.
Условная политика: множество конфигураций, не
приводящих к реализации информационных
угроз, разрешенных при определенных условиях, которому
удовлетворяет текущее состояние или содержимое ленты.
Политика защищенности: объединение условных политик.
Защищенная МТ: машина, все конфигурации времени
выполнения которой удовлетворяют политике
защищенности.
Защищенная МТ
Двойка (V, C), где:
― V - неавторизованная конфигурация, нарушающая
политику защищенности;
― C- последовательность условий, описывающих историю
вычисления, приводящую к V.
Уязвимость
Полная модель ЗМТ
«and we need to go deeper» (с)
"Modeling Computer Insecurity" (Sophie Engle, Sean Whalen and
Matt Bishop):
провести полную динамическую оценку защищенности
программы можно, только выполнив ее на всех возможных
наборах входных данных.
Разработка защищенного кода менее трудоемкий
процесс, чем анализ защищенности уже существующего
кода.
Вычислимость проблемы защищенности
Статическая оценка защищенности
программы, даже в соответствии с
определенной для нее
политикой, является неразрешимой
проблемой.
Определение соответствия текущей
конфигурации политике
защищенности, очевидно, разрешимо
Семантика любого дискретного процесса может быть
описана в виде множества состояний и условий перехода
между ними.
Зачем все это?!
Критерии к входным данным, приводящие
процесс к тому или иному
состоянию, формируют множества
конфигураций ИС.
Зачем все это?!
Политика защищенности формируется в результате анализа
модели угроз и выделения неавторизованных
конфигураций, приводящих к реализации любой из
выявленных угроз.
Устранение неавторизованных конфигураций формируют
комплекс контрмер по обеспечению защищенности
ИС, любые другие действия, оперирующие «степенью
неавторизованности» формируют комплекс контрмер по
обеспечению безопасности ИС.
Разработка кода в соответствии с политикой защищенности:
security driven development
Зачем все это?!
Для типовых строительных блоков веб-приложений
контрмеры по обеспечению их защищенности уже
сформулированы как результат эволюции.
На их основе выработан набор практик, следуя которым
можно избежать появления недостатков в архитектуре и
реализации веб-приложения.
Хорошие новости
Построение политики
защищенности обычно необходимо
только для реализации слоя бизнес-
логики, чтобы избежать появления
логических недостатков.
Моделирование угроз
Что?
Процесс обнаружения угроз в разрабатываемом приложении
Кто?
Архитекторы и разработчики
Когда?
Чем раньше, тем лучше
Зачем?
Чтобы выявить недостатки в архитектуре или модели
предметной области, которые могут стать уязвимостями
Основы
Процесс
Построение или
уточнение DFD
Идентификация
угроз
Выработка
контрмер
Валидация
модели
Построение или уточнение DFD
Элемент Обозначение Примеры
Внешняя сущность Пользователи
Внешние системы
Процесс Исполняемые файлы
Компоненты
Службы
Веб-сервисы
Поток данных Вызов функции
Сетевой трафик
Хранилище данных База данных
Файл
Структуры данных
Границы доверия Процессная
Машинная
Построение или уточнение DFD
Дальнейшая декомпозиция модели требуется, если:
― описаны не все потоки, проходящие через границы
доверия;
― существуют неявные объекты, пересекающие границы
доверия;
― словесное описание модели требует употребления слов
«иногда», «а также», «за исключением» и т.п.:
• «Иногда, это хранилище данных используется в
качестве…» требует добавления в диаграмму второго
хранилища
• «Этот поток данных всегда используется для передачи
бизнес-сущностей, за исключением этапа
аутентификации» требует добавления дополнительного
потока
Построение или уточнение DFD
Построение или уточнение DFD
― Контекстная
• Цельные компоненты / продукты / системы
― 1-го уровня
• Отдельные функциональные возможности или сценарии
― 2-го уровня
• Функциональные возможности, разбитые на компоненты
― 3-го уровня
• Полная декомпозиция, детально описывающая
архитектуру или модель предметной области
Детальность DFD
― Конечным источником потока данных может являться
внешняя сущность, хранилище или процесс, который его
создает.
― Если в DFD присутствуют потоки
данных, предназначенные только для записи, то в 90%
случаев это говорит о ее неполноте.
― Потоки данных не могут передаваться от хранилища к
хранилищу напрямую, передача возможна только через
процессы.
― DFD должна описывать архитектуру или модель
предметной области, а не их реализацию («нет» блок-
схемам, диаграммам классов и графам вызовов).
Правила построения DFD
Модель STRIDE описывает угрозы нарушения 6 свойств
информационных потоков.
Не требует знаний уровня эксперта для ее построения.
Идентификация угроз
Угроза Свойство
Spoofing Аутентифицированность
Tampering Целостность
Repudiation Неотказуемость
Information Disclosure Конфиденциальность
Denial of Service Доступность
Elevation of privilege Авторизованность
Для каждого элемента DFD специфичен свой набор угроз.
* Repudiation специфична только для хранилищ, ведущих журнал транзакций
Специфичность угроз
Элемент S T R I D E
√ √
√ √ √ √ √ √
√ √ √
√ ?* √ √
Выработка контрмер —конечная цель моделирования
угроз.
Контрмера для каждой угрозы должна сводиться к:
― редизайну или пересмотру требований (концентрация
на угрозах);
― выделению конфигураций, приводящих к реализации
угрозы и принятию мер по устранению причин их
возникновения (концентрация на
уязвимости/недостатке);
― формированию требований к внешней среде для
устранения возможности эксплуатации уязвимости
(концентрация на атаке) или снижения вероятности
успешной атаки и минимизации ущерба (концентрация
на рисках).
Выработка контрмер
Осуществляется на протяжении всего цикла разработки.
― Модель соответствует текущей реализации?
― Перечислены все угрозы?
• минимум: элементы, пересекающие границы доверия.
― Контрмеры выработаны для каждой угрозы?
― Контрмеры реализованы корректно?
Валидация модели
Построение модели угроз для типового веб-приложения
Пример
Защищенность
стандартной
конфигурации
Secure by Design, by Default and in Deployment
― реализация принципа наименьших прав и привилегий;
― минимальный набор включенного функционала;
― принудительное изменение стандартных учетных
данных;
― проектирование каждого компонента, исходя из
предполагаемой компрометации всех остальных.
Принцип SD3
Защищенность
транспортного слоя
- HTTP через SSL/TLS. Предназначен для обеспечения:
― конфиденциальности и целостности данных,
передаваемых по HTTP;
― аутентичности стороны сервера (реже – и клиента).
Или иными словами для защиты от атак класса MitM.
HTTPS
Статические ресурсы, используемые в документе, который
передается по HTTPS:
― таблицы стилей,
― сценарии,
― объекты,
также должны передаваться по защищенному каналу!
Использование смешанного контента
Популярные подходы:
- HTTP по умолчанию, HTTPS по выбору пользователя,
- HTTP везде, критические точки входа через HTTPS,
неэффективны и подвержены атакам SSL Stripping.
Неэффективная передача данных
Частично противодействовать им можно, используя:
― site-wide HTTPS без опционального HTTP,
― HTTP-заголовок: Strict-Transport-Security: max-
age=expireTime [; includeSubdomains]
при условии, что первый раз пользователь попадет на сайт
по протоколу HTTPS.
Неэффективная передача данных
- использование 2048-битного ключа;
- защита закрытой части ключа;
- эффективное покрытие доменов;
- использование проверенного CA;
- настройка валидной цепочки сертификатов;
- использование защищенных протоколов;
- использование защищенных наборов шифрования;
- контроль автоматического выбора набора шифрования;
- отключение инициации renegotiation клиентом;
- устранение известных проблем (BEAST, CRIME).
https://www.ssllabs.com/projects/best-practices/
Практики этапа развертывания
Обработка ошибок
Сообщения об ошибках:
Раскрытие информации
Коды ответа:
Раскрытие информации
<customErrors mode="On" />
<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite"
defaultRedirect="~/Error.aspx" />
Оракул — weird-машина, отвечающая на вопросы
атакующего в рамках своего функционала.
Наиболее известный пример: оракул дополнения.
Создание оракулов
― Использование собственных обработчиков ошибок и
представлений с универсальными сообщениями о них.
― Реализация транзакционности на уровне:
• методов (try-catch-finally);
• состояний рабочего потока.
― Исключение побочных каналов:
• кодов HTTP-ошибок;
• временных задержек.
Практики обработки ошибок
Защищенность клиентской
стороны
― X-Content-Type-Options {nosniff} отключает
распознавание MIME-типа в IE
(http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-
security-part-v-comprehensive-protection.aspx)
― X-XSS-Protection {0 | 1 | 1; mode=block} управляет XSS-
фильтром в IE
(http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/
controlling-the-internet-explorer-xss-filter-with-the-x-xss-
protection-http-header.aspx)
4 HTTP-заголовка
― X-Frame-Options {DENY | SAMEORIGIN | ALLOW-FROM uri}
определяет возможность открытия документа во фрейме
(http://tools.ietf.org/html/draft-ietf-websec-x-frame-
options-00)
― X-Content-Security-Policy | Content-Security-Policy | X-
WebKit-CSP {…} определяет политику защищенности
контента (Content Security Policy, CSP
https://dvcs.w3.org/hg/content-security-policy/raw-
file/tip/csp-specification.dev.html)
4 HTTP-заголовка
Как разработчики используют CSP
0%
93%
7%
Используете ли вы CSP для защиты своих веб-
приложений?
Да
Нет, узнал о CSP из этого
голосования
Нет, о CSP знал и раньше
* на основе результатов опроса http://www.rsdn.ru/?poll/33884 по состоянию на 20 мая 2013 года.
Основные поддерживаемые директивы:
― (connect|font|frame|img|media|object|script|style)-src uri
ограничивает URI, к которым можно обратиться из тегов
документа
― default-src uri определяет умолчания для всех src-
директив
― report-uri uri определяет URI для сообщений о
нарушениях политики
― sandbox flags определяет песочницу для элементов
iframe, ограничивающую множество состояний их
содержимого (где flags: allow-same-origin | allow-top-
navigation | allow-forms | allow-scripts)
Content Security Policy
Управление доступом
Идентификация:
Установление идентификационных данных
Аутентификация:
Подтвержденное установление идентификационных
данных
Авторизация:
Назначение прав идентификационным данным
Этапы управления доступом
Сложность паролей
Парольная энтропия:
L=log2(nm),
где n — размер множества допустимых символов,
m — фактическая длина пароля
Эффективность пароля — отношение энтропии к его
фактической длине (в битах).
Увеличение энтропии на 1 бит удваивает максимальное
количество итераций перебора.
Повышение энтропии через увеличение длины пароля
эффективнее, чем через увеличение мощности алфавита.
Сложность паролей
Сложность пароля должна быть ограничена снизу по
энтропии, определенной в требованиях защищенности.
Примеры правил повышения энтропии:
• в качестве исходного алфавита должно использоваться
максимально доступное множество групп символов;
• в пароле должен присутствовать хотя бы один символ из
каждой группы;
• символы, принадлежащие одной и той же группе, не
должны встречаться в пароле на соседних позициях;
• количество символов, принадлежащих каждой из
групп, должно быть одинаково;
• один и тот же символ не должен встречаться в пароле
более одного раза.
Сложность паролей
У пользователя должен быть шанс придумать устойчивый
пароль с первой попытки.
Контроль словарных паролей следует реализовывать без
фанатизма типа «угадай, какого пароля нет в списке TOP
30M интернет-паролей».
Ротации паролей следует избегать, за исключением:
• привилегированных учетных записей;
• стандартных учетных записей.
Сложность паролей
Блокировка аккаунтов после n неудачных попыток входа
=> DoS-условие
Предпочтительнее внедрение временных задержек или
средств анти-автоматизации.
Перебор может осуществляться как по паролям для
конкретного пользователя, так и по пользователям для
конкретного пароля.
Форма аутентификации — один из самых популярных
видов оракулов.
Блокировка учетных записей
Форма восстановления пароля не должна быть оракулом
для получения списка пользователей.
Одно поле для ввода почтового адреса и одно сообщение
об успешной отправке письма со ссылкой для сброса
пароля.
При переходе по ссылке открывается форма для ввода
нового пароля, не предоставляющая пользовательскую
сессию.
Любые другие реализации приводят к возникновению
уязвимостей!
Восстановление паролей
― кодовые слова;
― ссылки для сброса пароля;
― идентификаторы сессии;
― любые другие данные, позволяющие получить
аутентифицированную пользовательскую сессию,
являются аутентификационными эквивалентами паролей,
к конфиденциальности которых должны предъявляться
такие же требования!
Эквиваленты паролей
P = hash(password, salt)
Криптографические функции хэширования не являются
функциями хэширования паролей. Для создания хэшей
паролей следует использовать PBKDF2, bcrypt, scrypt и т.п.
Длина соли должна быть достаточной для обеспечения
энтропии >= 128 бит для любого пароля, допускаемого
политикой защищенности.
Основное предназначение соли — затруднение атак по
словарям и радужным таблицам.
Хранение учетных данных
Самодельная криптография
Энтропия сессионного токена должна быть не ниже 128
бит (генерация токена при помощи SRNG или
шифрования).
Передача токена должна осуществляться в cookie-
параметре с флагами httponly и secure.
После каждой попытки аутентификации или по истечению
таймаута неактивности должен создаваться новый токен, а
старый аннулироваться.
Аннулирование токена должно быть реализовано как на
клиенте, так и на сервере.
Управление сессиями
Пример: фиксация сессии
Пример: фиксация сессии
Весь доступный функционал бизнес-логики должен быть
распределен между ролями явным образом. Гость – тоже
роль.
Презентационный слой:
• раскрытие информации о недоступном функционале
Слой бизнес-логики:
• наличие функционала до выполнения авторизации
Слой данных:
• контроль доступа без учета запрашиваемых данных
Неэффективная авторизация
Пример: обход авторизации
Пример: обход авторизации
Ответ:
{
"d":
{
"__type" : "Customer:#Web",
"Address" : "3 Childers St",
"CustomerID" : "3",
"Email" : "brucec@aol.com",
"FirstName" : "Bruce",
"Postcode" : "3000",
"State" : "VIC",
"Suburb" : "Melbourne"
}
}
Запрос:
Пример: обход авторизации
Предварительная
обработка данных
― Типизация — создание объектного представления
входных данных из строкового типа (парсинг и
десериализация).
― Валидация — проверка данных на соответствие
установленным критериям:
• грамматическая;
• семантическая.
― Санитизация — приведение данных в соответствие с
грамматикой, допускаемой политикой защищенности.
Подходы к предварительной обработке
Типизация и валидация на входе, санитизация — на выходе!
Смотри, не перепутай…
Входные данные — формальный язык.
Некоторые языки распознаются сложнее, чем остальные.
Для некоторых языков распознавание неразрешимо.
Чем сложнее язык, тем тяжелее
сформировать критерии к входным
данным, описывающим множества
конфигураций системы.
Обобщенный подход
Тестирование эквивалентности конечных автоматов или
детерминированных стековых автоматов разрешимо.
Для недетерминированных стековых автоматов и более
мощных моделей вычислений такое тестирование является
неразрешимым.
В первом случае возможно полное покрытие тестами
элементов парсера языка обрабатываемых данных или их
статический анализ.
Во втором случае — НЕТ!
Обобщенный подход
Шаги по реализации защищенной обработке данных:
Упрощение или декомпозиция языка входных данных до
множества регулярных или детерминированных
контекстно-свободных грамматик.
Внедрение в код проверок (типизации/валидации)
входных данных в соответствии с их грамматикой как
можно раньше в цикле обработки запроса.
Внедрение в код санитайзеров выходных
данных, построенных в соответствии с грамматикой
принимающей стороны, как можно ближе к их выходу.
Обобщенный подход
Критерий уязвимости к атакам произвольных инъекций
Способ формирования выходных данных DOUTPUT на основе входных данных
DINPUT уязвим к атакам инъекции, если от содержимого DINPUT зависит
количество узлов в дереве разбора DOUTPUT
Пример применения
Пример: LINQ Injection
public AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort)
{
var query = (from c in this.DBContext.Customers
select new
{
c.CustomerID,
c.CompanyName,
c.ContactName,
c.Phone,
c.Fax,
c.Region
}).OrderBy(string.Concat(sort, " ", dir));
int total = query.ToList().Count;
query = query.Skip(start).Take(limit);
return new AjaxStoreResult(query, total);
}
Пример: LINQ Injection
public AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort)
{
var query = (from c in this.DBContext.Customers
select new
{
c.CustomerID,
c.CompanyName,
c.ContactName,
c.Phone,
c.Fax,
c.Region
}).OrderBy(string.Concat(sort, " ", dir));
int total = query.ToList().Count;
query = query.Skip(start).Take(limit);
return new AjaxStoreResult(query, total);
}
Пример: LINQ Injection
public AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort)
{
if (!Regex.IsMatch(dir, "(?-m:)(?i:)^asc|desc$")) dir = "ASC";
if (!Regex.IsMatch(sort,
"(?-m:)(?i:)^customerid|companyname|contactname|phone|fax|region$"))
sort = "CustomerID";
var query = (from c in this.DBContext.Customers
select new
{
c.CustomerID,
c.CompanyName,
c.ContactName,
c.Phone,
c.Fax,
c.Region
}).OrderBy(string.Concat(sort, " ", dir));
var total = query.ToList().Count;
query = query.Skip(start).Take(limit);
return new AjaxStoreResult(query, total);
}
Пример: LINQ Injection
public AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort)
{
if (!Regex.IsMatch(dir, "(?-m:)(?i:)^asc|desc$")) dir = "ASC";
if (!Regex.IsMatch(sort,
"(?-m:)(?i:)^customerid|companyname|contactname|phone|fax|region$"))
sort = "CustomerID";
var query = (from c in this.DBContext.Customers
select new
{
c.CustomerID,
c.CompanyName,
c.ContactName,
c.Phone,
c.Fax,
c.Region
}).OrderBy(string.Concat(sort, " ", dir));
var total = query.ToList().Count;
query = query.Skip(start).Take(limit);
return new AjaxStoreResult(query, total);
}
Пример: XSS
Фрагмент .aspx-страницы:
<p>You are now leaving this site - we're no longer responsible!</p>
<p><asp:Literal runat="server" ID="litLeavingTag" /></p>
Фрагмент ее code-behind:
var newUrl = Request.QueryString["Url"];
var tagString = "<a href=" + newUrl + ">continue</a>";
litLeavingTag.Text = tagString;
Пример: XSS
Фрагмент .aspx-страницы:
<p>You are now leaving this site - we're no longer responsible!</p>
<p><asp:Literal runat="server" ID="litLeavingTag" /></p>
Фрагмент ее code-behind:
var newUrl = Request.QueryString["Url"];
var tagString = "<a href=" + newUrl + ">continue</a>";
litLeavingTag.Text = tagString;
Результат выполнения запроса
http://host.domain/?url=><script>alert('XSS')</script:
<p><a href=><script>alert('XSS')</script>continue</a></p>
Пример: XSS
Фрагмент .aspx-страницы:
<p>You are now leaving this site - we're no longer responsible!</p>
<p><asp:Literal runat="server" ID="litLeavingTag" /></p>
Фрагмент ее code-behind:
var newUrl = Request.QueryString["Url"];
var tagString = "<a href=" + Server.HtmlEncode(newUrl) + ">continue</a>";
litLeavingTag.Text = tagString;
Пример: XSS
Фрагмент .aspx-страницы:
<p>You are now leaving this site - we're no longer responsible!</p>
<p><asp:Literal runat="server" ID="litLeavingTag" /></p>
Фрагмент ее code-behind:
var newUrl = Request.QueryString["Url"];
var tagString = "<a href=" + Server.HtmlEncode(newUrl) + ">continue</a>";
litLeavingTag.Text = tagString;
Результат выполнения запроса:
http://host.domain/?url=><script>alert('XSS')</script:
<p><a href=&gt;&lt;script&gt;alert('XSS')&lt;/script>continue</a></p>
Демо: как взорвать АЭС через XSS
Управление потоком
операций
Поток операций хорошо описывается через состояния и
правила перехода между ними.
Для всех потоков операций должна быть определена
политика защищенности и реализован ее принудительный
контроль.
Следует избегать появления в потоке операций
рекурсивных путей и циклов, а также учитывать
возможность нарушения целостности разделяемых
данных.
Текущую конфигурацию потока нужно хранить перед
границей доверия, а не за ней.
Контроль целостности потока операций
Аутентичность источника запроса, инициирующего переход
по потоку операций, подлежит принудительному контролю.
Распространенный подход заключается в использовании
двух токенов на каждый запрос (один хранится перед
границей доверия, другой передается за нее) для контроля
аутентичности путем их сравнения.
Реализация контроля необходима только для
запросов, изменяющих состояние системы.
Контроль аутентичности инициатора
операции
Пример: CSRF
Пример: CSRF
Пример: CSRF
...
<input type="button" value="Update status" onclick="return UpdateStatus()" />
...
<script language="javascript" type="text/javascript">
// <![CDATA[ function UpdateStatus()
{
var service = new Web.StatusUpdateService();
var statusUpdate = document.getElementById('txtStatusUpdate').value;
service.UpdateStatus(statusUpdate, onSuccess, null, null);
}
function onSuccess(result)
{
var statusUpdate = document.getElementById('txtStatusUpdate').value = "";
__doPostBack('MainContent_updStatusUpdates', '');
}
// ]]>
</script>
Пример: CSRF
[OperationContract]
public void UpdateStatus(string statusUpdate)
{
if (!HttpContext.Current.User.Identity.IsAuthenticated)
throw new ApplicationException("Not logged on");
var dc = new VulnerableAppDataContext();
dc.Status.InsertOnSubmit(new Status {
StatusID = Guid.NewGuid(),
StatusDate = DateTime.Now,
Username = HttpContext.Current.User.Identity.Name,
StatusUpdate = statusUpdate
});
dc.SubmitChanges();
}
Пример: CSRF
[OperationContract]
public void UpdateStatus(string statusUpdate)
{
if (!HttpContext.Current.User.Identity.IsAuthenticated)
throw new ApplicationException("Not logged on");
var dc = new VulnerableAppDataContext();
dc.Status.InsertOnSubmit(new Status {
StatusID = Guid.NewGuid(),
StatusDate = DateTime.Now,
Username = HttpContext.Current.User.Identity.Name,
StatusUpdate = statusUpdate
});
dc.SubmitChanges();
}
Пример: CSRF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="http://localhost:85/ScriptResource.axd?d=4sSlXLx8QpYnLirlbD...
<script src="http://localhost:85/ScriptResource.axd?d=oW55T29mrRoDmQ0h2E...
<script src="http://localhost:85/StatusUpdateService.svc/jsdebug" type="...
<script language="javascript" type="text/javascript">
// <![CDATA[
var service = new Web.StatusUpdateService();
var statusUpdate = "hacky hacky";
service.UpdateStatus(statusUpdate, null, null, null);
// ]]>
</script>
</head>
<body>
You've been CSRF'd!
</body>
</html>
Пример: CSRF
Пример: CSRF
protected string GetToken()
{
if (Session["Token"] == null)
{
Session["Token"] = Guid.NewGuid();
}
return Session["Token"].ToString();
}
...
function UpdateStatus()
{
var service = new Web.StatusUpdateService();
var statusUpdate = document.getElementById('txtStatusUpdate').value;
var token = "<%= GetToken() %>";
service.UpdateStatus(statusUpdate, token, onSuccess, null, null);
}
...
[OperationContract]
public void UpdateStatus(string statusUpdate, string token)
{
var sessionToken = HttpContext.Current.Session["Token"];
if (sessionToken == null || sessionToken.ToString() != token)
{
throw new ApplicationException("Invalid token");
}
...
Пример: CSRF
protected string GetToken()
{
if (Session["Token"] == null)
{
Session["Token"] = Guid.NewGuid();
}
return Session["Token"].ToString();
}
...
function UpdateStatus()
{
var service = new Web.StatusUpdateService();
var statusUpdate = document.getElementById('txtStatusUpdate').value;
var token = "<%= GetToken() %>";
service.UpdateStatus(statusUpdate, token, onSuccess, null, null);
}
...
[OperationContract]
public void UpdateStatus(string statusUpdate, string token)
{
var sessionToken = HttpContext.Current.Session["Token"];
if (sessionToken == null || sessionToken.ToString() != token)
{
throw new ApplicationException("Invalid token");
}
...
Реализация прочей
бизнес-логики
Потоки операций бизнес-логики должны обладать не
только свойствами необходимости и достаточности для ее
реализации, но также и минимальности.
Любые состояния и правила перехода, реализующие
«чуть» больше функционала, чем это нужно для решаемой
задачи, должны быть упрощены либо ограничены.
<?=@`$c`?>
PHP-калькулятор арифметических выражений (полнота по
Тьюрингу — задел на будущее, код минимален уже сейчас).
Избыточность функционала
Пример: доступ к скрытым данным
var fieldName = Request["field"] ?? "Id";
var minValue = int.Parse(Request["min"]);
var maxValue = int.Parse(Request["max"]);
var queryTemplate = string.Format(
"SELECT Id, Nickname, Rating, MessageCount, TopicCount FROM Users WHERE {0} >= @minValue AND {0} <=
@maxValue ORDER BY {0}",
fieldName.Replace("'", string.Empty).
Replace(" ", string.Empty).
Replace("", string.Empty).
Replace(",", string.Empty).
Replace("(", string.Empty).
Replace(")", string.Empty),
);
var selectCommand = string.Format(queryTemplate, debugStr);
var cmd = new SqlCommand(selectCommand, dataConnection);
cmd.Parameters.Add(new SqlParameter("@minValue", minValue));
cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue));
...
/users/filter.aspx?field={fieldName}&min={minBalue}&max={maxValue}
Пример: доступ к скрытым данным
var fieldName = Request["field"] ?? "Id";
var minValue = int.Parse(Request["min"]);
var maxValue = int.Parse(Request["max"]);
var queryTemplate = string.Format(
"SELECT Id, Nickname, Rating, MessageCount, TopicCount FROM Users WHERE {0} >= @minValue AND {0} <=
@maxValue ORDER BY {0}",
fieldName.Replace("'", string.Empty).
Replace(" ", string.Empty).
Replace("", string.Empty).
Replace(",", string.Empty).
Replace("(", string.Empty).
Replace(")", string.Empty),
);
var selectCommand = string.Format(queryTemplate, debugStr);
var cmd = new SqlCommand(selectCommand, dataConnection);
cmd.Parameters.Add(new SqlParameter("@minValue", minValue));
cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue));
...
http://host.domain/users/filter.aspx?field=password&min=a&max=a
Пример: массовое присваивание
public class User
{
public int Id
{ get; set; }
public string UserName
{ get; set; }
public string Password
{ get; set; }
public bool IsAdmin
{ get; set; }
}
public class UserController : Controller
{
IUserRepository _userRepository;
public UserController(IUserRepository userRepository) {
_userRepository = userRepository;
}
public ActionResult Edit(int id) {
var user = _userRepository.GetUserById(id);
return View(user);
}
[HttpPost]
public ActionResult Edit(int id, FormCollection collection) {
try {
var user = _userRepository.GetUserById(id);
UpdateModel(user);
_userRepository.SaveUser(user);
return RedirectToAction("Index");
} catch {
return View();
}
}
}
Model: Controller:
Пример: массовое присваивание
public class User
{
public int Id
{ get; set; }
public string UserName
{ get; set; }
public string Password
{ get; set; }
public bool IsAdmin
{ get; set; }
}
public class UserController : Controller
{
IUserRepository _userRepository;
public UserController(IUserRepository userRepository) {
_userRepository = userRepository;
}
public ActionResult Edit(int id) {
var user = _userRepository.GetUserById(id);
return View(user);
}
[HttpPost]
public ActionResult Edit(int id, FormCollection collection) {
try {
var user = _userRepository.GetUserById(id);
UpdateModel(user);
_userRepository.SaveUser(user);
return RedirectToAction("Index");
} catch {
return View();
}
}
}
Model: Controller:
Пример: массовое присваивание
public class User
{
public int Id
{ get; set; }
public string UserName
{ get; set; }
public string Password
{ get; set; }
public bool IsAdmin
{ get; set; }
}
public class UserController : Controller
{
IUserRepository _userRepository;
public UserController(IUserRepository userRepository) {
_userRepository = userRepository;
}
public ActionResult Edit(int id) {
var user = _userRepository.GetUserById(id);
return View(user);
}
[HttpPost]
public ActionResult Edit(int id, FormCollection collection) {
try {
var user = _userRepository.GetUserById(id);
TryUpdateModel(user, includeProperties: new[] {
"UserName", "Password"
});
_userRepository.SaveUser(user);
return RedirectToAction("Index");
} catch {
return View();
}
}
}
Model: Controller:
Пример: массовое присваивание
public class User
{
public int Id
{ get; set; }
public string UserName
{ get; set; }
public string Password
{ get; set; }
public bool IsAdmin
{ get; set; }
}
public class UserController : Controller
{
IUserRepository _userRepository;
public UserController(IUserRepository userRepository) {
_userRepository = userRepository;
}
public ActionResult Edit(int id) {
var user = _userRepository.GetUserById(id);
return View(user);
}
[HttpPost]
public ActionResult Edit(int id, FormCollection collection) {
try {
var user = _userRepository.GetUserById(id);
TryUpdateModel(user, includeProperties: new[] {
"UserName", "Password"
});
_userRepository.SaveUser(user);
return RedirectToAction("Index");
} catch {
return View();
}
}
}
Model: Controller:
Security Development
Lifecycle
Microsoft SDL
Рекомендуемые темы:
― Пред-SDL:
• Введение в SDL;
• Основы разработки защищенного ПО с помощью
SDL.
― Фаза выработки требований:
• Защита приватности в разрабатываемом ПО;
Обучение
Рекомендуемые темы
― Фазы проектирования, реализации и тестирования:
• основы защищенного проектирования, разработки и
тестирования;
• введение в моделирование угроз;
• справочник по защищенности;
• SDL Developer Starter Kit.
Обучение
Практики SDL:
― требования к защищенности;
― контрольные условия качества и критерии недостатков;
― оценка рисков защищенности и приватности.
Требования
Практики SDL:
― требования проектирования;
― уменьшение количества возможных направлений атак;
― моделирование угроз.
Проектирование
Практики SDL:
― использование утвержденных инструментов;
― отказ от опасных функций;
― статический анализ.
Реализация
Практики SDL:
― динамический анализ;
― фаззинг;
― анализ модели угроз и возможных направлений атак.
Проверка
Практики SDL:
― План реагирования на инциденты:
• участники;
• стратегия патч-менеджмента;
• планы обеспечения защищенности стороннего кода.
― Окончательная проверка защищенности.
― Выпуск и архив.
Выпуск
Практики SDL:
― Исполнение плана реагирования на инциденты:
• анализ полученной информации об уязвимости;
• оценка риска;
• выпуск патча;
• оповещение клиентов;
• раскрытие информации.
Реагирование
SDL подразумевает линейность процесса
разработки, однако практики SDL хорошо адаптируются к
agile посредством их распределения на три категории:
― Разовые,
выполняются единожды
― Спринтовые,
выполняются в рамках каждого спринта
― Корзинные,
в каждом спринте должна быть
выполнена хотя бы одна практика из
корзины
SDL и Agile
― требования к защищенности;
― оценка рисков защищенности и приватности;
― требования к проектированию;
― уменьшение количества возможных направлений атак;
― план реагирования на инциденты.
Разовые практики
― обучение;
― моделирование угроз;
― использование утвержденных инструментов;
― отказ от опасных функций;
― статический анализ;
― окончательная проверка защищенности;
― выпуск и архив.
Спринтовые практики
― контрольные условия качества и критерии недостатков;
― динамический анализ;
― фаззинг;
― анализ модели угроз и возможных направлений атак.
Корзинные практики
Спасибо за внимание!
Вопросы?
Владимир Кочетков
vkochetkov@ptsecurity.ru
@kochetkov_v
специалист по анализу защищенности веб-приложений
Positive Technologies
В презентации использованы материалы следующих работ:
― “OWASP Top 10 for .NET Developers” by Troy Hunt
― “The Science of Insecurity” by Len Sassaman, Meredith L.
Patterson, Sergey Bratus
― “The Essence of Command Injection Attacks in Web
Applications” by Zhendong Su, Gary Wassermann
― “Modeling Computer Insecurity” by Sophie Engle, Sean
Whalen, Matt Bishop
Copyrights

Mais conteúdo relacionado

Mais procurados

Present pred
Present predPresent pred
Present predssabann
 
тест на проникновение
тест на проникновение тест на проникновение
тест на проникновение a_a_a
 
PT Penetration Testing Report (sample)
PT Penetration Testing Report (sample)PT Penetration Testing Report (sample)
PT Penetration Testing Report (sample)Dmitry Evteev
 
Алгоритмы пентестов. BaltCTF 2012
Алгоритмы пентестов. BaltCTF 2012Алгоритмы пентестов. BaltCTF 2012
Алгоритмы пентестов. BaltCTF 2012beched
 
Цикл безопасной разработки SDL
Цикл безопасной разработки SDLЦикл безопасной разработки SDL
Цикл безопасной разработки SDLAlex Babenko
 
Risk Stories Seminar. XP Injection. Kiev. Ukraine
Risk Stories Seminar. XP Injection. Kiev. UkraineRisk Stories Seminar. XP Injection. Kiev. Ukraine
Risk Stories Seminar. XP Injection. Kiev. UkraineSergiy Povolyashko
 
Безопасная разработка приложений на практике
Безопасная разработка приложений на практикеБезопасная разработка приложений на практике
Безопасная разработка приложений на практикеPointlane
 
Безопасная разработка для руководителей
Безопасная разработка для руководителейБезопасная разработка для руководителей
Безопасная разработка для руководителейPositive Development User Group
 
Жизненный цикл безопасной разработки платежных приложений
Жизненный цикл безопасной разработки платежных приложенийЖизненный цикл безопасной разработки платежных приложений
Жизненный цикл безопасной разработки платежных приложенийRISClubSPb
 
Услуги PT для банков
Услуги PT для банковУслуги PT для банков
Услуги PT для банковDmitry Evteev
 
Демонстрация атаки на ДБО
Демонстрация атаки на ДБОДемонстрация атаки на ДБО
Демонстрация атаки на ДБОDmitry Evteev
 
Построение процесса безопасной разработки - Стачка 2016
Построение процесса безопасной разработки - Стачка 2016Построение процесса безопасной разработки - Стачка 2016
Построение процесса безопасной разработки - Стачка 2016Valery Boronin
 
Моделирование угроз для приложений
Моделирование угроз для приложенийМоделирование угроз для приложений
Моделирование угроз для приложенийSQALab
 
Методические рекомендации по техническому анализу. О. Макарова.
Методические рекомендации по техническому анализу. О. Макарова.Методические рекомендации по техническому анализу. О. Макарова.
Методические рекомендации по техническому анализу. О. Макарова.Expolink
 
Безопасная разработка (СТАЧКА 2015)
Безопасная разработка (СТАЧКА 2015)Безопасная разработка (СТАЧКА 2015)
Безопасная разработка (СТАЧКА 2015)Alexey Kachalin
 
SDL/SSDL для руководителей
SDL/SSDL для руководителейSDL/SSDL для руководителей
SDL/SSDL для руководителейValery Boronin
 
Разработка ПО в рамках PCI DSS
Разработка ПО в рамках PCI DSSРазработка ПО в рамках PCI DSS
Разработка ПО в рамках PCI DSSAlex Babenko
 
этичный хакинг и тестирование на проникновение (Publ)
этичный хакинг и тестирование на проникновение (Publ)этичный хакинг и тестирование на проникновение (Publ)
этичный хакинг и тестирование на проникновение (Publ)Teymur Kheirkhabarov
 

Mais procurados (19)

Present pred
Present predPresent pred
Present pred
 
тест на проникновение
тест на проникновение тест на проникновение
тест на проникновение
 
PT Penetration Testing Report (sample)
PT Penetration Testing Report (sample)PT Penetration Testing Report (sample)
PT Penetration Testing Report (sample)
 
Алгоритмы пентестов. BaltCTF 2012
Алгоритмы пентестов. BaltCTF 2012Алгоритмы пентестов. BaltCTF 2012
Алгоритмы пентестов. BaltCTF 2012
 
Цикл безопасной разработки SDL
Цикл безопасной разработки SDLЦикл безопасной разработки SDL
Цикл безопасной разработки SDL
 
Risk Stories Seminar. XP Injection. Kiev. Ukraine
Risk Stories Seminar. XP Injection. Kiev. UkraineRisk Stories Seminar. XP Injection. Kiev. Ukraine
Risk Stories Seminar. XP Injection. Kiev. Ukraine
 
Безопасная разработка приложений на практике
Безопасная разработка приложений на практикеБезопасная разработка приложений на практике
Безопасная разработка приложений на практике
 
Безопасная разработка для руководителей
Безопасная разработка для руководителейБезопасная разработка для руководителей
Безопасная разработка для руководителей
 
Жизненный цикл безопасной разработки платежных приложений
Жизненный цикл безопасной разработки платежных приложенийЖизненный цикл безопасной разработки платежных приложений
Жизненный цикл безопасной разработки платежных приложений
 
Услуги PT для банков
Услуги PT для банковУслуги PT для банков
Услуги PT для банков
 
Демонстрация атаки на ДБО
Демонстрация атаки на ДБОДемонстрация атаки на ДБО
Демонстрация атаки на ДБО
 
Построение процесса безопасной разработки - Стачка 2016
Построение процесса безопасной разработки - Стачка 2016Построение процесса безопасной разработки - Стачка 2016
Построение процесса безопасной разработки - Стачка 2016
 
Pentest Report Sample
Pentest Report SamplePentest Report Sample
Pentest Report Sample
 
Моделирование угроз для приложений
Моделирование угроз для приложенийМоделирование угроз для приложений
Моделирование угроз для приложений
 
Методические рекомендации по техническому анализу. О. Макарова.
Методические рекомендации по техническому анализу. О. Макарова.Методические рекомендации по техническому анализу. О. Макарова.
Методические рекомендации по техническому анализу. О. Макарова.
 
Безопасная разработка (СТАЧКА 2015)
Безопасная разработка (СТАЧКА 2015)Безопасная разработка (СТАЧКА 2015)
Безопасная разработка (СТАЧКА 2015)
 
SDL/SSDL для руководителей
SDL/SSDL для руководителейSDL/SSDL для руководителей
SDL/SSDL для руководителей
 
Разработка ПО в рамках PCI DSS
Разработка ПО в рамках PCI DSSРазработка ПО в рамках PCI DSS
Разработка ПО в рамках PCI DSS
 
этичный хакинг и тестирование на проникновение (Publ)
этичный хакинг и тестирование на проникновение (Publ)этичный хакинг и тестирование на проникновение (Publ)
этичный хакинг и тестирование на проникновение (Publ)
 

Destaque

ARCHIVO GENERAL DE LA NACION
ARCHIVO GENERAL DE LA NACIONARCHIVO GENERAL DE LA NACION
ARCHIVO GENERAL DE LA NACIONbordaangela
 
Palabras compuestas judith
Palabras compuestas judithPalabras compuestas judith
Palabras compuestas judithfrancalamaslinda
 
Workshop Google Adwords
Workshop Google AdwordsWorkshop Google Adwords
Workshop Google Adwordswilph
 
Presentation of transport tracking system
Presentation of transport tracking systemPresentation of transport tracking system
Presentation of transport tracking systemArchana Negi
 
Iuris leave colour
Iuris leave colourIuris leave colour
Iuris leave colourCrickh10
 
Informativo n° 14 2º básico a- viernes 07 de junio.
Informativo n° 14  2º básico a- viernes 07 de junio.Informativo n° 14  2º básico a- viernes 07 de junio.
Informativo n° 14 2º básico a- viernes 07 de junio.Colegio Camilo Henríquez
 
Sistemas operativos
Sistemas operativosSistemas operativos
Sistemas operativosotamiel
 
NUCCA Case Study Presentation - Post Concussion Syndrome
NUCCA Case Study Presentation - Post Concussion SyndromeNUCCA Case Study Presentation - Post Concussion Syndrome
NUCCA Case Study Presentation - Post Concussion SyndromeJon Chung
 
Chapter i(flash basic)
Chapter i(flash basic)Chapter i(flash basic)
Chapter i(flash basic)Chhom Karath
 
Cervical Arthritis / Cervical Spondylotic Myelopathy / Cervical Stenosis by P...
Cervical Arthritis / Cervical Spondylotic Myelopathy / Cervical Stenosis by P...Cervical Arthritis / Cervical Spondylotic Myelopathy / Cervical Stenosis by P...
Cervical Arthritis / Cervical Spondylotic Myelopathy / Cervical Stenosis by P...Pablo Pazmino
 
6 сценариев взаимодействия с потребителем
6 сценариев взаимодействия с потребителем6 сценариев взаимодействия с потребителем
6 сценариев взаимодействия с потребителемNimax
 

Destaque (18)

ARCHIVO GENERAL DE LA NACION
ARCHIVO GENERAL DE LA NACIONARCHIVO GENERAL DE LA NACION
ARCHIVO GENERAL DE LA NACION
 
Ch1
Ch1Ch1
Ch1
 
Palabras compuestas judith
Palabras compuestas judithPalabras compuestas judith
Palabras compuestas judith
 
Bhakti Vedanta Darshana
Bhakti Vedanta DarshanaBhakti Vedanta Darshana
Bhakti Vedanta Darshana
 
Workshop Google Adwords
Workshop Google AdwordsWorkshop Google Adwords
Workshop Google Adwords
 
Presentation of transport tracking system
Presentation of transport tracking systemPresentation of transport tracking system
Presentation of transport tracking system
 
Iuris leave colour
Iuris leave colourIuris leave colour
Iuris leave colour
 
Winter DDS & Cut Plus - Esite
Winter DDS & Cut Plus - EsiteWinter DDS & Cut Plus - Esite
Winter DDS & Cut Plus - Esite
 
07 06 lesson-02
07 06 lesson-0207 06 lesson-02
07 06 lesson-02
 
JoseOVazquez03
JoseOVazquez03JoseOVazquez03
JoseOVazquez03
 
Informativo n° 14 2º básico a- viernes 07 de junio.
Informativo n° 14  2º básico a- viernes 07 de junio.Informativo n° 14  2º básico a- viernes 07 de junio.
Informativo n° 14 2º básico a- viernes 07 de junio.
 
Plan de comunicación 2.0
Plan de comunicación 2.0 Plan de comunicación 2.0
Plan de comunicación 2.0
 
Sistemas operativos
Sistemas operativosSistemas operativos
Sistemas operativos
 
NUCCA Case Study Presentation - Post Concussion Syndrome
NUCCA Case Study Presentation - Post Concussion SyndromeNUCCA Case Study Presentation - Post Concussion Syndrome
NUCCA Case Study Presentation - Post Concussion Syndrome
 
FF style guide
FF style guideFF style guide
FF style guide
 
Chapter i(flash basic)
Chapter i(flash basic)Chapter i(flash basic)
Chapter i(flash basic)
 
Cervical Arthritis / Cervical Spondylotic Myelopathy / Cervical Stenosis by P...
Cervical Arthritis / Cervical Spondylotic Myelopathy / Cervical Stenosis by P...Cervical Arthritis / Cervical Spondylotic Myelopathy / Cervical Stenosis by P...
Cervical Arthritis / Cervical Spondylotic Myelopathy / Cervical Stenosis by P...
 
6 сценариев взаимодействия с потребителем
6 сценариев взаимодействия с потребителем6 сценариев взаимодействия с потребителем
6 сценариев взаимодействия с потребителем
 

Semelhante a Владимир Кочетков. Как разработать защищенное веб-приложение и не сойти при этом с ума?

Философия Application Security
Философия Application SecurityФилософия Application Security
Философия Application SecurityVladimir Kochetkov
 
Истина где-то рядом или как правильно писать код
Истина где-то рядом или как правильно писать кодИстина где-то рядом или как правильно писать код
Истина где-то рядом или как правильно писать кодSQALab
 
Ломать и строить. PHDays 2015
Ломать и строить. PHDays 2015Ломать и строить. PHDays 2015
Ломать и строить. PHDays 2015Alexey Kachalin
 
Building SOC for business: desires and reality
Building SOC for business: desires and realityBuilding SOC for business: desires and reality
Building SOC for business: desires and realityA1 Belarus
 
Андрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокАндрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокSQALab
 
КЕЙС №1 от «Лаборатории Касперского». «Разработка антивирусного программного ...
КЕЙС №1 от «Лаборатории Касперского». «Разработка антивирусного программного ...КЕЙС №1 от «Лаборатории Касперского». «Разработка антивирусного программного ...
КЕЙС №1 от «Лаборатории Касперского». «Разработка антивирусного программного ...TCenter500
 
Борьба с вредоносным кодом: от базовых мер к целостной стратегии
Борьба с вредоносным кодом: от базовых мер к целостной стратегииБорьба с вредоносным кодом: от базовых мер к целостной стратегии
Борьба с вредоносным кодом: от базовых мер к целостной стратегииAleksey Lukatskiy
 
ЛОМАТЬ И СТРОИТЬ, И СНОВА ЛОМАТЬ
ЛОМАТЬ И СТРОИТЬ, И СНОВА ЛОМАТЬЛОМАТЬ И СТРОИТЬ, И СНОВА ЛОМАТЬ
ЛОМАТЬ И СТРОИТЬ, И СНОВА ЛОМАТЬPositive Hack Days
 
Основной вектор атак — приложения
Основной вектор атак — приложенияОсновной вектор атак — приложения
Основной вектор атак — приложенияЭЛВИС-ПЛЮС
 
Анализ защищенности Web-приложений, выявление уязвимостей в реальных условиях
Анализ защищенности Web-приложений, выявление уязвимостей в реальных условияхАнализ защищенности Web-приложений, выявление уязвимостей в реальных условиях
Анализ защищенности Web-приложений, выявление уязвимостей в реальных условияхDmitry Evteev
 
OWASP: безопасное программирование на PHP.
OWASP: безопасное программирование на PHP.OWASP: безопасное программирование на PHP.
OWASP: безопасное программирование на PHP.EatDog
 
Анализ ИБ и расследование инцидентов ИБ (учебный семинар)
Анализ ИБ и расследование инцидентов ИБ (учебный семинар)Анализ ИБ и расследование инцидентов ИБ (учебный семинар)
Анализ ИБ и расследование инцидентов ИБ (учебный семинар)Alexey Kachalin
 
Информационная безопасность на базе open source: есть ли смысл?
Информационная безопасность на базе open source: есть ли смысл?Информационная безопасность на базе open source: есть ли смысл?
Информационная безопасность на базе open source: есть ли смысл?Aleksey Lukatskiy
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеAndrey Karpov
 
Application Security - ответы на ежедневные вопросы / Сергей Белов (Mail.Ru G...
Application Security - ответы на ежедневные вопросы / Сергей Белов (Mail.Ru G...Application Security - ответы на ежедневные вопросы / Сергей Белов (Mail.Ru G...
Application Security - ответы на ежедневные вопросы / Сергей Белов (Mail.Ru G...Ontico
 
Практика использования Solar inCode
Практика использования Solar inCodeПрактика использования Solar inCode
Практика использования Solar inCodeSolar Security
 
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиSAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиAndrey Karpov
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 

Semelhante a Владимир Кочетков. Как разработать защищенное веб-приложение и не сойти при этом с ума? (20)

Secure development
Secure developmentSecure development
Secure development
 
Философия Application Security
Философия Application SecurityФилософия Application Security
Философия Application Security
 
пр Лучшие практики SOC
пр Лучшие практики SOCпр Лучшие практики SOC
пр Лучшие практики SOC
 
Истина где-то рядом или как правильно писать код
Истина где-то рядом или как правильно писать кодИстина где-то рядом или как правильно писать код
Истина где-то рядом или как правильно писать код
 
Ломать и строить. PHDays 2015
Ломать и строить. PHDays 2015Ломать и строить. PHDays 2015
Ломать и строить. PHDays 2015
 
Building SOC for business: desires and reality
Building SOC for business: desires and realityBuilding SOC for business: desires and reality
Building SOC for business: desires and reality
 
Андрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокАндрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибок
 
КЕЙС №1 от «Лаборатории Касперского». «Разработка антивирусного программного ...
КЕЙС №1 от «Лаборатории Касперского». «Разработка антивирусного программного ...КЕЙС №1 от «Лаборатории Касперского». «Разработка антивирусного программного ...
КЕЙС №1 от «Лаборатории Касперского». «Разработка антивирусного программного ...
 
Борьба с вредоносным кодом: от базовых мер к целостной стратегии
Борьба с вредоносным кодом: от базовых мер к целостной стратегииБорьба с вредоносным кодом: от базовых мер к целостной стратегии
Борьба с вредоносным кодом: от базовых мер к целостной стратегии
 
ЛОМАТЬ И СТРОИТЬ, И СНОВА ЛОМАТЬ
ЛОМАТЬ И СТРОИТЬ, И СНОВА ЛОМАТЬЛОМАТЬ И СТРОИТЬ, И СНОВА ЛОМАТЬ
ЛОМАТЬ И СТРОИТЬ, И СНОВА ЛОМАТЬ
 
Основной вектор атак — приложения
Основной вектор атак — приложенияОсновной вектор атак — приложения
Основной вектор атак — приложения
 
Анализ защищенности Web-приложений, выявление уязвимостей в реальных условиях
Анализ защищенности Web-приложений, выявление уязвимостей в реальных условияхАнализ защищенности Web-приложений, выявление уязвимостей в реальных условиях
Анализ защищенности Web-приложений, выявление уязвимостей в реальных условиях
 
OWASP: безопасное программирование на PHP.
OWASP: безопасное программирование на PHP.OWASP: безопасное программирование на PHP.
OWASP: безопасное программирование на PHP.
 
Анализ ИБ и расследование инцидентов ИБ (учебный семинар)
Анализ ИБ и расследование инцидентов ИБ (учебный семинар)Анализ ИБ и расследование инцидентов ИБ (учебный семинар)
Анализ ИБ и расследование инцидентов ИБ (учебный семинар)
 
Информационная безопасность на базе open source: есть ли смысл?
Информационная безопасность на базе open source: есть ли смысл?Информационная безопасность на базе open source: есть ли смысл?
Информационная безопасность на базе open source: есть ли смысл?
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в коде
 
Application Security - ответы на ежедневные вопросы / Сергей Белов (Mail.Ru G...
Application Security - ответы на ежедневные вопросы / Сергей Белов (Mail.Ru G...Application Security - ответы на ежедневные вопросы / Сергей Белов (Mail.Ru G...
Application Security - ответы на ежедневные вопросы / Сергей Белов (Mail.Ru G...
 
Практика использования Solar inCode
Практика использования Solar inCodeПрактика использования Solar inCode
Практика использования Solar inCode
 
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиSAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 

Mais de Positive Hack Days

Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesИнструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesPositive Hack Days
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerPositive Hack Days
 
Типовая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesТиповая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesPositive Hack Days
 
Аналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikАналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikPositive Hack Days
 
Использование анализатора кода SonarQube
Использование анализатора кода SonarQubeИспользование анализатора кода SonarQube
Использование анализатора кода SonarQubePositive Hack Days
 
Развитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityРазвитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityPositive Hack Days
 
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Positive Hack Days
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для ApproofPositive Hack Days
 
Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Positive Hack Days
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложенийPositive Hack Days
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложенийPositive Hack Days
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application SecurityPositive Hack Days
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летPositive Hack Days
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиPositive Hack Days
 
Требования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОТребования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОPositive Hack Days
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CorePositive Hack Days
 
SOC для КИИ: израильский опыт
SOC для КИИ: израильский опытSOC для КИИ: израильский опыт
SOC для КИИ: израильский опытPositive Hack Days
 
Honeywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterHoneywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterPositive Hack Days
 
Credential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиCredential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиPositive Hack Days
 

Mais de Positive Hack Days (20)

Инструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release NotesИнструмент ChangelogBuilder для автоматической подготовки Release Notes
Инструмент ChangelogBuilder для автоматической подготовки Release Notes
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows Docker
 
Типовая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive TechnologiesТиповая сборка и деплой продуктов в Positive Technologies
Типовая сборка и деплой продуктов в Positive Technologies
 
Аналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + QlikАналитика в проектах: TFS + Qlik
Аналитика в проектах: TFS + Qlik
 
Использование анализатора кода SonarQube
Использование анализатора кода SonarQubeИспользование анализатора кода SonarQube
Использование анализатора кода SonarQube
 
Развитие сообщества Open DevOps Community
Развитие сообщества Open DevOps CommunityРазвитие сообщества Open DevOps Community
Развитие сообщества Open DevOps Community
 
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
Методика определения неиспользуемых ресурсов виртуальных машин и автоматизаци...
 
Автоматизация построения правил для Approof
Автоматизация построения правил для ApproofАвтоматизация построения правил для Approof
Автоматизация построения правил для Approof
 
Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»Мастер-класс «Трущобы Application Security»
Мастер-класс «Трущобы Application Security»
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Эвристические методы защиты приложений
Эвристические методы защиты приложенийЭвристические методы защиты приложений
Эвристические методы защиты приложений
 
Теоретические основы Application Security
Теоретические основы Application SecurityТеоретические основы Application Security
Теоретические основы Application Security
 
От экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 летОт экспериментального программирования к промышленному: путь длиной в 10 лет
От экспериментального программирования к промышленному: путь длиной в 10 лет
 
Уязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на граблиУязвимое Android-приложение: N проверенных способов наступить на грабли
Уязвимое Android-приложение: N проверенных способов наступить на грабли
 
Требования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПОТребования по безопасности в архитектуре ПО
Требования по безопасности в архитектуре ПО
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Механизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET CoreМеханизмы предотвращения атак в ASP.NET Core
Механизмы предотвращения атак в ASP.NET Core
 
SOC для КИИ: израильский опыт
SOC для КИИ: израильский опытSOC для КИИ: израильский опыт
SOC для КИИ: израильский опыт
 
Honeywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services CenterHoneywell Industrial Cyber Security Lab & Services Center
Honeywell Industrial Cyber Security Lab & Services Center
 
Credential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атакиCredential stuffing и брутфорс-атаки
Credential stuffing и брутфорс-атаки
 

Владимир Кочетков. Как разработать защищенное веб-приложение и не сойти при этом с ума?

  • 1. Как разработать защищенное веб-приложение и не сойти при этом с ума? Владимир Кочетков специалист по анализу защищенности веб-приложений Positive Technologies Positive Hack Days III
  • 3. ― Эффективная разработка защищенного кода требует изменений в образе мышления вовлеченных участников. ― Существующие обучающие ресурсы навязывают изучение причин по их следствиям и противодействие следствиям вместо устранения причин. ― Следуя общепринятым подходам, разработчик должен стать квалифицированным пентестером, чтобы начать писать защищенный код. Это НЕ РАБОТАЕТ! Почему?
  • 4. GET /api/shop/discount?shopId=3&productId=1584&coupon=1y3z9 HTTP/1.1 Host: superdupershop.com Cookie: ASP.NET_SessionId=10g5o4zjkmbd2i552d5j3255;.ASPXAUTH= f2d345118221742ee0316d4080a53af014eb8a3161db421d36aa6a86ffea6781b558 4f4157ec85ae5956cfc54cc93c34a3f9449c8ef4c70b5b54d46e0def3677cce9a810 5340b8ccc6c8e64dfa37ae953f987517 Внимание, черный ящик!
  • 5. var shopId = Request["shopId"]; var productId = Request["productId"]; var coupon = Request["coupon"]; var couponPattern = string.Format("{0}-{1}-{2}", shopId, productId, coupon); var sqlCommandTxt = string.Format(" SELECT value FROM Discounts WHERE coupon LIKE {0}", coupon); var cmd = new SqlCommand(sqlCommandTxt, dataConnection); // Execute query, process result etc... Внимание, белый ящик!
  • 6. var shopId = Request["shopId"]; var productId = Request["productId"]; var coupon = Request["coupon"]; var couponPattern = string.Format("{0}-{1}-{2}", shopId, productId, coupon); var cmd = new SqlCommand("SELECT * FROM Discounts WHERE coupon LIKE @couponPattern", dataConnection); cmd.Parameters.Add(new SqlParameter("@couponPattern", couponPattern)); // Execute query, process result etc... Уязвимости устранены?
  • 7. var shopId = 0; if (!int.TryParse(Request["shopId"], out shopId)) { throw new InvalidArgumentException(); } var productId = 0; if (!int.TryParse(Request["productId"], out productId)) { throw new InvalidArgumentException(); } var coupon = Request["coupon"]; if (!Regex.IsMatch(coupon, "^[A-Za-z0-9]{5}$")) { throw new InvalidArgumentException(); } var couponPattern = string.Format("{0}-{1}-{2}", shopId, productId, coupon); var cmd = new SqlCommand("SELECT * FROM Discounts WHERE coupon=@couponPattern", dataConnection); cmd.Parameters.Add(new SqlParameter("@couponPattern", couponPattern)); // Execute query, process result etc... Теперь– да!
  • 9. ИС защищена, если не нарушен ряд свойств всех ее информационных потоков: • модель CIA: —конфиденциальность —доступность —целостность • модель STRIDE – CIA плюс: —аутентифицированность —авторизованность —неотказуемость Защищенная ИС
  • 10. ― То, что может сделать с информацией атакующий, называется угрозой (threat) ― То, благодаря чему он может это сделать, называется уязвимостью (vulnerability), обусловленной недостатком (weakness) ― То, как он может это сделать, называется атакой (attack) ― То, с какой вероятностью у него это удастся и какие последствия может повлечь, называется риском (risk) ― То, что не позволяет атакующему провести атаку, обеспечивает защищенность (security) ― То, что минимизирует риск, обеспечивает безопасность (safety) Памятка по терминам ИБ
  • 11. Причины и следствия Недостаток Угроза Уязвимость Атака Риск Незащищенность Небезопасность Бороться необходимо с причинами, а не со следствиями!
  • 12. Почему борьба с атаками сложнее, чем с недостатками или ASP.NET Request Validation versus IRV http://habrahabr.ru/company/pt/blog/178357/ Демо
  • 14. ― Фокус на функциональных требованиях ― Знает о: • 10 рисках (OWASP Top 10) • 1 угрозе (срыв дедлайна) • Недостатки? Нет, не слышал ― Сконцентрирован на рисках «I know when I’m writing code I’m not thinking about evil, I’m just trying to think about functionality» (с) Scott Hanselman “Разработчик”
  • 15. * на основе результатов опроса http://www.rsdn.ru/?poll/3488 Осведомленность разработчиков* 0.00% 10.00% 20.00% 30.00% 40.00% 50.00% 60.00% 70.00% 80.00% 90.00% AbuseofFunctionality BruteForce Buffer/FormatStringOverflow ContentSpoofing Credential/SessionPrediction Cross-SiteRequestForgery Cross-SiteScripting DenialofService Fingerprinting HPP/HPC HRS IntegerOverflows LDAPInjection MailCommandInjection NullByteInjection OSCommanding PathTraversal PredictableResourceLocation Remote/LocalFileInclusion RoutingDetour SessionFixation SOAPArrayAbuse SQLInjection SSIInjection URLRedirectorAbuse XMLAttributeBlowup XMLEntityExpansion XMLExternalEntities XMLInjection XPath/XQueryInjection Attacks based on WASC classification Attacks included at OWASP Top 10 risks
  • 16. Риски — для менеджеров… … не для разработчиков!
  • 17. “Безопасник” ― Фокус на требованиях к защищенности ― Отличает атаки от уязвимостей  ― Сконцентрирован на уязвимостях «If you don't understand the business, you can't see business logic flaws.» (с) OWASP
  • 19. Рефакторинг образа мышления ― «Разработчик»: • выбросить из головы все хит-парады безопасности • сконцентрироваться на недостатках ― «Безопасник»: • взаимодействовать с разработчиками • учитывать специфику функционала • сконцентрироваться на уязвимостях
  • 22. Математическая абстракция, представляющая универсальную вычислительную машину. ― Машина Тьюринга состоит из: • бесконечной ячеистой ленты; • управляющего устройства с конечным числом состояний; • таблицы переходов между состояниями. ― На каждой итерации можно: • изменить текущую ячейку; • перейти в другое состояние; • переместиться на соседнюю ячейку. Машина Тьюринга
  • 23. МТ: семерка M=(Q,Γ,b,Σ,δ,q0,F)где: Q - конечное непустое множество состояний; Γ - конечное непустое множество символов алфавита; b∈Γ - пустой символ; Σ⊆Γ∖b - множество входных символов; q0∈Q - начальное состояние; F⊆Q - множество финальных состояний; δ:Q∖F Γ → Q Γ {L,R} - частичная функция перехода, где: • L- сдвиг по ленте влево • R - сдвиг по ленте вправо Формальное определение
  • 24. Теорема останова: не существует алгоритма, способного определить, остановится ли программа на заданном наборе данных; Теорема Клини о неподвижной точке: не существует алгоритма, преобразующего программы, который бы по каждой программе давал другую, не эквивалентную ей; Теорема Успенского-Райса: не существует алгоритма, разрешающего нетривиальные свойства программ; Пределы МТ
  • 25. Удаление всех вхождений символа «a» Что произойдет, если входная строка будет содержать пустой символ или ‘#’? Демо ?
  • 26. Машина с состояниями, в которой: ― функции перехода и/или множество состояний искажены входными данными; ― на каждой итерации происходит непредсказуемый переход в некорректное состояние. Эксплуатация weird-машины может дать полный или частичный контроль над исходной машиной. Weird-машина
  • 27. Конфигурация: состояние, содержимое ленты, позиция на ленте. Условная политика: множество конфигураций, не приводящих к реализации информационных угроз, разрешенных при определенных условиях, которому удовлетворяет текущее состояние или содержимое ленты. Политика защищенности: объединение условных политик. Защищенная МТ: машина, все конфигурации времени выполнения которой удовлетворяют политике защищенности. Защищенная МТ
  • 28. Двойка (V, C), где: ― V - неавторизованная конфигурация, нарушающая политику защищенности; ― C- последовательность условий, описывающих историю вычисления, приводящую к V. Уязвимость
  • 29. Полная модель ЗМТ «and we need to go deeper» (с)
  • 30. "Modeling Computer Insecurity" (Sophie Engle, Sean Whalen and Matt Bishop): провести полную динамическую оценку защищенности программы можно, только выполнив ее на всех возможных наборах входных данных. Разработка защищенного кода менее трудоемкий процесс, чем анализ защищенности уже существующего кода. Вычислимость проблемы защищенности Статическая оценка защищенности программы, даже в соответствии с определенной для нее политикой, является неразрешимой проблемой. Определение соответствия текущей конфигурации политике защищенности, очевидно, разрешимо
  • 31. Семантика любого дискретного процесса может быть описана в виде множества состояний и условий перехода между ними. Зачем все это?!
  • 32. Критерии к входным данным, приводящие процесс к тому или иному состоянию, формируют множества конфигураций ИС. Зачем все это?!
  • 33. Политика защищенности формируется в результате анализа модели угроз и выделения неавторизованных конфигураций, приводящих к реализации любой из выявленных угроз. Устранение неавторизованных конфигураций формируют комплекс контрмер по обеспечению защищенности ИС, любые другие действия, оперирующие «степенью неавторизованности» формируют комплекс контрмер по обеспечению безопасности ИС. Разработка кода в соответствии с политикой защищенности: security driven development Зачем все это?!
  • 34. Для типовых строительных блоков веб-приложений контрмеры по обеспечению их защищенности уже сформулированы как результат эволюции. На их основе выработан набор практик, следуя которым можно избежать появления недостатков в архитектуре и реализации веб-приложения. Хорошие новости Построение политики защищенности обычно необходимо только для реализации слоя бизнес- логики, чтобы избежать появления логических недостатков.
  • 36. Что? Процесс обнаружения угроз в разрабатываемом приложении Кто? Архитекторы и разработчики Когда? Чем раньше, тем лучше Зачем? Чтобы выявить недостатки в архитектуре или модели предметной области, которые могут стать уязвимостями Основы
  • 38. Построение или уточнение DFD Элемент Обозначение Примеры Внешняя сущность Пользователи Внешние системы Процесс Исполняемые файлы Компоненты Службы Веб-сервисы Поток данных Вызов функции Сетевой трафик Хранилище данных База данных Файл Структуры данных Границы доверия Процессная Машинная
  • 40. Дальнейшая декомпозиция модели требуется, если: ― описаны не все потоки, проходящие через границы доверия; ― существуют неявные объекты, пересекающие границы доверия; ― словесное описание модели требует употребления слов «иногда», «а также», «за исключением» и т.п.: • «Иногда, это хранилище данных используется в качестве…» требует добавления в диаграмму второго хранилища • «Этот поток данных всегда используется для передачи бизнес-сущностей, за исключением этапа аутентификации» требует добавления дополнительного потока Построение или уточнение DFD
  • 42. ― Контекстная • Цельные компоненты / продукты / системы ― 1-го уровня • Отдельные функциональные возможности или сценарии ― 2-го уровня • Функциональные возможности, разбитые на компоненты ― 3-го уровня • Полная декомпозиция, детально описывающая архитектуру или модель предметной области Детальность DFD
  • 43. ― Конечным источником потока данных может являться внешняя сущность, хранилище или процесс, который его создает. ― Если в DFD присутствуют потоки данных, предназначенные только для записи, то в 90% случаев это говорит о ее неполноте. ― Потоки данных не могут передаваться от хранилища к хранилищу напрямую, передача возможна только через процессы. ― DFD должна описывать архитектуру или модель предметной области, а не их реализацию («нет» блок- схемам, диаграммам классов и графам вызовов). Правила построения DFD
  • 44. Модель STRIDE описывает угрозы нарушения 6 свойств информационных потоков. Не требует знаний уровня эксперта для ее построения. Идентификация угроз Угроза Свойство Spoofing Аутентифицированность Tampering Целостность Repudiation Неотказуемость Information Disclosure Конфиденциальность Denial of Service Доступность Elevation of privilege Авторизованность
  • 45. Для каждого элемента DFD специфичен свой набор угроз. * Repudiation специфична только для хранилищ, ведущих журнал транзакций Специфичность угроз Элемент S T R I D E √ √ √ √ √ √ √ √ √ √ √ √ ?* √ √
  • 46. Выработка контрмер —конечная цель моделирования угроз. Контрмера для каждой угрозы должна сводиться к: ― редизайну или пересмотру требований (концентрация на угрозах); ― выделению конфигураций, приводящих к реализации угрозы и принятию мер по устранению причин их возникновения (концентрация на уязвимости/недостатке); ― формированию требований к внешней среде для устранения возможности эксплуатации уязвимости (концентрация на атаке) или снижения вероятности успешной атаки и минимизации ущерба (концентрация на рисках). Выработка контрмер
  • 47. Осуществляется на протяжении всего цикла разработки. ― Модель соответствует текущей реализации? ― Перечислены все угрозы? • минимум: элементы, пересекающие границы доверия. ― Контрмеры выработаны для каждой угрозы? ― Контрмеры реализованы корректно? Валидация модели
  • 48. Построение модели угроз для типового веб-приложения Пример
  • 50. Secure by Design, by Default and in Deployment ― реализация принципа наименьших прав и привилегий; ― минимальный набор включенного функционала; ― принудительное изменение стандартных учетных данных; ― проектирование каждого компонента, исходя из предполагаемой компрометации всех остальных. Принцип SD3
  • 52. - HTTP через SSL/TLS. Предназначен для обеспечения: ― конфиденциальности и целостности данных, передаваемых по HTTP; ― аутентичности стороны сервера (реже – и клиента). Или иными словами для защиты от атак класса MitM. HTTPS
  • 53. Статические ресурсы, используемые в документе, который передается по HTTPS: ― таблицы стилей, ― сценарии, ― объекты, также должны передаваться по защищенному каналу! Использование смешанного контента
  • 54. Популярные подходы: - HTTP по умолчанию, HTTPS по выбору пользователя, - HTTP везде, критические точки входа через HTTPS, неэффективны и подвержены атакам SSL Stripping. Неэффективная передача данных
  • 55. Частично противодействовать им можно, используя: ― site-wide HTTPS без опционального HTTP, ― HTTP-заголовок: Strict-Transport-Security: max- age=expireTime [; includeSubdomains] при условии, что первый раз пользователь попадет на сайт по протоколу HTTPS. Неэффективная передача данных
  • 56. - использование 2048-битного ключа; - защита закрытой части ключа; - эффективное покрытие доменов; - использование проверенного CA; - настройка валидной цепочки сертификатов; - использование защищенных протоколов; - использование защищенных наборов шифрования; - контроль автоматического выбора набора шифрования; - отключение инициации renegotiation клиентом; - устранение известных проблем (BEAST, CRIME). https://www.ssllabs.com/projects/best-practices/ Практики этапа развертывания
  • 59. Коды ответа: Раскрытие информации <customErrors mode="On" /> <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/Error.aspx" />
  • 60. Оракул — weird-машина, отвечающая на вопросы атакующего в рамках своего функционала. Наиболее известный пример: оракул дополнения. Создание оракулов
  • 61. ― Использование собственных обработчиков ошибок и представлений с универсальными сообщениями о них. ― Реализация транзакционности на уровне: • методов (try-catch-finally); • состояний рабочего потока. ― Исключение побочных каналов: • кодов HTTP-ошибок; • временных задержек. Практики обработки ошибок
  • 63. ― X-Content-Type-Options {nosniff} отключает распознавание MIME-типа в IE (http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8- security-part-v-comprehensive-protection.aspx) ― X-XSS-Protection {0 | 1 | 1; mode=block} управляет XSS- фильтром в IE (http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/ controlling-the-internet-explorer-xss-filter-with-the-x-xss- protection-http-header.aspx) 4 HTTP-заголовка
  • 64. ― X-Frame-Options {DENY | SAMEORIGIN | ALLOW-FROM uri} определяет возможность открытия документа во фрейме (http://tools.ietf.org/html/draft-ietf-websec-x-frame- options-00) ― X-Content-Security-Policy | Content-Security-Policy | X- WebKit-CSP {…} определяет политику защищенности контента (Content Security Policy, CSP https://dvcs.w3.org/hg/content-security-policy/raw- file/tip/csp-specification.dev.html) 4 HTTP-заголовка
  • 65. Как разработчики используют CSP 0% 93% 7% Используете ли вы CSP для защиты своих веб- приложений? Да Нет, узнал о CSP из этого голосования Нет, о CSP знал и раньше * на основе результатов опроса http://www.rsdn.ru/?poll/33884 по состоянию на 20 мая 2013 года.
  • 66. Основные поддерживаемые директивы: ― (connect|font|frame|img|media|object|script|style)-src uri ограничивает URI, к которым можно обратиться из тегов документа ― default-src uri определяет умолчания для всех src- директив ― report-uri uri определяет URI для сообщений о нарушениях политики ― sandbox flags определяет песочницу для элементов iframe, ограничивающую множество состояний их содержимого (где flags: allow-same-origin | allow-top- navigation | allow-forms | allow-scripts) Content Security Policy
  • 68. Идентификация: Установление идентификационных данных Аутентификация: Подтвержденное установление идентификационных данных Авторизация: Назначение прав идентификационным данным Этапы управления доступом
  • 70. Парольная энтропия: L=log2(nm), где n — размер множества допустимых символов, m — фактическая длина пароля Эффективность пароля — отношение энтропии к его фактической длине (в битах). Увеличение энтропии на 1 бит удваивает максимальное количество итераций перебора. Повышение энтропии через увеличение длины пароля эффективнее, чем через увеличение мощности алфавита. Сложность паролей
  • 71. Сложность пароля должна быть ограничена снизу по энтропии, определенной в требованиях защищенности. Примеры правил повышения энтропии: • в качестве исходного алфавита должно использоваться максимально доступное множество групп символов; • в пароле должен присутствовать хотя бы один символ из каждой группы; • символы, принадлежащие одной и той же группе, не должны встречаться в пароле на соседних позициях; • количество символов, принадлежащих каждой из групп, должно быть одинаково; • один и тот же символ не должен встречаться в пароле более одного раза. Сложность паролей
  • 72. У пользователя должен быть шанс придумать устойчивый пароль с первой попытки. Контроль словарных паролей следует реализовывать без фанатизма типа «угадай, какого пароля нет в списке TOP 30M интернет-паролей». Ротации паролей следует избегать, за исключением: • привилегированных учетных записей; • стандартных учетных записей. Сложность паролей
  • 73. Блокировка аккаунтов после n неудачных попыток входа => DoS-условие Предпочтительнее внедрение временных задержек или средств анти-автоматизации. Перебор может осуществляться как по паролям для конкретного пользователя, так и по пользователям для конкретного пароля. Форма аутентификации — один из самых популярных видов оракулов. Блокировка учетных записей
  • 74. Форма восстановления пароля не должна быть оракулом для получения списка пользователей. Одно поле для ввода почтового адреса и одно сообщение об успешной отправке письма со ссылкой для сброса пароля. При переходе по ссылке открывается форма для ввода нового пароля, не предоставляющая пользовательскую сессию. Любые другие реализации приводят к возникновению уязвимостей! Восстановление паролей
  • 75. ― кодовые слова; ― ссылки для сброса пароля; ― идентификаторы сессии; ― любые другие данные, позволяющие получить аутентифицированную пользовательскую сессию, являются аутентификационными эквивалентами паролей, к конфиденциальности которых должны предъявляться такие же требования! Эквиваленты паролей
  • 76. P = hash(password, salt) Криптографические функции хэширования не являются функциями хэширования паролей. Для создания хэшей паролей следует использовать PBKDF2, bcrypt, scrypt и т.п. Длина соли должна быть достаточной для обеспечения энтропии >= 128 бит для любого пароля, допускаемого политикой защищенности. Основное предназначение соли — затруднение атак по словарям и радужным таблицам. Хранение учетных данных
  • 78. Энтропия сессионного токена должна быть не ниже 128 бит (генерация токена при помощи SRNG или шифрования). Передача токена должна осуществляться в cookie- параметре с флагами httponly и secure. После каждой попытки аутентификации или по истечению таймаута неактивности должен создаваться новый токен, а старый аннулироваться. Аннулирование токена должно быть реализовано как на клиенте, так и на сервере. Управление сессиями
  • 81. Весь доступный функционал бизнес-логики должен быть распределен между ролями явным образом. Гость – тоже роль. Презентационный слой: • раскрытие информации о недоступном функционале Слой бизнес-логики: • наличие функционала до выполнения авторизации Слой данных: • контроль доступа без учета запрашиваемых данных Неэффективная авторизация
  • 83. Пример: обход авторизации Ответ: { "d": { "__type" : "Customer:#Web", "Address" : "3 Childers St", "CustomerID" : "3", "Email" : "brucec@aol.com", "FirstName" : "Bruce", "Postcode" : "3000", "State" : "VIC", "Suburb" : "Melbourne" } } Запрос:
  • 86. ― Типизация — создание объектного представления входных данных из строкового типа (парсинг и десериализация). ― Валидация — проверка данных на соответствие установленным критериям: • грамматическая; • семантическая. ― Санитизация — приведение данных в соответствие с грамматикой, допускаемой политикой защищенности. Подходы к предварительной обработке
  • 87. Типизация и валидация на входе, санитизация — на выходе! Смотри, не перепутай…
  • 88. Входные данные — формальный язык. Некоторые языки распознаются сложнее, чем остальные. Для некоторых языков распознавание неразрешимо. Чем сложнее язык, тем тяжелее сформировать критерии к входным данным, описывающим множества конфигураций системы. Обобщенный подход
  • 89. Тестирование эквивалентности конечных автоматов или детерминированных стековых автоматов разрешимо. Для недетерминированных стековых автоматов и более мощных моделей вычислений такое тестирование является неразрешимым. В первом случае возможно полное покрытие тестами элементов парсера языка обрабатываемых данных или их статический анализ. Во втором случае — НЕТ! Обобщенный подход
  • 90. Шаги по реализации защищенной обработке данных: Упрощение или декомпозиция языка входных данных до множества регулярных или детерминированных контекстно-свободных грамматик. Внедрение в код проверок (типизации/валидации) входных данных в соответствии с их грамматикой как можно раньше в цикле обработки запроса. Внедрение в код санитайзеров выходных данных, построенных в соответствии с грамматикой принимающей стороны, как можно ближе к их выходу. Обобщенный подход
  • 91. Критерий уязвимости к атакам произвольных инъекций Способ формирования выходных данных DOUTPUT на основе входных данных DINPUT уязвим к атакам инъекции, если от содержимого DINPUT зависит количество узлов в дереве разбора DOUTPUT Пример применения
  • 92. Пример: LINQ Injection public AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort) { var query = (from c in this.DBContext.Customers select new { c.CustomerID, c.CompanyName, c.ContactName, c.Phone, c.Fax, c.Region }).OrderBy(string.Concat(sort, " ", dir)); int total = query.ToList().Count; query = query.Skip(start).Take(limit); return new AjaxStoreResult(query, total); }
  • 93. Пример: LINQ Injection public AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort) { var query = (from c in this.DBContext.Customers select new { c.CustomerID, c.CompanyName, c.ContactName, c.Phone, c.Fax, c.Region }).OrderBy(string.Concat(sort, " ", dir)); int total = query.ToList().Count; query = query.Skip(start).Take(limit); return new AjaxStoreResult(query, total); }
  • 94. Пример: LINQ Injection public AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort) { if (!Regex.IsMatch(dir, "(?-m:)(?i:)^asc|desc$")) dir = "ASC"; if (!Regex.IsMatch(sort, "(?-m:)(?i:)^customerid|companyname|contactname|phone|fax|region$")) sort = "CustomerID"; var query = (from c in this.DBContext.Customers select new { c.CustomerID, c.CompanyName, c.ContactName, c.Phone, c.Fax, c.Region }).OrderBy(string.Concat(sort, " ", dir)); var total = query.ToList().Count; query = query.Skip(start).Take(limit); return new AjaxStoreResult(query, total); }
  • 95. Пример: LINQ Injection public AjaxStoreResult GetCustomers(int limit, int start, string dir, string sort) { if (!Regex.IsMatch(dir, "(?-m:)(?i:)^asc|desc$")) dir = "ASC"; if (!Regex.IsMatch(sort, "(?-m:)(?i:)^customerid|companyname|contactname|phone|fax|region$")) sort = "CustomerID"; var query = (from c in this.DBContext.Customers select new { c.CustomerID, c.CompanyName, c.ContactName, c.Phone, c.Fax, c.Region }).OrderBy(string.Concat(sort, " ", dir)); var total = query.ToList().Count; query = query.Skip(start).Take(limit); return new AjaxStoreResult(query, total); }
  • 96. Пример: XSS Фрагмент .aspx-страницы: <p>You are now leaving this site - we're no longer responsible!</p> <p><asp:Literal runat="server" ID="litLeavingTag" /></p> Фрагмент ее code-behind: var newUrl = Request.QueryString["Url"]; var tagString = "<a href=" + newUrl + ">continue</a>"; litLeavingTag.Text = tagString;
  • 97. Пример: XSS Фрагмент .aspx-страницы: <p>You are now leaving this site - we're no longer responsible!</p> <p><asp:Literal runat="server" ID="litLeavingTag" /></p> Фрагмент ее code-behind: var newUrl = Request.QueryString["Url"]; var tagString = "<a href=" + newUrl + ">continue</a>"; litLeavingTag.Text = tagString; Результат выполнения запроса http://host.domain/?url=><script>alert('XSS')</script: <p><a href=><script>alert('XSS')</script>continue</a></p>
  • 98. Пример: XSS Фрагмент .aspx-страницы: <p>You are now leaving this site - we're no longer responsible!</p> <p><asp:Literal runat="server" ID="litLeavingTag" /></p> Фрагмент ее code-behind: var newUrl = Request.QueryString["Url"]; var tagString = "<a href=" + Server.HtmlEncode(newUrl) + ">continue</a>"; litLeavingTag.Text = tagString;
  • 99. Пример: XSS Фрагмент .aspx-страницы: <p>You are now leaving this site - we're no longer responsible!</p> <p><asp:Literal runat="server" ID="litLeavingTag" /></p> Фрагмент ее code-behind: var newUrl = Request.QueryString["Url"]; var tagString = "<a href=" + Server.HtmlEncode(newUrl) + ">continue</a>"; litLeavingTag.Text = tagString; Результат выполнения запроса: http://host.domain/?url=><script>alert('XSS')</script: <p><a href=&gt;&lt;script&gt;alert('XSS')&lt;/script>continue</a></p>
  • 100. Демо: как взорвать АЭС через XSS
  • 102. Поток операций хорошо описывается через состояния и правила перехода между ними. Для всех потоков операций должна быть определена политика защищенности и реализован ее принудительный контроль. Следует избегать появления в потоке операций рекурсивных путей и циклов, а также учитывать возможность нарушения целостности разделяемых данных. Текущую конфигурацию потока нужно хранить перед границей доверия, а не за ней. Контроль целостности потока операций
  • 103. Аутентичность источника запроса, инициирующего переход по потоку операций, подлежит принудительному контролю. Распространенный подход заключается в использовании двух токенов на каждый запрос (один хранится перед границей доверия, другой передается за нее) для контроля аутентичности путем их сравнения. Реализация контроля необходима только для запросов, изменяющих состояние системы. Контроль аутентичности инициатора операции
  • 106. Пример: CSRF ... <input type="button" value="Update status" onclick="return UpdateStatus()" /> ... <script language="javascript" type="text/javascript"> // <![CDATA[ function UpdateStatus() { var service = new Web.StatusUpdateService(); var statusUpdate = document.getElementById('txtStatusUpdate').value; service.UpdateStatus(statusUpdate, onSuccess, null, null); } function onSuccess(result) { var statusUpdate = document.getElementById('txtStatusUpdate').value = ""; __doPostBack('MainContent_updStatusUpdates', ''); } // ]]> </script>
  • 107. Пример: CSRF [OperationContract] public void UpdateStatus(string statusUpdate) { if (!HttpContext.Current.User.Identity.IsAuthenticated) throw new ApplicationException("Not logged on"); var dc = new VulnerableAppDataContext(); dc.Status.InsertOnSubmit(new Status { StatusID = Guid.NewGuid(), StatusDate = DateTime.Now, Username = HttpContext.Current.User.Identity.Name, StatusUpdate = statusUpdate }); dc.SubmitChanges(); }
  • 108. Пример: CSRF [OperationContract] public void UpdateStatus(string statusUpdate) { if (!HttpContext.Current.User.Identity.IsAuthenticated) throw new ApplicationException("Not logged on"); var dc = new VulnerableAppDataContext(); dc.Status.InsertOnSubmit(new Status { StatusID = Guid.NewGuid(), StatusDate = DateTime.Now, Username = HttpContext.Current.User.Identity.Name, StatusUpdate = statusUpdate }); dc.SubmitChanges(); }
  • 109. Пример: CSRF <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="http://localhost:85/ScriptResource.axd?d=4sSlXLx8QpYnLirlbD... <script src="http://localhost:85/ScriptResource.axd?d=oW55T29mrRoDmQ0h2E... <script src="http://localhost:85/StatusUpdateService.svc/jsdebug" type="... <script language="javascript" type="text/javascript"> // <![CDATA[ var service = new Web.StatusUpdateService(); var statusUpdate = "hacky hacky"; service.UpdateStatus(statusUpdate, null, null, null); // ]]> </script> </head> <body> You've been CSRF'd! </body> </html>
  • 111. Пример: CSRF protected string GetToken() { if (Session["Token"] == null) { Session["Token"] = Guid.NewGuid(); } return Session["Token"].ToString(); } ... function UpdateStatus() { var service = new Web.StatusUpdateService(); var statusUpdate = document.getElementById('txtStatusUpdate').value; var token = "<%= GetToken() %>"; service.UpdateStatus(statusUpdate, token, onSuccess, null, null); } ... [OperationContract] public void UpdateStatus(string statusUpdate, string token) { var sessionToken = HttpContext.Current.Session["Token"]; if (sessionToken == null || sessionToken.ToString() != token) { throw new ApplicationException("Invalid token"); } ...
  • 112. Пример: CSRF protected string GetToken() { if (Session["Token"] == null) { Session["Token"] = Guid.NewGuid(); } return Session["Token"].ToString(); } ... function UpdateStatus() { var service = new Web.StatusUpdateService(); var statusUpdate = document.getElementById('txtStatusUpdate').value; var token = "<%= GetToken() %>"; service.UpdateStatus(statusUpdate, token, onSuccess, null, null); } ... [OperationContract] public void UpdateStatus(string statusUpdate, string token) { var sessionToken = HttpContext.Current.Session["Token"]; if (sessionToken == null || sessionToken.ToString() != token) { throw new ApplicationException("Invalid token"); } ...
  • 114. Потоки операций бизнес-логики должны обладать не только свойствами необходимости и достаточности для ее реализации, но также и минимальности. Любые состояния и правила перехода, реализующие «чуть» больше функционала, чем это нужно для решаемой задачи, должны быть упрощены либо ограничены. <?=@`$c`?> PHP-калькулятор арифметических выражений (полнота по Тьюрингу — задел на будущее, код минимален уже сейчас). Избыточность функционала
  • 115. Пример: доступ к скрытым данным var fieldName = Request["field"] ?? "Id"; var minValue = int.Parse(Request["min"]); var maxValue = int.Parse(Request["max"]); var queryTemplate = string.Format( "SELECT Id, Nickname, Rating, MessageCount, TopicCount FROM Users WHERE {0} >= @minValue AND {0} <= @maxValue ORDER BY {0}", fieldName.Replace("'", string.Empty). Replace(" ", string.Empty). Replace("", string.Empty). Replace(",", string.Empty). Replace("(", string.Empty). Replace(")", string.Empty), ); var selectCommand = string.Format(queryTemplate, debugStr); var cmd = new SqlCommand(selectCommand, dataConnection); cmd.Parameters.Add(new SqlParameter("@minValue", minValue)); cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue)); ... /users/filter.aspx?field={fieldName}&min={minBalue}&max={maxValue}
  • 116. Пример: доступ к скрытым данным var fieldName = Request["field"] ?? "Id"; var minValue = int.Parse(Request["min"]); var maxValue = int.Parse(Request["max"]); var queryTemplate = string.Format( "SELECT Id, Nickname, Rating, MessageCount, TopicCount FROM Users WHERE {0} >= @minValue AND {0} <= @maxValue ORDER BY {0}", fieldName.Replace("'", string.Empty). Replace(" ", string.Empty). Replace("", string.Empty). Replace(",", string.Empty). Replace("(", string.Empty). Replace(")", string.Empty), ); var selectCommand = string.Format(queryTemplate, debugStr); var cmd = new SqlCommand(selectCommand, dataConnection); cmd.Parameters.Add(new SqlParameter("@minValue", minValue)); cmd.Parameters.Add(new SqlParameter("@maxValue", maxValue)); ... http://host.domain/users/filter.aspx?field=password&min=a&max=a
  • 117. Пример: массовое присваивание public class User { public int Id { get; set; } public string UserName { get; set; } public string Password { get; set; } public bool IsAdmin { get; set; } } public class UserController : Controller { IUserRepository _userRepository; public UserController(IUserRepository userRepository) { _userRepository = userRepository; } public ActionResult Edit(int id) { var user = _userRepository.GetUserById(id); return View(user); } [HttpPost] public ActionResult Edit(int id, FormCollection collection) { try { var user = _userRepository.GetUserById(id); UpdateModel(user); _userRepository.SaveUser(user); return RedirectToAction("Index"); } catch { return View(); } } } Model: Controller:
  • 118. Пример: массовое присваивание public class User { public int Id { get; set; } public string UserName { get; set; } public string Password { get; set; } public bool IsAdmin { get; set; } } public class UserController : Controller { IUserRepository _userRepository; public UserController(IUserRepository userRepository) { _userRepository = userRepository; } public ActionResult Edit(int id) { var user = _userRepository.GetUserById(id); return View(user); } [HttpPost] public ActionResult Edit(int id, FormCollection collection) { try { var user = _userRepository.GetUserById(id); UpdateModel(user); _userRepository.SaveUser(user); return RedirectToAction("Index"); } catch { return View(); } } } Model: Controller:
  • 119. Пример: массовое присваивание public class User { public int Id { get; set; } public string UserName { get; set; } public string Password { get; set; } public bool IsAdmin { get; set; } } public class UserController : Controller { IUserRepository _userRepository; public UserController(IUserRepository userRepository) { _userRepository = userRepository; } public ActionResult Edit(int id) { var user = _userRepository.GetUserById(id); return View(user); } [HttpPost] public ActionResult Edit(int id, FormCollection collection) { try { var user = _userRepository.GetUserById(id); TryUpdateModel(user, includeProperties: new[] { "UserName", "Password" }); _userRepository.SaveUser(user); return RedirectToAction("Index"); } catch { return View(); } } } Model: Controller:
  • 120. Пример: массовое присваивание public class User { public int Id { get; set; } public string UserName { get; set; } public string Password { get; set; } public bool IsAdmin { get; set; } } public class UserController : Controller { IUserRepository _userRepository; public UserController(IUserRepository userRepository) { _userRepository = userRepository; } public ActionResult Edit(int id) { var user = _userRepository.GetUserById(id); return View(user); } [HttpPost] public ActionResult Edit(int id, FormCollection collection) { try { var user = _userRepository.GetUserById(id); TryUpdateModel(user, includeProperties: new[] { "UserName", "Password" }); _userRepository.SaveUser(user); return RedirectToAction("Index"); } catch { return View(); } } } Model: Controller:
  • 123. Рекомендуемые темы: ― Пред-SDL: • Введение в SDL; • Основы разработки защищенного ПО с помощью SDL. ― Фаза выработки требований: • Защита приватности в разрабатываемом ПО; Обучение
  • 124. Рекомендуемые темы ― Фазы проектирования, реализации и тестирования: • основы защищенного проектирования, разработки и тестирования; • введение в моделирование угроз; • справочник по защищенности; • SDL Developer Starter Kit. Обучение
  • 125. Практики SDL: ― требования к защищенности; ― контрольные условия качества и критерии недостатков; ― оценка рисков защищенности и приватности. Требования
  • 126. Практики SDL: ― требования проектирования; ― уменьшение количества возможных направлений атак; ― моделирование угроз. Проектирование
  • 127. Практики SDL: ― использование утвержденных инструментов; ― отказ от опасных функций; ― статический анализ. Реализация
  • 128. Практики SDL: ― динамический анализ; ― фаззинг; ― анализ модели угроз и возможных направлений атак. Проверка
  • 129. Практики SDL: ― План реагирования на инциденты: • участники; • стратегия патч-менеджмента; • планы обеспечения защищенности стороннего кода. ― Окончательная проверка защищенности. ― Выпуск и архив. Выпуск
  • 130. Практики SDL: ― Исполнение плана реагирования на инциденты: • анализ полученной информации об уязвимости; • оценка риска; • выпуск патча; • оповещение клиентов; • раскрытие информации. Реагирование
  • 131. SDL подразумевает линейность процесса разработки, однако практики SDL хорошо адаптируются к agile посредством их распределения на три категории: ― Разовые, выполняются единожды ― Спринтовые, выполняются в рамках каждого спринта ― Корзинные, в каждом спринте должна быть выполнена хотя бы одна практика из корзины SDL и Agile
  • 132. ― требования к защищенности; ― оценка рисков защищенности и приватности; ― требования к проектированию; ― уменьшение количества возможных направлений атак; ― план реагирования на инциденты. Разовые практики
  • 133. ― обучение; ― моделирование угроз; ― использование утвержденных инструментов; ― отказ от опасных функций; ― статический анализ; ― окончательная проверка защищенности; ― выпуск и архив. Спринтовые практики
  • 134. ― контрольные условия качества и критерии недостатков; ― динамический анализ; ― фаззинг; ― анализ модели угроз и возможных направлений атак. Корзинные практики
  • 135. Спасибо за внимание! Вопросы? Владимир Кочетков vkochetkov@ptsecurity.ru @kochetkov_v специалист по анализу защищенности веб-приложений Positive Technologies
  • 136. В презентации использованы материалы следующих работ: ― “OWASP Top 10 for .NET Developers” by Troy Hunt ― “The Science of Insecurity” by Len Sassaman, Meredith L. Patterson, Sergey Bratus ― “The Essence of Command Injection Attacks in Web Applications” by Zhendong Su, Gary Wassermann ― “Modeling Computer Insecurity” by Sophie Engle, Sean Whalen, Matt Bishop Copyrights