ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] suid binaries and ELF Auxiliary Vectors
@ 2009-09-25  7:38 Kirill A. Shutemov
                     ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Kirill A. Shutemov @ 2009-09-25  7:38 UTC (permalink / raw)
  To: ALT Linux Team development discussions
  Cc: Michail Yakushin, Konstantin A. Lepikhov, Dmitry V. Levin

Может кто-нибудь подскажет, почему suid'ый бинарник получает пустой
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. Есть идеи почему?
И где код кторый это делает?

Немного о себе:
$ uname -r
2.6.30-lks-wks-alt1
$ rpm -q glibc-core
glibc-core-2.10.1-alt6

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] suid binaries and ELF Auxiliary Vectors
  @ 2009-09-25  8:15   ` Kirill A. Shutemov
  2009-09-25  8:23     ` Kirill A. Shutemov
  0 siblings, 1 reply; 9+ messages in thread
From: Kirill A. Shutemov @ 2009-09-25  8:15 UTC (permalink / raw)
  To: Kirill A. Shutemov, ALT Linux Team development discussions,
	Dmitry V. Levin, Konstantin A. Lepikhov, Michail Yakushin

2009/9/25 Konstantin A. Lepikhov <lakostis@unsafe.ru>:
> http://people.redhat.com/drepper/elftut1.ps -

Thanks for link.

> "The function create_elf_tables is responsible for
> creating the user stack which includes creating the auxiliary vector."

Yep, I see. It really creates auxv on suid binaries. At least it reaches
copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t))
But still there is no auxv in userspace. :(


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] suid binaries and ELF Auxiliary Vectors
  2009-09-25  8:15   ` Kirill A. Shutemov
@ 2009-09-25  8:23     ` Kirill A. Shutemov
  2009-09-25  9:12       ` Dmitry V. Levin
  0 siblings, 1 reply; 9+ messages in thread
From: Kirill A. Shutemov @ 2009-09-25  8:23 UTC (permalink / raw)
  To: Kirill A. Shutemov, ALT Linux Team development discussions,
	Dmitry V. Levin, Konstantin A. Lepikhov, Michail Yakushin

On Fri, Sep 25, 2009 at 11:15 AM, Kirill A. Shutemov
<kirill@shutemov.name> wrote:
> 2009/9/25 Konstantin A. Lepikhov <lakostis@unsafe.ru>:
>> http://people.redhat.com/drepper/elftut1.ps -
>
> Thanks for link.
>
>> "The function create_elf_tables is responsible for
>> creating the user stack which includes creating the auxiliary vector."
>
> Yep, I see. It really creates auxv on suid binaries. At least it reaches
> copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t))
> But still there is no auxv in userspace. :(
>

It seems problem is in glibc. When I compiled similar code with
klibc, it works fine.

Dmitry, could you comment it? Probably, it's security-related
thing. What's the point?


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] suid binaries and ELF Auxiliary Vectors
  2009-09-25  8:23     ` Kirill A. Shutemov
@ 2009-09-25  9:12       ` Dmitry V. Levin
  0 siblings, 0 replies; 9+ messages in thread
From: Dmitry V. Levin @ 2009-09-25  9:12 UTC (permalink / raw)
  To: Kirill A. Shutemov
  Cc: Michail Yakushin, ALT Linux Team development discussions,
	Konstantin A. Lepikhov

[-- Attachment #1: Type: text/plain, Size: 1032 bytes --]

On Fri, Sep 25, 2009 at 11:23:47AM +0300, Kirill A. Shutemov wrote:
> On Fri, Sep 25, 2009 at 11:15 AM, Kirill A. Shutemov
> <kirill@shutemov.name> wrote:
> > 2009/9/25 Konstantin A. Lepikhov <lakostis@unsafe.ru>:
> >> http://people.redhat.com/drepper/elftut1.ps -
> >
> > Thanks for link.
> >
> >> "The function create_elf_tables is responsible for
> >> creating the user stack which includes creating the auxiliary vector."
> >
> > Yep, I see. It really creates auxv on suid binaries. At least it reaches
> > copy_to_user(sp, elf_info, ei_index * sizeof(elf_addr_t))
> > But still there is no auxv in userspace. :(
> >
> 
> It seems problem is in glibc. When I compiled similar code with
> klibc, it works fine.
> 
> Dmitry, could you comment it? Probably, it's security-related
> thing. What's the point?

Every ELF executable gets an auxv, but when glibc detects that the running
process is privileged, it mangles its environment and, besides all, sets
__libc_enable_secure variable to 1.


-- 
ldv

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] suid binaries and ELF Auxiliary Vectors
  2009-09-25  7:38 [devel] suid binaries and ELF Auxiliary Vectors Kirill A. Shutemov
  @ 2009-09-25  9:24 ` Sergey Vlasov
  2009-09-25 10:05   ` Kirill A. Shutemov
  2009-09-25 10:20   ` Kirill A. Shutemov
  2009-09-25  9:29 ` Andrey Rahmatullin
  2 siblings, 2 replies; 9+ messages in thread
From: Sergey Vlasov @ 2009-09-25  9:24 UTC (permalink / raw)
  To: devel

[-- Attachment #1: Type: text/plain, Size: 1842 bytes --]

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).

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] suid binaries and ELF Auxiliary Vectors
  2009-09-25  7:38 [devel] suid binaries and ELF Auxiliary Vectors Kirill A. Shutemov
    2009-09-25  9:24 ` Sergey Vlasov
