Рейтинг самых опасных ошибок, зафиксированных в 2009 году

17.02.2010 19:48

Институт SANS (SysAdmin, Audit, Network, Security), совместно с организацией MITRE и ведущими экспертами по компьютерной безопасности, подготовил новую редакцию рейтинга 25 самых опасных ошибок, приводящих к возникновению серьезных уязвимостей. Ошибки были отобраны с учетом их распространенности, трудоемкости обнаружения и простоты эксплуатации уязвимости. В опубликованном документе подробно разбирается каждый из 25 видов ошибок, приводятся примеры уязявимостей и рекомендации для разработчиков по предотвращению появления подобных ошибок.

Краткое содержание рейтинга (цифра вначале указывает на место в рейтинге):

  • Небезопасное взаимодействие между компонентами, определяет проблемы, вызванные небезопасной отправкой или получением данных между модулями, программами, процессами, нитями или системами.
    • 1: Неспособность сохранения структуры web-страницы, что позволяет злоумышленнику внедрить на страницу свой скрипт или html-блок (XSS, Cross-site Scripting);
    • 2: Неспособность сохранения целостной структуры SQL запроса, что может привести к подстановке злоумышленником SQL запроса (SQL Injection);
    • 4: Cross-Site Request Forgery (CSRF), отсутствие проверки источника запроса, что может быть использовано злоумышленником для незаметного перенаправления авторизированного пользователя для выполнения определенных скрытых действий;
    • 8: Неограниченная возможность загрузки файлов опасного типа, например, когда через форму загрузки картинки на сайт можно загрузить (и затем выполнить) ".php" скрипт;
    • 9: Неспособность корректного формирования структуры запускаемого приложения, может привести к подставке кода злоумышленника при выполнении внешней команды, через определение некорректных значений, используемых в качестве параметров запускаемой программы (OS Command Injection);
    • 17: Утечка сведений о системе при выводе сообщения об ошибке, например, часто в сообщении об ошибке можно видеть текущие пути или имя базы, что может быть использовано злоумышленником.
    • 23: Перенаправление на вызывающий доверие сайт через некорректное использование средств переброса на другой URL в веб-приложениях (например, когда когда в скрипт локального переброса вместо "/redirect?url=form.php" передают "/redirect?url=http://example.com");
    • 25: "Эффект гонки" (Race Condition), проблемы вызванные возможностью одновременного использования одного ресурса несколькими обработчиками, отсутствием атомарных операций или ненадлежащими блокировками;
  • Рискованное управление ресурсами, ситуации когда к проблемам приводит ненадлежащее управление созданием, использованием, передачей или уничтожением важных ресурсов системы.
    • 3: Копирование содержимого буфера без предварительной проверки размера входных данных. Неспособность удержать действия в определенных жестких рамках или в пределах заданного буфера памяти, приводит к классическим уязвимостям вида выхода за допустимые границы и переполнению буфера;
    • 7: Возможность внешнего переопределения путей или имен файлов, например, когда в качестве имени файла используется какой-то передаваемый параметр, используя "../" в котором можно выйти за пределы текущей директории;
    • 12: Доступ к буферу без учета его размера, например, когда осуществляется копирование из одного буфера в другой без проверки, что во втором буфере хватит места;
    • 13: Отсутствие проверки на необычные ситуации, например, при невыполнении проверки результата выполнения функции malloc (разработчик подразумевает, что она никогда не вернет NULL) злоумышленник может инициировать переход на нулевой указатель. Или при выполнении "fgets(buf, 10, stdin); strcpy(cp_buf, buf);" разработчик уверен, что после fgets строка всегда терминирована, но при ошибке ввода/вывода это не так;
    • 14: Некорректная обработки имени файла перед его использованием в PHP директивах Include/Require. Типичный пример: "$dir = $_GET['module_name']; include($dir . "/function.php");", если в передачей "module_name=http://сайт_злоумышленника";
    • 15: Некорректная проверка индекса массива, например, обращение к -23 или 978 элементам массива, когда общий размер всего 100 элементов;
    • 16: Проблемы, связанные с целочисленным переполнением;
    • 18: Некорректный расчет размера буфера;
    • 20: Загрузка исполняемого кода без проверки его целостности через сверку с цифровой подписью, например, в результате взлома сайта или подстановки неверной информации в DNS, злоумышленник может изменить содержимое пакета с программой;
    • 22: Выделение ресурсов без задания максимальных ограничений, например, классическая fork-бомба или забивание всего свободного места на диске;
  • Ненадежная защита, некорректное использование, игнорирование или злоупотребление средствами защиты.
    • 5: Некорректный контроль доступа (авторизации);
    • 6: Доверие к непроверенному вводу при принятии решений, связанных с безопасностью. Например, излишнее доверие к содержимому cookie (кодирование прав доступа или уровня пользователя через cookie);
    • 10: Отсутствие шифрования конфиденциальных данных, например, хранение номера кредитной карты в БД в открытом виде;
    • 11: Задание базового пароля прямо в коде скрипта или в общедоступных файлах конфигурации;
    • 19: Отсутствие аутентификации при выполнении критических действий (например, при смене пароля, отсутствует проверка старого пароля);
    • 21: Небезопасное назначение прав доступа к критически важным ресурсам, например, возможность чтения или изменения другим пользователем конфигурационных или служебных файлов;
    • 24: Использование ненадежных или рискованных криптографических алгоритмов;

В заключение можно отметить интересную статистику, опубликованную в блоге Марка Кокса (Mark Cox), возглавляющего подразделение Red Hat, занимающееся выявлением и исправлением проблем безопасности. Марк проанализировал число устраненных в Red Hat уязвимостей по каждой из позиций вышепредставленного рейтинга Top25. Особый акцент сделан на уязвимостях, которые удалось предотвратить благодаря использованию таких технологий, как SELinux, ExecShield, защищенных вариантов malloc/free и активации FORTIFY_SOURCE опции glibc (дополнительная внутренняя проверка выхода за пределы буфера для функций, таких как strcpy). Например, дистрибутив оказался заведомо невосприимчив к серии уязвимостей, связанных с разыменованием NULL указателя.