Анализатор исходных кодов RATS
Одним из методов поиска уязвимостей в программном обеспечении является использование анализаторов исходных текстов. В данной посте хочу рассказать об одном из них, а именно о RATS (Rough Auditing Tool for Security). Начать именно с этой утилиты, решил потому что упоминания о ней встречались не раз в уважаемых мной источниках, а именно тут, тут и еще здесь. Однако реального примера использования нигде не было, поэтому я решил рассказать о RATS подробнее.И так, RATS был создан компанией Fortify, предназначен для поиска ошибок в коде, написанном на C/C++, Perl, Ruby, PHP и Python, и, что важно, распространяется бесплатно. Особых чудес от этой утилиты ждать не стоит, однако, места использования «рискованных» функций мы найдем.УстановкаНачнем с установки RATS, далее пример для ОС Debian (wheezy), пакет RATS можно взять здесь. Качаем deb-пакет wget ftp.us.debian.org/debian/pool/main/r/rats/rats_2.3–1_amd64.deb и устанавливаем sudo dpkg –i /путь/пакет.deb.Проверим все ли корректно установилось, для этого в консоли набираем rats:$ ratsEntries in perl database: 33Entries in ruby database: 46Entries in python database: 62Entries in c database: 334Entries in php database: 55Total lines analyzed: 0Total time 0.000010 seconds0 lines per secondЗдесь мы видим, сколько шаблонов типичных ошибок содержится в базе RATS (версии 2.3–1).Пример 1
Теперь давайте опробуем RATS «в бою». Для этого напишем код заведомо содержащий классическую ошибку переполнения буфера и сохраним его в файл vuln_code1.c:
#include
vuln_code1.c:5: High: strcpyCheck to be sure that argument 2 passed to this function call will not copymore data than can be handled, resulting in a buffer overflow.
Total lines analyzed: 7Total time 0.000154 seconds45454 lines per second
RATS сообщает нам о двух ошибках, причем обеим он присваивает высокий (high) уровень опасности.Первая «fixed size local buffer» — использование фиксированного размера буфера в строке 4 — char buffer[10].Вторая «buffer overflow» — переполнение буфера в строке 5 — при использовании функции strcpy (). Если вместо функции strcpy () использовать gets (), то сообщение RATS будет выглядеть вот так: vuln_code1.c:5: High: getsGets is unsafe!!! No bounds checking is performed, buffer is easily overflowable by user. Use fgets (buf, size, stdin) instead
Пример 2
Проверим как RATS реагирует на код содержащий уязвимость форматной строки, для этого пишем код с дефектом, функция printf получает входную строку, в соответствии с которой функция ожидает, что перед ее вызовом в стек были занесены два аргумента если данную программу запустить со спецификаторами »%x %x» в качестве параметра, можно увидеть содержимое 4 байт стека.
#include
Пример 3
В этом примере используем код содержащий ошибку переполнения буфера при взаимодействии с переменными окружения:
#include
vuln_code4.c:6: High: getenvEnvironment variables are highly untrustable input. They may be of any length, and contain any data. Do not make any assumptions regarding content or length.If at all possible avoid using them, and if it is necessary, sanitize them and truncatethem to a reasonable length.Так как переменные окружения могу быть любой длинны, нам стоит внимательно проверять какой длинны буфер мы выделяем для работы с ними.
vuln_code4.c:8: High: sprintfCheck to be sure that the format string passed as argument 2 to this functioncall does not come from an untrusted source that could have added formattingcharacters that the code is not prepared to handle. Additionally, the formatstring could contain `%s' without precision that could result in a bufferoverflow.
Пример 4
Посмотрим, как обстоят дела с другими языками программирования, и протестируем RATS на уязвимом perl-скрипте:
open (f,$filename);
while (