@ 2009-09-25  9:29 ` Andrey Rahmatullin
  2009-09-25  9:35   ` Dmitry V. Levin
  2 siblings, 1 reply; 9+ messages in thread
From: Andrey Rahmatullin @ 2009-09-25  9:29 UTC (permalink / raw)
  To: devel

[-- Attachment #1: Type: text/plain, Size: 489 bytes --]

On Fri, Sep 25, 2009 at 10:38:50AM +0300, Kirill A. Shutemov wrote:
> $ uname -r
> 2.6.30-lks-wks-alt1
> $ rpm -q glibc-core
> glibc-core-2.10.1-alt6

2.6.30.5-linode20; libc6-2.9-25
2.6.18-128.2.1.el5.028stab064.7; glibc-2.5-34.el5_3.1
В обоих случаях всё работает, вроде как.

-- 
WBR, wRAR (ALT Linux Team)
Powered by the ALT Linux fortune(6):

>Вы когда-нибудь видели код apt'a изнутри? На досуге рекомендую :)
На ночь, что бы кошмары снились ;-)
		-- rider in devel@

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 490 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] suid binaries and ELF Auxiliary Vectors
  2009-09-25  9:29 ` Andrey Rahmatullin
@ 2009-09-25  9:35   ` Dmitry V. Levin
  0 siblings, 0 replies; 9+ messages in thread
From: Dmitry V. Levin @ 2009-09-25  9:35 UTC (permalink / raw)
  To: ALT Devel discussion list

[-- Attachment #1: Type: text/plain, Size: 585 bytes --]

On Fri, Sep 25, 2009 at 03:29:13PM +0600, Andrey Rahmatullin wrote:
> On Fri, Sep 25, 2009 at 10:38:50AM +0300, Kirill A. Shutemov wrote:
> > $ uname -r
> > 2.6.30-lks-wks-alt1
> > $ rpm -q glibc-core
> > glibc-core-2.10.1-alt6
> 
> 2.6.30.5-linode20; libc6-2.9-25
> 2.6.18-128.2.1.el5.028stab064.7; glibc-2.5-34.el5_3.1
> В обоих случаях всё работает, вроде как.

Работоспособность примера зависит от того, какие переменные среды есть у
процесса при запуске, и насколько тщательно ваша версия glibc их чистит
в случае, если этот процесс привилегированный.


-- 
ldv

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] suid binaries and ELF Auxiliary Vectors
  2009-09-25  9:24 ` Sergey Vlasov
@ 2009-09-25 10:05   ` Kirill A. Shutemov
  2009-09-25 10:20   ` Kirill A. Shutemov
  1 sibling, 0 replies; 9+ messages in thread
From: Kirill A. Shutemov @ 2009-09-25 10:05 UTC (permalink / raw)
  To: ALT Linux Team development discussions

2009/9/25 Sergey Vlasov <vsu@altlinux.ru>:
> 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).

Спасибо!

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] suid binaries and ELF Auxiliary Vectors
  2009-09-25  9:24 ` Sergey Vlasov
  2009-09-25 10:05   ` Kirill A. Shutemov
@ 2009-09-25 10:20   ` Kirill A. Shutemov
  1 sibling, 0 replies; 9+ messages in thread
From: Kirill A. Shutemov @ 2009-09-25 10:20 UTC (permalink / raw)
  To: ALT Linux Team development discussions

2009/9/25 Sergey Vlasov <vsu@altlinux.ru>:
> glibc/elf/rtld.c:process_envvars() при запуске программы с повышенными
> привилегиями (с установленным флагом __libc_enable_secure) удаляет
> некоторые переменные окружения вызовом unsetenv(), в результате чего
> простым поиском NULL в envp не удаётся найти начало auxv.

Мне кажется, тут ошибка в glibc. Если glibc очищает переменные окружения,
то логично было бы подвинуть и auxv. Так бы не нарушался контракт с
userspace.

Я ещё что-то упускаю из виду?

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2009-09-25 10:20 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-25  7:38 [devel] suid binaries and ELF Auxiliary Vectors Kirill A. Shutemov
2009-09-25  8:15   ` Kirill A. Shutemov
2009-09-25  8:23     ` Kirill A. Shutemov
2009-09-25  9:12       ` Dmitry V. Levin
2009-09-25  9:24 ` Sergey Vlasov
2009-09-25 10:05   ` Kirill A. Shutemov
2009-09-25 10:20   ` Kirill A. Shutemov
2009-09-25  9:29 ` Andrey Rahmatullin
2009-09-25  9:35   ` Dmitry V. Levin

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git