/proc のセキュリティ

lkmlあたりが元ネタ

root になって

# cd /tmp/
# mkdir proctest
# echo sage > proctest/file.txt
# echo safe > proctest/file.txt
# chmod 0700 proctest/
# chmod 0666 proctest/file.txt
# ls -al proctest/
total 12
drwx------  2 root root 4096 Oct 31 00:54 .
drwxrwxrwt 12 root root 4096 Oct 31 00:54 ..
-rw-rw-rw-  1 root root    5 Oct 31 00:54 file.txt
# cat proctest/file.txt
safe

root しかアクセスできないディレクトリに file.txt という誰でも読み書きできるファイルを作ります。

# su meech -c 'cat /tmp/proctest/file.txt'
cat: /tmp/proctest/file.txt: Permission denied
# su meech -c 'echo hack > /tmp/proctest/file.txt'
zsh:1: permission denied: /tmp/proctest/file.txt
# cat proctest/file.txt
safe

/tmp/prctest に x 権限がないので当然読めませんし、書けません。

# su meech -c 'cat <&0' < proctest/file.txt
safe
# su meech -c 'echo hack >&0' < proctest/file.txt
# cat proctest/file.txt
safe

ですが、 fd 経由で読むことはできます。 書くことはできません。

# su meech -c 'echo "hacked" > /proc/self/fd/0' < proctest/file.txt
# cat proctest/file.txt
hacked

ところが、 /proc/self/fd/0 を使うと書きかえられるようになります。


…でも、これよく考えてみると fd のほうは読みこみのみで開かれているからってだけのような気がする。