Home

技術系のメモと日々の雑感

vim の cpoptions

linux-users ML の古い投稿の中に興味深いスレッドを見つけた。

$ ls -al
total 16
drwx------ 2 hoge hoge 4096 May  6 09:02 .
drwxr-xr-x 4 root root 4096 May  6 08:59 ..
-rw-r--r-- 1 root root   10 May  6 09:00 fuga

この状態で hoge ユーザが vim で fuga ファイルを編集できてしまうという話だ。
見ての通り、ファイルのオーナとグループは root なので拒否されるはずなのに、実際にやってみると確かに :w! で書くことができる。
で、この後もう一度 ls で確認すると

$ ls -al
total 16
drwx------ 2 hoge hoge 4096 May  6 09:06 .
drwxr-xr-x 4 root root 4096 May  6 08:59 ..
-rw-r--r-- 1 hoge hoge   20 May  6 09:06 fuga

オーナとグループが hoge に変わってる!
これはぱっと見ただけでは何が起こったのか理解できないね。
カラクリは、ファイルを編集したユーザがディレクトリの書き込み権限を持っている場合に、vim がファイルを新規で作りなおしてアクセス拒否を回避するからだそうだ。
知らないとセキュリティホールかと思って焦るかも。
cpoptions=W をセットしておけばアクセス拒否の動作になるので、上の動きがしっくりこない人はこっちにしておくといいんじゃないかな。