history

青木日記 RSS

<前の日 | この月 | 次の日>

2005-05-21

FileUtils.rm_rf (2)

よく考えるとやはり chmod(0700) するのは問題がある。 少なくとも chmod(lstat(path).mode & 07770) でないとまずい。

あと、どうにも不安が解消できないのが NTFS なんだよな。 いちおうテストはしてるけど、 これで本当に正しく動作してるのか確信できない。

(16:53)

lchmod, lchown (2)

lchmod と lchown を検出する方法がわかった。

~ % cat t
def have_lchmod?
  return false unless File.respond_to?(:lchmod)
  begin
File.lchmod 0
return true
  rescue NotImplementedError
return false
  end
end
 
def have_lchown?
  return false unless File.respond_to?(:lchown)
  begin
File.lchown nil, nil
return true
  rescue NotImplementedError
return false
  end
end
 
p have_lchown?
p have_lchmod?
 
~ % test-all-ruby t
ruby 1.4.6 (2000-08-16) [i686-linux]
false
false
ruby 1.6.0 (2000-09-19) [i686-linux]
false
false
ruby 1.6.1 (2000-09-27) [i686-linux]
false
false
ruby 1.6.2 (2000-12-25) [i686-linux]
false
false
ruby 1.6.3 (2001-03-19) [i686-linux]
false
false
ruby 1.6.4 (2001-06-04) [i686-linux]
false
false
ruby 1.6.5 (2001-09-19) [i686-linux]
false
false
ruby 1.6.6 (2001-12-26) [i686-linux]
false
false
ruby 1.6.7 (2002-03-01) [i686-linux]
false
false
ruby 1.6.8 (2002-12-24) [i686-linux]
false
false
ruby 1.8.0 (2003-08-04) [i686-linux]
true
false
ruby 1.8.1 (2003-12-25) [i686-linux]
true
false
ruby 1.9.0 (2005-05-16) [i686-linux]
true
false

(17:20)

FileUtils.rm_rf (3)

もしかして NTFS だと File.chmod は何の効果もないのか?! うわぁぁぁぁ

Win32 API 直叩きか……。

(20:55)

FileUtils.rm_rf (4)

もういいよ、NTFS のことはしばらく忘れて UNIX に専念する。 真面目に Win32 API を勉強してから考えよう。

(20:56)

FileUtils.rm_rf (5)

ちがった。オーナーじゃなきゃ chmod できないんだから chmod できれば常にオーナーだ。だからやっぱ 700 でいいんだ。

とすると、root staff 777 みたいなディレクトリはどうすればいいんだろ。 通常ユーザでも消せるけど、chmod はできないから結局 world writable で、 すりかえは防げないことになるな……。 自分に権限がなきゃ /etc/passwd みたいな重要ファイルは消せないからいいのか? いや、CGI が使ってるデータみたいなものは消せてしまう?

いや違う、world writable ならそんなことしなくても 普通に消せるからこれは問題でないんだ。 今回の問題は権限の大きいユーザが消すときだけ発生する。 問題は「権限が大きい」=「chmod できる (オーナーである)」が成立するかどうかだ。

グループとして所有していて、world writable な場合はどうなるか。 lstat から unlink までの間にディレクトリをシンボリックリンクに すりかえると重要ファイルが消せるな。……え? やっぱりまずい?

あれ? もしかして chdir しても防げないんじゃ……。 chdir しようとしてるディレクトリを シンボリックリンクにすりかえられたらまずいじゃん。 ということは、world writable なディレクトリがあると どうやっても安全には消せない? だから、chdir するかしないかに関係なく chmod 700 する必要がある。 したがって安全に消せるのはオーナーだけだ。 だからオーナー以外が world writable なディレクトリを再帰的に 消す場合はもともとセキュアにはなりえないので、考えるだけ無駄なんだな。

ということで結論は chmod 700 する。 オーナーでない場合は、もともとセキュアじゃないので呼ぶほうが悪い。

(21:58)

FileUtils.rm_rf (6)

と、決心した直後に気付いたけど、 消すディレクトリの上を全部 chmod しないと問題があるのね。 もういい、そんなのあきらめる。

いや、/tmp の場合はやばいのか。 困ったな。root で掃除すると仮定するなら、 まず chown(root) してもらうべきなのかな。

うん、それじゃ、そういうことで。

(22:07)

言語ゲーム

言語ゲームと言えばウィトゲンシュタイン

(23:02)

UNIX のパスって……

これまで「a/.」も「a」も同じだろーと思ってたんだけど、 そうじゃないんだな。a がディレクトリを指すシンボリックリンクの場合、 readlink("a") は大丈夫だが readlink("a/.") は EINVAL になる。 まあ、言われてみりゃ確かにそうだけど、って感じ。

(01:03)

複数の Wiki に脆弱性?

http://slashdot.jp/article.pl?sid=05/05/19/088246&topic=16

「複数の Wiki」ってんで慌てて調べたけど、添付ファイルがらみなのね。 明らかに BitChannel は関係ないな (実装してないから)。

あ、なんか BitChannel いじりたくなってきた。

(02:00)

errno の差

結論: 使われているかはともあれ、 Windows にも大半の errno 定数は定義されている。 Win9x は知ったことか、な方向で。

(02:37)

本日のツッコミ(全2件) [ツッコミを入れる]
(う) (2005-05-22 12:25)

errno-*.txt、どっちも404ですだ。

青木 (2005-05-25 20:12)

うう、アップロードするの忘れてましたー。

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS