`capsh`에 `==` 인수를 사용하여 다시 실행할 수 없나요?

`capsh`에 `==` 인수를 사용하여 다시 실행할 수 없나요?

시도해 보고 있지만 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

관련 정보