От ошибки до уязвимости… Алексей Синцов Digital Security twitter.com/asintsov Программа… http://www.flickr.com/photos/lofink/4501610335/ Программа http://www.flickr.com/photos/lofink/4501610335/ Ошибка http://www.flickr.com/photos/lofink/4501610335/ Эксплуатация Уязвимость Ошибка http://www.flickr.com/photos/lofink/4501610335/ Кто ищет уязвимости ? http://www.flickr.com/photos/rufo_83/3154516530/ Такие разные… • • • • • • • Переполнение буфера Межсайтовый скриптинг Инъекция SQL кода Отсутствие авторизации Ошибки логики Обход аутентификации И многое другое….. Примеры. Идейные ошибки - 1 • • • • • • PepsiCo Coca-Cola Johnson & Johnson Lockheed Martin McDonnell-Douglas Sony • • • • • Danon Mercedes-Benz Ford Motor Mazda Motor Corporation Heineken Аутентификация Атака Эксплойт XOR EAX, EAX Где ошибка? Производить аутентификацию на стороне клиента НЕправильно! Примеры. Идейные ошибки - 2 Kaspersky Administration Kit Условия для атаки: • Домен • Учетная запись имеет права Локального Администратора Сканирование и атака Что делать? Надо было предусмотреть возможность SMBRelay! Надо было лучше документировать. Примеры. Ошибки в коде - 1 Отечественная система Банк-Клиент ActiveX компонент для работы с ЭЦП: Примеры. BoF Отечественная система Банк-Клиент char* vuln(char *bufferOut, char *fileName){ char *errorText="Ошибка при создании файла с именем ‘%1’."; while(!*errorText) { if(errorText=='%' && (errorText+1)<'9') // замена %1 { strcpy(bufferOut,fileName); //errorText rewrite! bufferOut+=strlen(fileName); //увеличиваем указатель *errorText++; } *bufferOut++=*errorText++; //Stack overflow (errorText<bufferOut) } return *bufferOut; } Примеры. BoF Что делать? Проводить обзор кода. Использовать современный VS. Использовать флаги Защиты: /GS /SafeSEH Примеры. Ошибки в коде - 2 Lotus Domino Controller Примеры. Ошибки в коде - 2 Аутентификация Пользователь -> {Login, Password, cookiefilename} -> Lotus Domino Controller Имя файла на сервере Lotus с базой учетных записей и с хэшами паролей © Patrik Karlsson and ZDI Примеры. Ошибки в коде - 2 Аутентификация File file = new File(cookieFilename); ... inputstreamreader = new InputStreamReader(new FileInputStream(file), "UTF8"); ... inputstreamreader.read(ac, 0, i); ... String s7 = new String(ac); ... do { if((j = s7.indexOf("<user ", j)) <= 0) break; int k = s7.indexOf(">", j); if(k == -1) break; String s2 = getStringToken(s7, "user=\"", "\"", j, k); ... String s3 = getStringToken(s7, "cookie=\"", "\"", j, k); ... String s4 = getStringToken(s7, "address=\"", "\"", j, k); ... if(usr.equalsIgnoreCase(s2) && pwd.equalsIgnoreCase(s3) &&\ appletUserAddress.equalsIgnoreCase(s4)) { flag = true; break; } ... } while(true); Примеры. Ошибки в коде - 2 Обход аутентификации echo ^ <user name=“admin" cookie=“dsecrg" address=“10.10.0.1"^> > n:\domino2\zdi0day_.txt Что делать? Проводить обзор кода. Примеры. Исправление. Аутентификация File file = new File(“./”+cookieFilename); ... inputstreamreader = new InputStreamReader(new FileInputStream(file), "UTF8"); ... inputstreamreader.read(ac, 0, i); ... String s7 = new String(ac); ... do { if((j = s7.indexOf("<user ", j)) <= 0) break; int k = s7.indexOf(">", j); if(k == -1) break; s7.substring(..) String s2 = getStringToken(s7, "user=\"", "\"", j, k); ... String s3 = getStringToken(s7, "cookie=\"", "\"", j, k); ... String s4 = getStringToken(s7, "address=\"", "\"", j, k); ... if(usr.equalsIgnoreCase(s2) && pwd.equalsIgnoreCase(s3) &&\ appletUserAddress.equalsIgnoreCase(s4)) { flag = true; break; } ... } while(true); Новая атака cookie.xml <?xml version="1.0" encoding="UTF-8"?> <user name=“admin" cookie=“dsecrg" address=“10.10.0.1"> cookie2.xml.trash: There is a good <user xml file! andname=“admin”willbefound as cookie=“dsecrg” andaddress=“10.10.0.1”hooray! >and blah-blah-blah Valid Новая атака cookie.xml <?xml version="1.0" encoding="UTF-8"?> <user name=“admin" cookie=“dsecrg" address=“10.10.0.1"> cookie2.xml.trash: There is a good <user xml file! andname=“admin”willbefound as cookie=“dsecrg” andaddress=“10.10.0.1”hooray! >and blah-blah-blah Valid Новая атака cookie.xml <?xml version="1.0" encoding="UTF-8"?> <user name=“admin" cookie=“dsecrg" address=“10.10.0.1"> cookie2.xml.trash: There is a good <user xml file! andname=“admin”willbefound as cookie=“dsecrg” andaddress=“10.10.0.1”hooray! >and blah-blah-blah Valid Новая атака cookie.xml <?xml version="1.0" encoding="UTF-8"?> <user name=“admin" cookie=“dsecrg" address=“10.10.0.1"> cookie2.xml.trash: There is a good <user xml file! andname=“admin”willbefound as cookie=“dsecrg” andaddress=“10.10.0.1”hooray! >and blah-blah-blah Valid Valid Демонстрация 0day Что делать? Проводить обзор кода. Автоматизированных средств не достаточно PS. WEB Не XSS, не SQLi… что-то новое хотим! Google docs Как это выглядит? Пользователь. Как это выглядит? Создатель. Как атаковать? Это же Exсel Засунем =A1+B1 Как атаковать? Засунем %08=A1+B1 Yaaahooo!! Уязвимость? Уязвимость? Где ошибка? Проводить Фаззинг. Анализировать бизнес функции. Как делать это правильно ? • Анализировать логику и функционал с точки зрения угроз • UnitTests • Анализировать код • Автоматически • В ручную, дополнительно, делать ревью кода • Использовать технологии снижения рисков: • C/C++ • /GS • /SafeSEH • /DinamicBase • WEB • HTTPOnly • Secure • X-Frame-options • Анализ типовых угроз и best practices. • Анализ ролевой модели • Анализ схем СУБД Как ищут? Статический анализ • Source code review • regexp • формальные методы • руками… • Reverse Engineering • формальные методы • сигнатуры • руками… Динамический анализ • Fuzzing (bin/web) + Типичные уязвимости для данного типа + Reverse Engineering • Руками… Обзор архитектуры (логические ошибки) Ошибки в 3rd party- в базе CVE Автоматизация Source Code Analyzers Fuzzers SQLMap Peach RATS Flawfinder COMRaider Sulley Yasca Разработка (с) OWASP Спасибо за внимание www.twitter.com/asintsov a.sintsov@dsec.ru Пожалуйста, поставьте оценку моему докладу. Ваше мнение очень важно. Спасибо!