|

Source code scanners
Xakep, номер #043, стр. 043-040-7
[root@localhost flawfinder-0.21]# rats -d /root/scanz/rats-1.3/vuln_db.c /root/scanz/Flaw-finder/flawfinder-0.21/test2.c
/root/scanz/Flaw-finder/flawfinder-0.21/test2.c:14: High: strcpy
Check to be sure that argument 2 passed to this function call will not more
data than can be handled, resulting in a buffer overflow.
/root/scanz/Flaw-finder/flawfinder-0.21/test2.c:24: High: scanf
Check to be sure that the format string passed as argument 2 to this function
call doest 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.
В первой группе предупреждений контролируется отсутствие ограничения на длину передаваемого функции strcpy параметра, что может вызвать... правильно, переполнение буфера. Во втором - та же история с sprintf, нам предлагается убедиться, что вызов функции не идет из опасного источника и не произойдет все та же «ошибка форматирования строки». При вызове функции gets программа предупреждает, что в данном контексте использование ее не рекомендуется, ибо здесь не используется хоть какая-нибудь проверка и «буфер легко переполняем пользователем». Вместо нее настойчиво требуют использовать более безопасную fgets. Наконец, в вызове функции syslog нам рекомендуют урезать все входные параметры (строки) до приемлемой длины (ограничить длину, другим словом) перед передачей их этой функции.
Splint
http://www.splint.org
Под конец, для самых терпеливых, я оставил, пожалуй, наиболее вкусную утилитку. Это широко известный в программистских кругах lint в его «секьюрной» реализации. Объясняю в двух словах: в конце семидесятых годов прошлого века (как ты помнишь, это были годы победного шествия UNIX'овых мейнфреймов и языка Си) неким S.C. Johnson'ом была написана утилита Lint, а причиной к созданию оной был тот факт, что ранние версии языка Си были далеки от нынешнего стандарта ANSI C (то бишь были далеки от идеала :), не имели некоторых нынешних возможностей (например, прототипов функций) и так далее. Вот Lint и был призван распознавать ошибки и опечатки в С-программах, используя K&R и ANSI стандарт для языка C (когда они уже были приняты, естественно). Цель дополнительной проверки программы этой утилитой состоит в выявлении потенциальных проблем при последующем объединении с другими модулями в составе проекта, обнаружении нестандартных конструкций, могущих стать источником нетривиальных ошибок, тех же уязвимостей и ошибок в вызовах функций и все такое. Надо сказать, что Lint более чувствителен к деталям, чем С-компилятор, и находит вероятные проблемы там, где компилятор их найти не может. Ну, естественно, во-первых, ранние компиляторы обладали не столь мощными возможностями по анализу компилируемого кода, а во-вторых, сам по себе компилятор никогда не будет предупреждать о возможности ошибки переполнения буфера в такой-то строке.
Так вот, Splint - это модифицированная версия «классического» Lint'а, в которой сделан акцент на безопасность, обнаружение уязвимостей, багов в коде, которые могу стать причиной взлома (отсюда и название: Splint - SPecification LINT или Secure Programming LINT).
Назад на стр. 043-040-6 Содержание Вперед на стр. 043-040-8
|