Информационная безопасность



     Входные двери Щелково подробности здесь. |          

Неизвестная уязвимость функции printf



Статья была опубликована в журнале

"Машинная программа выполняет то, что вы ей приказали делать, а не то, что бы вы хотели, чтобы она делала".

Третий закон Грида

В настоящей статье на примере функции printf рассматриваются ситуации, в которых отсутствие в языке Си встроенных средств определения количества переданных функции аргументов приводит к несанкционированному вторжению в защищенные системы, и предлагаются некоторые пути выхода из таких ситуаций.

У разработчиков существует шутливое высказывание: "Программ без ошибок не бывает. Бывает – плохо искали". Пример программы, приведенной ниже, позволяет убедиться, насколько эта шутка порой близка к истине. На первый (и даже на второй!) взгляд здесь нет ни одной ошибки, способной привести к несанкционированному вторжению в систему.

Использование функции fgets надежно защищает от угрозы переполнения буфера, а все строки гарантированно умещаются в отведенные им буфера. Тривиальность и типичность кода создает обманчивую иллюзию, что ошибиться здесь просто негде (обработка ошибок чтения из файла для простоты опущена, и заранее оговаривается, что используются стандартные библиотеки и обычный, а не какой-то там специальным образом модифицированный компилятор).

#include <string.h>

void main() { FILE *psw; char buff[32]; char user[16]; char pass[16]; char _pass[16];

printf("printf bug demo\n"); if (!(psw=fopen("buff.psw","r"))) return; fgets(&_pass[0],8,psw);

printf("Login:");fgets(&user[0],12,stdin); printf("Passw:");fgets(&pass[0],12,stdin);

if (strcmp(&pass[0],&_pass[0])) sprintf(&buff[0],"Invalid password: %s",&pass[0]); else sprintf(&buff[0],"Password ok\n");

printf(&buff[0]);

}

Неуловимость допущенной ошибки объясняется психологической инерцией мышления: вместо тщательного анализа кода к нему последовательно примеряются типовые штаммы и шаблоны. Если ни один из них не подходит, – программа считается защищенной.


Содержание    Вперед