Лопнуть как мыльный пузырь Vint (vint@glstar.ru) Спецвыпуск Xakep, номер #045, стр. 045-004-5 Программисты решают свои проблемы сами Не только производители процессоров озабочены проблемой переполнения буфера, но и программисты ищут выход из создавшегося положения. Один из действенных методов предлагает нам сайт www.trl.ibm.com/projects/security/ssp. Метод прост и эффективен: исходный код программы подвергается автоматическому анализу плагином GCC (который и предлагают нам разработчики защиты), и при нахождении потенциально опасного участка кода происходит его автоматическая модификация таким образом, что вероятность переполнения буфера сводится к минимуму. Пример такой обработки показан в двух следующих листингах. Листинг /* 1. листинг программы до обработки: /* #include >stdio.h< int main() { char buff[20] = {0}; /*все элементы представляют собой “0” */ printf("Enter you network mask : "); /*по мысли программиста, маска сети не может быть больше 20, а значит и вводить больше никто не будет ;-)*/ scanf(buff, "%s"); /*Вот эта функция несет всю опасность. Она не проверяет длину вводимых данных, что сразу открывает возможность переполнения буфера*/ } После того как отработает gcc с установленным плагином, можно предположить, анализируя ассемблерный код, такой вариант листинга (точно сказать невозможно, так как он его просто откомпилирует): Листинг /* 2. примерный листинг после обработки gcc /* #include >stdio.h< int main() { char buff[20] = {0}; /*длина буфера сохраняется*/ printf("Enter you network mask : ") fgets(buff, sizeof(buff), stdin); /*такая конструкция считает только первые 19 символов, что позволит избежать переполнения буфера при некорректном пользовательском вводе.*/ } Аналогично происходит замена функций strcpy(), strcmp() и sprintf() на strncpy(), strncmp()и snprint(). Кроме этого, используются некоторые другие алгоритмы защиты от типичных атак переполнения буфера. Подводя итоги Ошибки программистов в обработке данных программой очень часто встают в огромные финансовые потери компаниям и организациям. И хотя уже шестнадцать лет назад вирус Морриса открыл эпоху ошибок переполнения буфера, эта проблема еще очень далека от решения. Постоянны сообщения о новых и новых уязвимостях. Но мир не стоит на месте! И есть надежда на то, что новые технологии AMD, Intel и разработки программистов смогут исправить не только ошибку переполнения, но и архитектуру, породившую ее. |