Проблемы с унаследованными возможностями для работыLinux

Ответить
Anonymous
 Проблемы с унаследованными возможностями для работы

Сообщение Anonymous »

У меня есть программа Linux, которую я хочу вызвать, которая должна открыть Raw
Sockets, привилегированную операцию. В настоящее время я использую его как root
, но, очевидно, я бы не предпочел. Я бы предпочел предоставить это
только привилегию cap_net_raw < /code>. Поэтому вместо этого я пытаюсь настроить наследуемая возможность
для процесса, в котором я буду ссылаться на программу. /> выполнять рассматриваемую программу. Далее я
знаю, что чтобы добавить возможности в набор окружающей среды, он должен быть
уже в разрешенных и наследственных наборах. (Полный код в нижней части вопроса, для справки.) cap_t caps;
std::vector cap_list;
cap_list.push_back(CAP_NET_RAW);
if((caps = cap_get_proc()) == NULL) {
printf("error getting capabilities: %s\n", strerror(errno));
} else if(cap_set_flag(caps, CAP_EFFECTIVE, cap_list.size(), &cap_list[0], CAP_SET) < 0) {
printf("error setting cap flags: %s\n", strerror(errno));
} else if(cap_set_flag(caps, CAP_INHERITABLE, cap_list.size(), &cap_list[0], CAP_SET) < 0) {
printf("error setting cap flags: %s\n", strerror(errno));
} else if(cap_set_flag(caps, CAP_PERMITTED, cap_list.size(), &cap_list[0], CAP_SET) < 0) {
printf("error setting cap flags: %s\n", strerror(errno));
} else if(cap_set_proc(caps) < 0) {
printf("error setting capabilities: %s\n", strerror(errno));
} else if(prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, cap_list[0], 0, 0) < 0) {
printf("error setting ambient capability: %s\n", strerror(errno));
} else if(prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_IS_SET, cap_list[0], 0, 0) != 1) {
printf("didn't set ambient capability\n");
} else {
printf("successfully set capabilities\n");
}

cap_free(caps);
< /code>
Там немного больше кода, чем мне необходимо; Призыв к prctl < /code> с pr_cap_ambient_is_set < /code> предназначен для отладки.
(также вы можете заметить, что в его текущем состоянии часть кода не будет правильно
. Permitted sets, and then I'm
using prctl to explicitly set it in the Ambient set.
This all seems to work: I'm not getting any of the error
messages, and I am seeing the all-clear "successfully set
capabilities" message at the end.
However, after I call setuid and exec the actual program, Это не < /em> заканчивается возможностью, которую он нуждается
. Для отладки, и поскольку она соответствует тому, как программа
будет вызвана в производстве, я не вызываю программу
напрямую, а скорее обернута сценарием оболочки.
(предполагаю, что я могу получить наследство возможности для работы, я предполагаю, что
сценарий оболочки не вызовет.
Is Inserfated CAPSH -Pript -PRIPT -PRIPT -PRIPT -PRIPT -PRIPT -PRIPTIMEPT. Вот
его вывод: < /p>
Current: cap_net_raw=i
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf,cap_checkpoint_restore
Ambient set =
Current IAB: cap_net_raw
Securebits: 00/0x0/1'b0
secure-noroot: no (unlocked)
secure-no-suid-fixup: no (unlocked)
secure-keep-caps: no (unlocked)
secure-no-ambient-raise: no (unlocked)
uid=1001(xyz) euid=1001(xyz)
gid=1001(xyz)
groups=20(dialout),20(dialout),1001(xyz)
Guessed mode: UNCERTAIN (0)
< /code>
Очевидно, что cap_net_raw все еще установлен в наследуемом наборе, но не
в эффективных, разрешенных или окружающих наборах. Это также перечислено
в «IAB», но я еще не понял, что это значит. Как будто набор окружающей среды не сохраняется через исполнительного директора, несмотря на то, что это (AIUI) весь смысл окружающей среды. В любом случае
, когда моя реальная программа вызывает, и пытается открыть необработанную сокет
, она не выполняется, с «операцией не разрешена». />
#include
#include
#include
#include
#include
#include
#include
#include

int main()
{
cap_t caps;
std::vector cap_list;
cap_list.push_back(CAP_NET_RAW);
if((caps = cap_get_proc()) == NULL) {
printf("error getting capabilities: %s\n", strerror(errno));
} else if(cap_set_flag(caps, CAP_EFFECTIVE, cap_list.size(), &cap_list[0], CAP_SET) < 0) {
printf("error setting cap flags: %s\n", strerror(errno));
} else if(cap_set_flag(caps, CAP_INHERITABLE, cap_list.size(), &cap_list[0], CAP_SET) < 0) {
printf("error setting cap flags: %s\n", strerror(errno));
} else if(cap_set_flag(caps, CAP_PERMITTED, cap_list.size(), &cap_list[0], CAP_SET) < 0) {
printf("error setting cap flags: %s\n", strerror(errno));
} else if(cap_set_proc(caps) < 0) {
printf("error setting capabilities: %s\n", strerror(errno));
} else if(prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, cap_list[0], 0, 0) < 0) {
printf("error setting ambient capability: %s\n", strerror(errno));
} else if(prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_IS_SET, cap_list[0], 0, 0) != 1) {
printf("didn't set ambient capability\n");
} else {
printf("successfully set capabilities\n");
}

cap_free(caps);

setuid(getuid());

system("./run_open_raw_sock");
}

Вот промежуточный скрипт оболочки run_open_raw_sock :
#!/bin/sh
capsh --print
./open_raw_sock

И вот исходный код для Open_Raw_sock , тестовая программа, которая пытается открыть необработанное сокет:
#include
#include
#include
#include
#include

int main()
{
int sockfd = socket(AF_INET, SOCK_RAW|SOCK_NONBLOCK, IPPROTO_RAW);
if(sockfd >= 0)
printf("successfully opened raw socket\n");
else printf("failed to open raw socket: %s\n", strerror(errno));
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... es-to-work
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»