試してみますがcapsh
(1:2.32-1)、パラメータを使用して再実行することlibcap2-bin
はできません。==
capsh
特にcapsh
「引数を使用すると、シェルを使用==
できないと文句を言います。execve(2)
/bin/bash
同様の問題を試した人はいますか?
ls -la /bin/bash
-rwxr-xr-x 1 root root 1183448 Jun 18 2020 /bin/bash
capsh --help
...
== re-exec(capsh) with args as for --
...
capsh == --print
execve /bin/bash failed!
capsh --print
Current: =
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
Ambient set =
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=1000(parallels) euid=1000(parallels)
gid=1000(parallels)
groups=4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),120(lpadmin),131(lxd),132(sambashare),1000(parallels)
Guessed mode: UNCERTAIN (0)
答え1
capsh
問題は、(または起動に使用したコマンド名とパス)自体を再実行しようとしていることです。
ソースstrace capsh == --print
:
execve("capsh", ["capsh", "--print"], [/* 20 vars */]) = -1 ENOENT (No such file or directory)
write(2, "execve /bin/bash failed!\n", 25execve /bin/bash failed!
) = 25
execve /bin/bash
したがって、失敗は実際には「」ではありませんexecve capsh
。このexecve()
関数はで照会を実行しません$PATH
。
フルパスを使用するとcapsh
機能します。
$ command -v capsh
/sbin/capsh
$ /sbin/capsh == --print
Current: =
[... etc. ...]
execve(2)
システムマニュアル()も参照してくださいman 2 execve
。
答え2
これは昨年修正されたlibcap:capshのバグかもしれません。
https://bugzilla.kernel.org/show_bug.cgi?id=209873
libcapバージョン2.45以降でもこれが問題になる場合はお知らせください。
答え3
もし私が見つけたソースコード==
そうです。と両方に同じ数行を使用しているようです--
。
} else if ((!strcmp("--", argv[i])) || (!strcmp("==", argv[i]))) {
argv[i] = strdup(argv[i][0] == '-' ? "/bin/bash" : argv[0]);
argv[argc] = NULL;
execve(argv[i], argv+i, envp);
fprintf(stderr, "execve /bin/bash failed!\n");
exit(1);
}
Kusalanandaが言ったように、パスが見つからないcapsh
ため見つかりません。この場合、エラーメッセージはハードコードされています。execve()
/bin/bash