실행 비트가 설정되지 않은 경우 루트를 실행할 수없는 이유는 무엇입니까?


26

root사용자 의 경우에도 파일에 쓰기 write권한이 설정되어 있지 않습니다.

root사용자 의 경우에도 파일을 읽을 read권한이 설정되지 않습니다.

root권한이 설정되지 않은 경우에도 사용자 cd 디렉토리로 들어갈 수 있습니다execute .

root권한이 설정되어 있지 않으면 사용자 파일을 실행할 수 없습니다execute .

왜?

user$ echo '#!'$(which bash) > file
user$ chmod 000 file
user$ ls -l file
---------- 1 user user 12 Jul 17 11:11 file
user$ cat file                      # Normal user cannot read
cat: file: Permission denied
user$ su
root$ echo 'echo hello' >> file     # root can write
root$ cat file                      # root can read
#!/bin/bash
echo hello
root$ ./file                        # root cannot execute
bash: ./file: Permission denied

답변:


25

간단히 말해, 실행 비트는 특별하다고 간주되기 때문입니다. 이 설정되어 있지 않은 경우 모두에서 , 다음 파일은 실행하지로 간주되며, 따라서 실행할 수 없습니다.

그러나 하나의 실행 비트조차도 설정되면 루트가이를 실행할 수 있습니다.

관찰 :

caleburn: ~/ >cat hello.sh
#!/bin/sh

echo "Hello!"

caleburn: ~/ >chmod 000 hello.sh
caleburn: ~/ >./hello.sh
-bash: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
sudo: ./hello.sh: command not found

caleburn: ~/ >chmod 100 hello.sh
caleburn: ~/ >./hello.sh
/bin/sh: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
Hello!

0

에 살았던 옛날의 시스템 관리 도구에서 /etc와 같은 /etc/restore, /etc/rrestore, /etc/init, /etc/halt경우 등 어떤 일이 일어날 것이라고 상상 root의가 PATH로 설정 /etc:/bin하고 root달렸다 passwd.

제대로 작동하지 않습니다.

설상가상으로, 이전에는 바이너리 실행 파일에 매직 헤더가 없었으므로 바이너리가 실행 파일인지 확인하는 것은 권한 비트를 확인하는 것 외에는 실제로 불가능했습니다. 따라서 exec실제로 파일 (디렉토리 등이 아님)이 아니고 하나 이상의 실행 비트 세트가없는 한 *의 유효한 대상이 아닌 파일을 만들었습니다 .

* 점검은 사용자 모드 기능인 execvp에있을 수 있습니다.

이론적으로 쉘 스크립트가 될 수있는 것처럼 여전히 유용한 검사이므로 왜 제거해야합니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.