У меня есть программа 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
Проблемы с унаследованными возможностями для работы ⇐ Linux
-
Anonymous
1757765414
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79762492/trouble-getting-inherited-capabilities-to-work[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия