* [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
[parent not found: <20090925075819.GA12530@lks.home>]
* 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 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
* 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
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