手元のRockyLinux環境をRockyLinux8からRockyLinux9に更新した際に、カーネルパラメータfs.protected_regular
がデフォルトで1となったため今までと違った挙動を示すようになった問題について紹介します。
どういう挙動になる?
/tmp
の権限を確認します。通常ここはsticky bitが設定されています
$ ls -la /tmp
(略)
drwxrwxrwt. 9 root root 4096 May 31 01:17 .
(略)
一般ユーザで/tmp
にtest
というファイルを作ります
$ touch /tmp/test
動作確認のためのPythonスクリプトを用意します
f = open("/tmp/test", "w")
一般ユーザで実行してみます(これは問題なく実行できる)
$ python open.py
$
rootで実行してみます
$ sudo python open.py
Traceback (most recent call last):
File "/home/rocky/sticky-dir/open.py", line 1, in <module>
f = open("/tmp/test", "w")
PermissionError: [Errno 13] Permission denied: '/tmp/test'
お!失敗しますね。
rootって万能じゃなかったんでしょうか・・?
カーネルパラメータfs.protected_regular
上記の挙動はこのカーネルパラメータが1
となっているためにおきました。
$ sudo sysctl -a |grep fs.protected_regular
fs.protected_regular = 1
このフラグが設定されていると 誰でも書き込めるsticky bitのついているディレクトリ内のファイルについて、その所有者しか編集できなくなるようです。(たとえrootであっても編集できません)
このカーネルパラメータは以下で導入されています
- パッチは以下で確認できます
- カーネルへの取り込みはこのCommitのようです
説明によると、このパラメータは攻撃者にデータをすり替えられるのを防ぐために導入されたもののようです。
設定で0
に戻すこともできますが、そもそも利用者でないユーザがファイルを変更するという動作自体を見直したほうが良いと思います。