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
つまり、実行ビットは特別なものと見なされているためです。設定されていない場合すべての場合、ファイルは実行可能ファイルではないため、実行できません。
ただし、実行ビットが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!
昔は、/etc
、/etc/restore
、/etc/rrestore
、/etc/init
などのシステム管理ツールが/etc/halt
にありました。もしroot
のPATH
は/etc:/bin
に設定され、root
はpasswd
を実行しました。
それは正しく機能しません。
さらに悪いことに、昔は、バイナリ実行可能ファイルにマジックヘッダーがなかったため、バイナリが実行可能ファイルであるかどうかを確認することは、許可ビットを確認する以外に実際には不可能でした。したがって、実際にはファイル(ディレクトリなどではない)で、少なくとも1つの実行ビットが設定されていない限り、ファイルはexec
*の有効なターゲットではありません。
*チェックは、ユーザーモード関数であるexecvpで行われた可能性があります。
理論的には何でもシェルスクリプトである可能性があるため、これは依然として有用なチェックです。