web-dev-qa-db-ja.com

実行可能ビットが設定されていないときにrootが実行できないのはなぜですか?

root user canwrite権限が設定されていなくてもファイルに書き込みます。

root user canread権限が設定されていなくてもファイルを読み取ります。

root user cancdパーミッションが設定されていない場合でも、ディレクトリにexecuteを追加します。

root user cannotexecute権限が設定されていないときにファイルを実行します。

どうして?

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
26
musa

つまり、実行ビットは特別なものと見なされているためです。設定されていない場合すべての場合、ファイルは実行可能ファイルではないため、実行できません。

ただし、実行ビットが1つでも設定されている場合、rootはそれを実行できます。

観察する:

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!
25
Shadur

昔は、/etc/etc/restore/etc/rrestore/etc/initなどのシステム管理ツールが/etc/haltにありました。もしrootPATH/etc:/binに設定され、rootpasswdを実行しました。

それは正しく機能しません。

さらに悪いことに、昔は、バイナリ実行可能ファイルにマジックヘッダーがなかったため、バイナリが実行可能ファイルであるかどうかを確認することは、許可ビットを確認する以外に実際には不可能でした。したがって、実際にはファイル(ディレクトリなどではない)で、少なくとも1つの実行ビットが設定されていない限り、ファイルはexec *の有効なターゲットではありません。

*チェックは、ユーザーモード関数であるexecvpで行われた可能性があります。

理論的には何でもシェルスクリプトである可能性があるため、これは依然として有用なチェックです。

0
Joshua