среда, 7 июля 2010 г.

Утилиты для аудита исходных кодов: Graudit, RATS

Бесспорно полезно проводить аудит исходных кодов с целью выявления потенциально проблемных и опасных участков кода. В случае, если эта операция автоматизирована при помощи какой-то утилиты, то также это не отнимет много времени.
Пробовал я утилиты для автоматизированного аудита исходных кодов на задачах 1-го курса университета (ЯП c), расположенных в ~/1-course.

Graudit
Graudit представляет из себя простой скрипт (использующий grep) и набор сигнатур для поиска потенциальных опасных участков в исходных кодах.
Поддерживаются следующие ЯП: asp, jsp, c, perl, php, python, dotnet.
Пробуем
$ graudit ~/1-course
Graudit (версии 1.6) считает, что мои задачи 1-го курса не содержат потенциально опасных участков кода.

RATS
Rough Auditing Tool for Security.
RATS - утилита для обнаружения популярных ошибок программистов, влияющих на безопасность кода. 
Если верить описанию, то RATS более продвинутый инструмент, нежели Graudit. Способен, скажем, находить потенциальное переполнение буфера, помимо отслеживания вызова небезопасных функций.
Поддерживаются следующие ЯП: c, cpp, perl, php, python.
Пробуем
$ rats ~/1-course
1-course/12_9.cpp:77: High: fixed size local buffer
1-course/12_9.cpp:78: High: fixed size local buffer
1-course/13_4.cpp:68: High: fixed size local buffer
1-course/13_4.cpp:129: High: fixed size local 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.

1-course/12_9.cpp:97: High: strcat
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.

1-course/12_9.cpp:100: High: 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.

1-course/16_28.cpp:131: High: scanf
1-course/16_28.cpp:136: High: scanf
1-course/16_28.cpp:159: High: scanf
1-course/15_3.cpp:47: High: scanf
1-course/15_3.cpp:61: High: scanf
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.

1-course/1_34.cpp:61: Medium: read
1-course/12_9.cpp:69: Medium: read
1-course/12_9.cpp:142: Medium: read
1-course/12_9.cpp:172: Medium: read
Check buffer boundaries if calling this function in a loop and make sure you are not in danger of writing past the allocated space.

Total lines analyzed: 2638
Total time 0.004944 seconds
533576 lines per second
Оказывается мои задачи с 1-го курса все же не идеальны.
Что именно не понравилось RATS в моем коде ?
12_9.cpp
// ...
/* 69 */ in.read(&b,1);
// ...
int somefunc(const char* str1,const char* str2,int sz){
// ...
/* 77 */ unsigned char c1 = (unsigned char)str1[i];
/* 78 */ unsigned char c2 = (unsigned char)str2[i];
// ...
}
// ...
/* 97 */ strcat(strcat(res,token)," ");
// ...
/* 100 */ strcpy(buffer,res);
// ...
Как видно, str1 и str2 - это не fixed size local buffer, это указатели, хотя безусловно код опасен. Что касается strcat, strcpy и read, то предупреждения RATS адекватны.
13_4.cpp
// ...
/* 68 */ char num[25];
// ...
/* 129 */ char num[25];
// ...
Здесь согласен, опасность исходит именно от использования fixed size local buffer.
16_28.cpp, 15_3.cpp и 1_34.cpp не особо интересны.

Итог
Graudit обнаруживает вхождение сигнатур из своей базы в анализируемых исходных кодах, но за счет скудной базы он пока (версия 1.6) не пригоден даже для простых (мои задачи 1-го курса) задач. Хотя на некоторых python-скриптах Graudit обнаруживал проблемы, но за счет не менее скудного вывода сообщений о проблемах, понять что он хотел сообщить я не смог.
RATS - интересная утилита, удобно группирует вывод сообщений о проблемах в исходном коде, сообщения адекватны. Ключом -w RATS можно настроить на вывод различного класса сообщений о проблемах (по умолчанию, о проблемах с маркером Low не сообщается).

Комментариев нет:

Отправить комментарий