何やらかした?
- libfuse で実現したい機能があったので、PoC で遊んでた
- 各関数を順次実装しながら動作確認してた
-
chmod/chownを適当に実装して、テストしたらシステムが死んだ
-
- 具体的には、一般ユーザで全ての shell が Permission Denied になったので rescue mode (root) でしか起動できなくなった
原因は
-
chmod/chownの第一引数const char * pathは、fuse を root にするパスで渡されるっぽい- つまり、fuse 直下のディレクトリにアクセスすると
path = '/'になる - このパスをそのまま標準の
chmod/chownにパススルーすると host の/として扱われる - https://github.com/libfuse/libfuse/blob/master/include/fuse.h#L423
- つまり、fuse 直下のディレクトリにアクセスすると
- fuse は sudo でマウントするので、
sudo chmod/sudo chownと同じ効果になる
上記の合せ技によって、システムのどこかの権限が異常になり、一般ユーザが何もできなくなった(っぽい)
その後
- 色々試したけど、権限復旧は諦めた
- SSD を取り出してバックアップした後、クリーンインストールして必要なファイルを戻した
- Fedora 42 だったので Fedora 43 にした
- 長年のゴミを消してシステムがきれいになったのでヨシとする
- btrfs を ext4 の中にバックアップしたから地味にデータ取り出しが面倒くさかった
-
rmとかする前に気づけてよかった - 権限関連には気をつけよう!