Пример автоматического аудита: RATS

RATS — сканер общего назначения для обнаружения потенциальных проблем безопасности в исходном коде (поддерживается несколько языков программирования).

Запуск RATS

Запуск RATS довольно прост. Следует вызвать команду rats с указанием каталога, который нужно проверить. Каждый файл с исходным кодом, который будет обнаружен в этом каталоге, будет проверен. RATS понимает несколько языков программирования: C, Perl, PHP и Python; и каждый файл на одном из этих языков программирования будет считаться кандидатом для проверки.

Имеются несколько параметров, которые могут быть переданы в дополнение к имени каталога; они описаны справочной странице.

Наиболее полезными параметрами являются те, которые изменяют вывод; среди них следующие:

Допустим, у нас имеется тестовый файл, расположенный в текущем каталоге, в этом каталоге больше нет никаких файлов с исходным кодом, мы можем вызвать сканер следующей командой:

rats --warning 1 --html . >output.html

Эта команда создаст HTML-файл, содержащий результаты сканирования, который может быть загружен браузером.

Результаты

Запуск RATS с нашим примером выдает следующий вывод:


Severity: High

Issue: fixed size global buffer

Extra care should be taken to ensure that character arrays that are allocated on the stack are used safely. They are prime targets for buffer overflow attacks.

File: test.c
Lines: 10 11 12

Severity: High

Issue: strcpy

Check to be sure that argument 2 passed to this function call will not copy more data than can be handled, resulting in a buffer overflow.

File: test.c
Lines: 18

Severity: High

Issue: getenv

Environment 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 truncate them to a reasonable length.

File: test.c
Lines: 22 24

Severity: High

Issue: sprintf

Check to be sure that the format string passed as argument 2 to this function call does not come from an untrusted source that could have added formatting characters that the code is not prepared to handle. Additionally, the format string could contain `%s' without precision that could result in a buffer overflow.

File: test.c
Lines: 24

Severity: High

Issue: popen

Argument 1 to this function call should be checked to ensure that it does not come from an untrusted source without first verifying that it contains nothing dangerous.

File: test.c
Lines: 33

Severity: High

Issue: printf

Check to be sure that the non-constant format string passed as argument 1 to this function call does not come from an untrusted source that could have added formatting characters that the code is not prepared to handle.

File: test.c
Lines: 42

Total lines analyzed: 49
Total time 0.000288 seconds
170138 lines per second


Этот вывод очень велик, хотя сам по себе код очень короткий; это демонстрирует один из недостатков автоматического сканирования — большой размер вывода.

Анализ вывода

Вывод, который был произведён, является по сути описанием функций, которые были обнаружены, номером строки, в которой была обнаружена утечка, и описанием проблемы. (Поскольку мы использовали параметр «--warning» для ограничения вывода только «высоким» уровнем функций, мы немного сократили вывод.)

Каждую из обнаруженных проблем следует изучить вручную на предмет того, имеется ли там что-то неправильное или это было ложное срабатывание (напр., функция, которая может быть использована неправильно, была использована правильно).

В нашем случае мы можем видеть, что были обнаружены все уязвимости в нашем коде, но это не совсем ясно, если только не просмотреть соответствующие строки кода с помощью редактора.

Одним из упущений этой программы является то, что она не указывает строки целиком (это позволяет сделать flawfinder).


Назад на страницу проекта по аудиту | Назад на страницу примеров аудита