LINUX.ORG.RU

[C] [C++] Как узнать, запущена ли программа с битом SUID?

 ,


0

2

Здравствуйте!


Вопрос очень простой. Есть программа, которая должна уметь работать, будучи запущенной от обычного пользователя, и будучи запущенной с устновленным SUID.

В зависимости от режима запуска нужно немного меняеть поведение программы.

Вопрос: как внутри C/C++ программы узнать, запущена ли она просто от пользователя, или с установленным SUID?

Слишком поздно для конкретых советов, поэтому просто man getresuid, man credentials

tailgunner ★★★★★
()

что-то вроде этого. набросал на скорую руку, не компилировал и не проверял.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>

int main(int ac, char *av[])
{
    int ret;
    struct stat ss;
    memset(&ss, 0, sizeof(ss));
    ret = stat(av[0], &ss);
    if (ret < 0) {
        perror("stat");
        return ret;
    }
    if (ss.st_mode & S_ISVTX) {
       //sticky bit is set
    } else {
       //sticky bit is not set
    }
}

mi_estas
()
Ответ на: комментарий от Skolotovich

да, действительно. не знал про такую штуку. я почему-то думал, что путь всегда от корня передаётся.

mi_estas
()
Ответ на: комментарий от mi_estas

>что-то вроде этого. набросал на скорую руку, не компилировал и не проверял.

Только лучше тогда смотреть не argv[0], а /proc/self/exe. Правда linux-specific.

Sectoid ★★★★★
()
Ответ на: комментарий от ananas

хотя, если владелец - не root, второе условие не обязательно. основное - первое

ananas ★★★★★
()

если «злоумышленник» доберётся до этой программы, то внутрь переменной av[0] — он сможет засунуть лубое значение (в том числе не совпадающее с реальность ни на грам :))

...такчто да... как сказал — Sectoid *** (05.09.2011 12:42:38) — лучше смотреть только /proc/self/exe :-)

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

> если «злоумышленник» доберётся до этой программы, то внутрь переменной av[0] — он сможет засунуть лубое значение (в том числе не совпадающее с реальность ни на грам :))

такчто да... как сказал — Sectoid *** (05.09.2011 12:42:38) — лучше смотреть только /proc/self/exe :-)


А что, условие вида:

if (getuid() != geteuid())

можно обойти через av[0]?

webhamster
() автор топика
Ответ на: комментарий от bk_

> Что такое av[0]? argv[0]?

да... эт я скопировал из вышеприведёного примера:

int main(int ac, char *av[])

(так как вышеприведённый пример как раз и обсуждал :))

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

Аа, я на автомате прочел, но пропустил мимо сознания ac, av.

bk_ ★★
()
Ответ на: комментарий от webhamster

> А что, условие вида:



if (getuid() != geteuid())



можно обойти через av[0]?

ну это уже смотря насколько кривой алгоритм я напишу :-D :-D :-D :-D , и насколько аккуратно буду целется себе в ногу :)
[хотя признаться чесно, ещё покачто не придумал каким образом нужно взять в руку револьвер, для этой цели :)]

...а если не целится в ногу... то наверно..... .... никто из программистов вообще не будет использовать av[0] в SUID-нутых программах

впрочем в любом случае — это былобы очень сложно привязать к getuid() и geteuid() :-)

user_id_68054 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.