LINUX.ORG.RU

execve(script) error 13 (Permission denied)

 , ,


0

1

Из-за чего может быть ошибка 'execve(script) error 13 (Permission denied)'?
strace:

26284 execve("/bin/suid/bash", ["/bin/suid/bash"], 0x7ffc11b4b2b8 /* 76 vars */) = 0
26284 brk(NULL)                         = 0x5ff5ee161000
26284 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7d8540323000
26284 access(0x7d85403151a0, R_OK)      = -1 ENOENT (No such file or directory)
26284 openat(AT_FDCWD, 0x7d8540313fc3, O_RDONLY|O_CLOEXEC) = 3
26284 newfstatat(3, 0x7d8540314ba1, 0x7ffc7a798000, AT_EMPTY_PATH) = 0
26284 mmap(NULL, 34119, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7d85402db000
26284 close(3)                          = 0
26284 openat(AT_FDCWD, 0x7d85403230a0, O_RDONLY|O_CLOEXEC) = 3
26284 read(3, 0x7ffc7a7981b8, 832)      = 832
26284 pread64(3, 0x7ffc7a797de0, 784, 64) = 784
26284 newfstatat(3, 0x7d8540314ba1, 0x7ffc7a798060, AT_EMPTY_PATH) = 0
26284 pread64(3, 0x7ffc7a797c80, 784, 64) = 784
26284 mmap(NULL, 1998224, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7d85400f3000
26284 mmap(0x7d8540119000, 1421312, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x26000) = 0x7d8540119000
26284 mmap(0x7d8540274000, 344064, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x181000) = 0x7d8540274000
26284 mmap(0x7d85402c8000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1d4000) = 0x7d85402c8000
26284 mmap(0x7d85402ce000, 52624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7d85402ce000
26284 close(3)                          = 0
26284 mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7d8540320000
26284 arch_prctl(ARCH_SET_FS, 0x7d8540320740) = 0
26284 set_tid_address(0x7d8540320a10)   = 26284
26284 set_robust_list(0x7d8540320a20, 24) = 0
26284 rseq(0x7d8540321060, 0x20, 0, 0x53053053) = 0
26284 mprotect(0x7d85402c8000, 16384, PROT_READ) = 0
26284 mprotect(0x5ff5cfe1c000, 4096, PROT_READ) = 0
26284 mprotect(0x7d854031c000, 8192, PROT_READ) = 0
26284 prlimit64(0, RLIMIT_STACK, NULL, 0x7ffc7a798bb0) = 0
26284 munmap(0x7d85402db000, 34119)     = 0
26284 setuid(0)                         = -1 EPERM (Operation not permitted)
26284 execve(0x5ff5cfe1b004, 0x7ffc7a798f98, 0x7ffc7a798fa8) = -1 EACCES (Permission denied)
26284 write(2, 0x7ffc7a7967d0, 44)      = 44
26284 exit_group(-1)                    = ?
26284 +++ exited with 255 +++
Причём если запустить эту программу как из основной ОС, то ошибка не возникает. Но если эту же программу запускать в chroot из дпугой ОС - возникает эта ошибка. Также эта же ошибка возникает в той ОС, где она запускается без ошибки, если запускать эту программу через strace.

На этой программе suid-bit. Дальше она должна запускать script.
Исходник:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

char* script = "/bin/suid/bash_";
extern char **environ;

int main(int argc, char **argv) {

        argv[0] = script;

        setuid(0);
        execve(script, argv, environ);
        fprintf(stderr, "execve(script) error %d (%s)\n", errno, strerror(errno));
        return -1;
}
Дистр - CRUX, ядро самосборное.

★★★★★

Если ничто другое не помогает, прочтите, наконец, инструкцию.
— Аксиома Кана

$ man strace
...
Programs that use the setuid bit do not have effective user ID
       privileges while being traced.
...
debugger ★★★★★
()
Последнее исправление: debugger (всего исправлений: 1)

запускать в chroot

Не должно влиять на suid.

/bin/suid/bash_

Это бинарь или испольняемый скрипт с #!?

argv[0] = script;

Это так не работает. Надо заменять содержимое используя memcpy (и желательно не вылезать за границы всех аргументов).

anonymous
()

В мане же причины указаны, ты проверял?

1) не хватает прав на доступ к указанному файлу (первый аргумент) либо интерпретатору которы в его шебанге

2) файл или шелл из его шебанга - не обычный файл (директория, устройство, пайп, сокет)

3) noexec на точке монтирования (не уточняется на чьей, видимо так же на скрипте и на его шелле)

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от anonymous

Я бы считал это варнингом, поскольку оно не мешает пытаться сделать execve. Вот когда execve не работает или то, что он запустил, падает - это уже error, да, а варнинг нам поможет разобраться в причинах.

firkax ★★★★★
()