30
Разработка безопасного кода Андрей Сомсиков [email protected]

разработка безопасного кода

Embed Size (px)

Citation preview

Page 1: разработка безопасного кода

Разработка безопасного кода

Андрей Сомсиков[email protected]

Page 2: разработка безопасного кода

Не используйте лабораторные машины для тестирования на безопасность◦ Требуется разрешение от лаборанта

Последствия◦ Лишение прав доступа◦ Переустановка OS

Предупреждение

Page 3: разработка безопасного кода

Создание безопасного ПО Написание безопасного кода Обзор решения Microsoft

План лекции

Page 4: разработка безопасного кода

Безопасность (Security)◦ Is the condition of a system that results from the

establishment and maintenance of measures to protect the system.

◦ Security is an aspect of a product, not a feature.◦ Устойчивость к воздействиям.

Защита персональных данных (Privacy)◦ Право на неприкосновенность частной жизни.

Угроза (англ. threat) – возможная опасность. Риск (англ. risk) – количественная оценка

угрозы.

Терминология

Page 5: разработка безопасного кода

Создание безопасного ПО

Обзор

Page 6: разработка безопасного кода

ПО получает все большее распространение◦ Банковские и финансовые системы◦ Государственные системы ◦ Персональные системы

Рост киберпреступности◦ Повышение профессионализма хакеров◦ Появление новых бизнес моделей◦ Низкий уровень компьютерной грамотности

пользователей Проблемы безопасности обходятся дорого

◦ Security incident handling (≈$100K-$500K)◦ Негативное и широкое освещение в прессе◦ Недовольство пользователей

Почему ПО должно быть безопасным

Page 7: разработка безопасного кода

Жизненный цикл разработки ПО◦ Разбиение процесса на стадии◦ Нет общепринятого стандарта:

