Ich habe ein Linux -Programm, das ich aufrufen möchte, das Raw
Sockets öffnen möchte, einen privilegierten Betrieb. Derzeit laufe ich es als
root aus, aber natürlich würde ich es eher nicht mehr nicht. Ich würde es lieber
nur das Privileg der CAP_NET_RAW gewähren. Stattdessen versuche ich, eine vererbbare
-Funktion für den Prozess einzurichten, in dem ich das Programm aufrufen werde. /> führe das fragliche Programm aus. Ich weiß weiter
, dass es
bereits in den zulässigen und eröffneten Sätzen sein muss, um eine Fähigkeit zu verleihen.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>
Es gibt dort etwas mehr Code, als ich mir vorstellen kann, dass ich es wirklich brauche. Was Sie
sehen, beinhaltet einige zunehmend frantische Debugging-Versuche. prctl < /code>, um es explizit in den Umgebungsset zu setzen. Ende. Zum Debuggen und weil es der Art und Weise, wie das Programm
in der Produktion aufgerufen wird, übereinstimmt, rufe ich das Programm nicht direkt auf, sondern um ein Shell -Skript. Hier ist
seine Ausgabe: < /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>
Eindeutig wird cap_net_raw im vererbbaren Satz festgelegt, jedoch nicht
in den effektiven, erlaubten oder Umgebungssätzen. Es ist auch in "IAB"
aufgeführt, aber ich habe noch nicht herausgefunden, was das bedeutet. In jedem Fall, wenn mein tatsächliches Programm aufgerufen wird, und versucht, einen rohen
-Strocken zu öffnen, scheitert es mit "Operation nicht zulässig". /> Über Linux -Systemprogrammierung. Wenn jemand der Meinung ist, dass es in
Superuser oder Unix & Linux Stack Exchange
angemessener wäre (oder eher bessere Antworten), kann ich es auf jeden Fall bewegen. Programm
, das versucht, den Rohbuch zu öffnen.>
Probleme, erbliche Fähigkeiten zur Arbeit zu erhalten ⇐ Linux
-
- Similar Topics
- Replies
- Views
- Last post