Системы с уязвимостью (функция)


Предположим, у нас есть следующие программы:

#include <stdlib.h>
#include <stdio.h>

int main()
{
        char *user = getenv("USER");
        char buffer[4096];

        if (user) {
                snprintf(buffer, sizeof buffer, "/bin/echo %s", user);   
                system(buffer);
        }

        return 0;
}

Это возможно для пользователей, чтобы вызвать эту программу, чтобы выполнить произвольные команды?



5770
7
задан 30 ноября 2011 в 04:11 Источник Поделиться
Комментарии
4 ответа

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

tmp$ cat foo.c
#include <stdlib.h>
#include <stdio.h>

int
main() {
char *user = getenv("USER");
char buffer[4096];
if (user) {
snprintf(buffer, sizeof buffer, "/bin/echo %s", user);
printf("running %s\n", buffer);
system(buffer);
}
return 0;
}
tmp$ gcc foo.c
tmp$ mkdir /tmp/xxx
tmp$ ls -ld /tmp/xxx
drwxr-xr-x 2 daveshawley users 68 Nov 30 22:25 /tmp/xxx/
tmp$ USER='foo; rm -fr /tmp/xxx' ./a.out
running /bin/echo foo; rm -fr /tmp/xxx
foo
tmp$ ls -ld /tmp/xxx
ls: /tmp/xxx: No such file or directory
tmp$

13
ответ дан 1 декабря 2011 в 03:12 Источник Поделиться

Если вы хотите распечатать значение пользователя переменную среды, вы можете сделать:

fprintf(stderr, "%s", getenv("USER"));

Нет никакой необходимости называть системы();.

6
ответ дан 30 ноября 2011 в 04:11 Источник Поделиться

Другие сказали вам, как использовать это. В духе пропаганды правильный способ сделать вещи, вот это хороший способ, чтобы выполнить эхо с ввода данных и не имеют уязвимостей (исключая конечно некоторые ошибки в Эхе :-)):

execlp("echo", string_from_user, NULL);

Если вы имеете дело непосредственно с метод exec семейства системных вызовов, вы можете пройти чистейший строки напрямую в программу без каких-либо шансов, что снаряд будет перевирать их, потому что нет оболочки в этом случае. Следовательно, нет необходимости, чтобы спастись.

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


  • Если недоверенный пользователь может изменить /ОГРН/Эхо, очевидно, что недоверенный пользователь может сделать это выполнить произвольный код.

  • Если недоверенный пользователь может изменить путь к переменной окружения, мой execlp примере выше уязвима. Одно решение-вообще не использовать -П вариантов из старпомов семейства системных вызовов, потому что те не проверить путь.

3
ответ дан 4 декабря 2011 в 05:12 Источник Поделиться

Это не возможно. Тебе придется писать то, что изменения параметров пользователя, условия, которые позволят эффективно backspaces за предыдущие персонажи, и система("строка") фактически не используется снаряд через псевдо-терминал для выполнения, где обработка происходит забой.

редактировать:
Несмотря на комментарии ниже, и вниз-голосования, они являются неправильными.

/ОГРН/обработка рыбы (или любой другой оболочки определяется) только процессы возврата и других редактировать символы при подключении к устройству терминала для ввода.

Кроме того, автор оригинала стремилась подорвать программа не собственного изготовления.

-4
ответ дан 30 ноября 2011 в 05:11 Источник Поделиться