Microsoft SDL (http://msdn.microsoft.com/security) Intel SDL

Безопасность должна быть на всех стадиях:◦ Тренинги по безопасности◦ Моделирование угроз◦ Тестирование на безопастность◦ ...

Создание ПО

Проектирование Написание Тестирование Поддержка

Page 8: разработка безопасного кода

Анализируют уязвимые места дизайна или реализации ПО:◦ Исследуют взаимодействие с системой◦ Собирают и анализируют выходные данные◦ Изучают компоновку системы и потоки данных◦ Ищут применимость опубликованных атак и

уязвимостей Инструменты

◦ SoftIce, WinDBG, OllyDebug, gdb/kdb, сетевые сканеры, ...

◦ Dump памяти, depends, dumpbin (дисассемблирование), декомпиляторы, ...

◦ Fuzzers – подача случайных входных данных

Что делают хакеры?

Page 9: разработка безопасного кода

Написание безопасного кода

Page 10: разработка безопасного кода

Проверка входных данных◦ “All input is evil, until proven otherwise”◦ Проверяйте неправильность входных данных:

Формат, длина, тип, интервал Уменьшай площадь атаки

◦ Используй только необходимые сервисы и оганичивай время их использования Файлы, устройства, сторонние компоненты

◦ Все методы взаимодействия с ПО должны быть документированы и протестированы Отсутствие «секретного» API или скрытой

функциональности

Основные принципы (1/4)

Page 11: разработка безопасного кода

Использовать минимально необходимые привилегии◦ Проверяй запуск приложения с

пользовательскими правами доступа: user/guest, доступ к системным папкам User Account Control (UAC) должен быть включен

Многоуровневая защита◦ Несколько уровней защиты ПО повышают

стойкость к взлому Firewall, проверка входных данных,

аутентификация и авторизация.

Основные принципы (2/4)

Page 12: разработка безопасного кода

Неизвестность≠ Защищенность◦ Сокрытие может быть только дополнительным

уровнем защиты. Готовность к нештатным ситуациям

◦ Ошибка не должна приводить систему в небезопасное состояние.

◦ Сообщение об ошибках не должно бфть слишком детальным «Неверное имя пользователя или пароль»

◦ Журнал ошибок должен быть доступен только авторизованным пользователям

Основные принципы (3/4)

Page 13: разработка безопасного кода

Тесты на безопасность◦ Тесты на распространенные ошибки◦ Проверки на недокументированное поведение◦ ...

Учеба на ошибках◦ Документируй и анализируй ошибки

Основные принципы (3/4)

Page 14: разработка безопасного кода

Основные уязвимости

Page 15: разработка безопасного кода

Переполнение буфера - происходит при записи данных в память за границу выделенной области:◦ На стеке (stack)◦ В динамической памяти (heap)

Сложно но возможно в managed коде (C#, Java)

Цели:◦ Исполнение вредоносного кода,◦ Получение доступа к информации,◦ Нарушение стабильной работы.

Переполнение буфера

Page 16: разработка безопасного кода

Переполнение стека в действии

Buffers Other vars

EBP

EIP Args

void func(char *p, int i) { int j = 0; CFoo foo; int (*fp)(int) = &func; char b[128]; strcpy(b,p);}

Адрес возвратафункции

Обработчики исключенийУказатели на функцииВиртуальные методы

Задают порядок исполнения кода

Исполнения вредоносного кода возможно если * p будет больше буфера b 16

Page 17: разработка безопасного кода

n-функции в C/C++ безопасны?

• Пример 2:#define MAX (50)char szDest[MAX];strncpy(szDest,pszSrc,MAX);

• Пример 1:// Code verifies pszSrc is <= 50 chars)// pszSrc is a char *#define MAX (50)char *pszDest = malloc(sizeof(pszSrc));strncpy(pszDest,pszSrc,MAX);

17

Переполнение буфера возможно даже при использованиии n-

функций

sizeof(pszSrc) 4 байта, а не 50

szDest не будет null-terminated если длина pszSrc >=

MAX

Page 18: разработка безопасного кода

Ошибка счета на единицу в Apache* 1.3Уязвимость в модуле mod_ssl (версии до 2.8.10).... char *cp;char caCmd[1024]; char *cpArgs; ... cp = (char *)oline; for (i = 0; *cp !=' ' && *cp !='\t' && *cp != NUL && i < 1024; ) caCmd[i++] = *cp++; caCmd[i] = NUL;

cpArgs = cp; ...

Возможно выполнение произвольного кода.

^^^^^^^^

Page 19: разработка безопасного кода

Как избежать переполнения буфера

Поиск и исправление

ошибок переаолнени

я буфераУменьшить

площадь атаки

Security Code Review – Поиск уязвимостей до

выпуска продукта

Использовать более

безопасную функциональность (strsafe, Safe

CRT, STL)

Опции сборки кода: /GS, NX,

Heap Checking, ...

Инструменты для анализа кода на безопасность

FuzzTesting - Тесты со

случайными входными данными

19

Page 20: разработка безопасного кода

Арифметические ошибки:Проблемы. Переполнение (overflow/underflow).unsigned int a = 0xefffffff;unsigned int b = a + 2;

Потеря или приобретение знакаint c = a

Потеря старших разрядовchar d = a;

20

Арифметические ошибки приводят к переполнению буфера

Page 21: разработка безопасного кода

Арифметическик ошибки:Пример.void Example(char * str, int size) {char buf[80];

// Check to make sure size is ‘valid’if (size < sizeof(buf)) {

// Should be safe to copy strstrcpy(buf,str);

}}

21

Page 22: разработка безопасного кода

Арифметическик ошибки: Как избежать? Тщателно проверяйте вычисления

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

◦ Индексов◦ Размеров буферов◦ Closely examine any calculation used to determine

an array offset or memory location Обращайте внимания на предупреждения

b ошибки компилятора а также на иструкции по отключению ошибок (#pragma)

22

Page 23: разработка безопасного кода

Канонические представления:Проблемы. Данные представленые по разному могут

быть эквивалентны:◦ filename_secret.ext ≡ filena~1.ext◦ www.site.ru/secret ≡ www.site.ru/%73ecret

Проблемы с использованием канонических представлений: проверки безопасности ориентированы на одно представление данных, хотя фактически может быть использовано другое

23

Используются для обхода проверок

Page 24: разработка безопасного кода

Канонические представления:Пример.SecretFile.txt

SecretFile.txt.Secret~1.txtSecretFile.txt::$Data

String FileName = System.Console.ReadLine();if (FileName.ToLower().Equals(“secretfile.txt”)) {

// deny access to file}else {

// grant access to file}

24

Именем файла может быть

“Secret~1.txt” или “SecretFile.txt::

$Data”?

Page 25: разработка безопасного кода

Канонические представления:Как избежать ошибок?• Приводите к канонической форме перед

использованием или проверкой.• Используйте возможности операционной

системы для приведения к канонической форме

• Используйте регулярные выражения для поиска запрещенных символов

25

Page 26: разработка безопасного кода

Только правильное использование криптографии позволит защитить данные и скрыть секреты◦ Некоторые алгоритмы признаны

взламываемыми: MD4, MD5, RC4, DES, SHA1.◦ Существуют атаки на некоторые реализации

алгоритмов: RSA, AES◦ NIST – как правильно применять алгоритмы

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

Генерация случайных данных.

Криптография: Возможный ошибки.

Page 27: разработка безопасного кода

Используйте стандартные реализации алгоритмов SSL, CryptoAPI.

Не разрабатывайте собственный алгоримы - используйте проверенные.

Используйте правильные генераторы случайных чисел.

Обновляйте ключи переодически. Используйте специальные функции для

очиски памяти SecureZeroMemory.

Криптография: Как избежать ошибок?

Page 28: разработка безопасного кода

DOS Attck – Атака на систему призванная привести к отказу в обслуживании

Остновные векторы атаки:◦ Остановка или падение системы (проверка

входных данных, переполнение буфера, арифметическая ошибка)

◦ Перегрузка CPU◦ Нехватка памяти, ресурсов◦ Загрузка сети

Denial of Service (DOS)

Page 29: разработка безопасного кода

Аутентификация и авторизация◦ Доступ к ресурсам должны иметь только

авторизованные пользователи. Фильтрация

◦ Проверка входных данных Ограничения

◦ Не позволять использовать максимальное количество ресурса.

Способы защиты от DOS

Page 30: разработка безопасного кода

http://msdn.microsoft.com/ru-ru/magazine/cc163518.aspx - Безопасные привычки: 8 простых правил для разработки более безопасного кода

http://msdn.microsoft.com/ru-ru/security/default.aspx - Центр безопасности

http://www.microsoft.com/security/sdl/default.aspx - Microsoft Security Development Lifecycle

Ссылки