Shebang 라인에 "-f" 플래그가 전달되는지 여부에 관계없이 tcsh는 $PATH를 반복하고 명령을 찾을 때까지 해당 경로에서 명령을 실행하려고 시도한다는 것을 알았습니다. 반면 bash는 먼저 해당 위치에 명령이 있는지 확인합니다.
이 tcsh 동작으로 인해 감사 로그에 실패한 항목이 많이 발생합니다. 감사가 execve 시스템 호출을 캡처하도록 구성되어 있기 때문입니다. 예를 들어, tcsh 스크립트에서 sleep을 호출할 때 실패한 감사 항목 중 하나는 절대 경로인 "/usr/local/bin/sleep"을 사용하여 sleep을 실행하려고 시도한다는 것을 보여줍니다.
type=SYSCALL msg=audit(1710330471.326:37838): arch=c000003e syscall=59 success=no exit=-2 a0=2601590 a1=261e010 a2=261d110 a3=7ffdc4a409e0 items=1 ppid=8930 pid=8938 auid=1011478343 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=863 comm="csh_test.sh" exe="/usr/bin/tcsh" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="non_sys_execs"
type=CWD msg=audit(1710330471.326:37838): cwd="/tmp"
type=PATH msg=audit(1710330471.326:37838): item=0
name="/usr/local/bin/sleep"
objtype=UNKNOWN cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1710330471.326:37838): proctitle=2F62696E2F637368002E2F6373685F746573742E7368
Strace는 액세스를 시도하기 전에 먼저 bash 통계를 표시합니다.
stat("/usr/local/bin/sleep", 0x7ffdd8de5630) = -1 ENOENT (No such file or directory)
stat("/usr/local/sbin/sleep", 0x7ffdd8de5630) = -1 ENOENT (No such file or directory)
stat("/sbin/sleep", 0x7ffdd8de5630) = -1 ENOENT (No such file or directory)
stat("/bin/sleep", {st_mode=S_IFREG|0755, st_size=33128, ...}) = 0
경로를 통과하는 순서는 경로가 $PATH에 정의된 순서와 일치합니다.
불행하게도 모든 서버에서 순서를 변경하는 것은 불가능하며 /usr/local/bin 등 앞에 /bin/을 놓는 것이 어떤 영향을 미칠지는 확실하지 않습니다. 하지만 만약을 대비해 bash처럼 tcsh가 통계를 먼저 수행하도록 강제하는 런타임 또는 설치 구성이 있을지 의심스럽습니다.
이러한 실패를 방지할 수 있는 다른 방법이 있습니까(전체 경로를 사용하도록 스크립트를 수정하거나 감사 캡처에서 이러한 execve 호출을 필터링하는 것 제외)?
답변1
비결은 tcsh가 명령 해싱을 활성화하도록 강제하는 것이었습니다. get이 "-f" 플래그와 함께 호출되면 비활성화되는 것으로 나타났습니다. 문제가 있는 스크립트의 경우입니다.
방금 추가한 스크립트 상단에 다음을 추가했습니다.
rehash 4096
답변 보기:tcsh에서 명령 해싱 활성화, tcsh의 명령 해싱에 대한 매우 자세한 설명입니다.