[devel] suid binaries and ELF Auxiliary Vectors

Sergey Vlasov vsu at altlinux.ru
Fri Sep 25 09:24:03 UTC 2009


On Fri, Sep 25, 2009 at 10:38:50AM +0300, Kirill A. Shutemov wrote:
> Может кто-нибудь подскажет, почему suid'ый бинарник получает пустой
> auxv?

На самом деле он получает непустой auxv, однако используемый для поиска
auxv код в этих условиях не работает.

> Маленький testcase:
> 
> #include <elf.h>
> #include <stdio.h>
> #include <unistd.h>
> 
> int main(int argc, char **argv, char **envp)
> {
>         Elf32_auxv_t *auxv;
>         while(*envp++ != NULL);
> 
>         for (auxv = (Elf32_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++)
>                 printf("%d: 0x%08x\n", auxv->a_type, auxv->a_un.a_val);
> 
>         printf("uid: %d\n", geteuid());
> 
>         return 0;
> }
> 
> Для x86_64, его нужно немного поправить.
> 
> Если у исполняемого файла нет suid-бита(или owner == uid), то auxv
> печатается нормально иначе получаем только uid. Есть идеи почему?
> И где код кторый это делает?

glibc/elf/rtld.c:process_envvars() при запуске программы с повышенными
привилегиями (с установленным флагом __libc_enable_secure) удаляет
некоторые переменные окружения вызовом unsetenv(), в результате чего
простым поиском NULL в envp не удаётся найти начало auxv.  Можно
попробовать запустить SUID-программу с очищенным окружением (через
"env -", или явно убрав только мешающие переменные) - в этом случае
поиск auxv проходит даже при наличии SUID.  Обычно мешают как минимум
переменные PWD и TMPDIR.

Если предположить, что auxv не может быть пустым, и используется
текущая реализация unsetenv() из glibc/elf/dl-environ.c (где хвост
envp гарантированно заполняется NULL даже в случае, когда одновременно
удаляется несколько переменных с одинаковым именем), работает
следующий hackaround:

	while(*envp++ != NULL);
+	while (*envp == NULL) ++envp;

(добавляется пропуск лишних NULL).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.altlinux.org/pipermail/devel/attachments/20090925/b2a5b4d0/attachment.bin>


More information about the Devel mailing list