history

青木日記 RSS

<前月 | 最新 | 次月>

2005-05-02

近況

インフルエンザですよ奥さん……。 もう一週間くらい体温が 38 度をキープしてて死にそうです。 今年のインフルエンザはマジで凶悪なので、 みなさん気をつけてください。

次回は復活後〜 (23:53)

setup.rb / site_ruby

寝ようかと思ったけどこれだけ投げとく。

http://zunda.freeshell.org/d/20050414.html#p03

「setup.rb で --prefix を指定すると site_ruby の値が /usr/local/local/lib/... になっちゃうよ〜」問題。 これはこないだ別の人からもメールで文句を言われて そしてまた今来たメールにも書いてあった。

とりあえず、これについては解決策を考えつかない。 「/usr/local」は一般的な prefix の値 (/usr) を含んでいるので、 setup.rb みたいに自動処理するとどうしても $(prefix)/local/... に ならざるをえない。

じゃあ新しい rbconfig.rb の仕様を使って MAKEFILE_CONFIG を見ればよいかというと そうでもない。例えば Debian だと --sitedir=$(prefix)/local/... と定義されているので、--prefix=/usr/local にするとやっぱり /usr/local/local/... になる。

考えてみると、prefix を変えると site_ruby も変わるってのが変なのかもしれん。 site_ruby のパスは ruby に埋め込まれており、その値でないと意味をなさない。 だから setup.rb で指定する値に関らず一定であったほうがよいのではないだろうか。

また、siteruby 以外にも不変であったほうがよい値はあるだろうか。 (01:11)

本日のツッコミ (全3件) [ツッコミを入れる]

ay [Debianでは少し前に--sitedir=/usr/local/...に変更しました。]

腹風邪ひきzunda [風邪おだいじに〜。

パッケージャの立場から言うと、最終的なインストール先を決めるprefixとパッケージ作成時に仮にインストールされるdestdirを別に指定したいような気がします。例えば実行ファイルは、プログラムからは{prefix}/binにインストールされるように見えるのだけれど実際は{destdir}/{prefix}/binにインストールされる。

そこから演繹して、site_rubyはインストールされているRubyから取ってくるんだけどインストール先はdestdirみたいなもので制御できるとうれしいです。例えば、site_rubyが/usr/local/lib/ruby/site_rubyならprefixが何であれ、ruby setup.rb install -destidr=/var/tmp/hoge-rootで/var/tmp/hoge-root/usr/local/lib/ruby/site_rubyにインストールされる。

一方、野良ビルドする立場からすれば、$HOME/localに入れておいて$:.unshiftして使いたい場合も想像できます。するとprefixで全部変えられた方がうれしいかも。

むむーん。風邪ひきの青木さんを更に混乱にまきこむようなツッコミですみません。もう少し考えてみます。]

青木 [DESTDIR 相当は ruby setup.rb install --prefix=DIR
があります。

ruby setup.rb config --prefix=$HOME とするのは
ありそうですが、その場合は site_ruby の値をその
まま使っても嬉しくないので、合わせる意味がないと
思います。どっちにしろ --rbdir は指定してもらわ
ないと。]


2005-05-03

アイデアのみ

吉里吉里 + KAG をプレゼンに使うってのはどうよ。 (00:13)


2005-05-04

TMail / decoded_body

寝こんでるはずなのに日記だけは書き込まれるわけです。謎です。

すでに数日前のことだけど、 TMail::Mail#decoded_body というメソッドを追加した。 名前の通り、Content-Transfer-Encoding をデコードし、 文字列のエンコーディングを合わせた本体を返すメソッド。 いままでこの程度の機能すらもなくてよく使ってたな俺。 さすがバージョン 1.0 未満だ。 (22:12)


2005-05-05

kernel.org は DL585

http://kerneltrap.org/node/5070

Proliant DL585って hp のフラッグシップ Opteron サーバ? いいなあ。ていうか、Intel じゃなくていいんだな (いろいろと)。 それにしても

> 4-way dual-core Opterons, with 24 gigabytes of RAM and
> 10 terabytes of disk space using a pair of MSA-30 arrays
> for each server.

このスペックはうらやましすぎる……。 (02:37)


2005-05-06

コンビニの袋の値段

http://mez.seesaa.net/article/3449106.html

袋節約しろーてのはわりとよく言われる。 特に一番大きいサイズのやつ (25 号だったかな?) はかなり高いらしく 滅多なものに使ってはいけないことになっている。

ちなみに通常装備されていると思われる コンビニの袋は 6 号・8 号・12 号・20 号の 4 種類 + 弁当袋。 少なくとも俺のいたイレブンとファミマはこのラインナップだった。 6 号は 500ml 紙パックがギリギリ二つ、 8 号は 1000ml 紙パックがギリギリ二つ、 12 号は 2000ml ペットボトルがギリギリ二つ、 20 号は箱ティッシュが二つ以上の大きさである (これは本当にギリギリのサイズなので、実際に入れると持ちにくいから気をつけよう)。 弁当袋にも昔は種類があったけど今いるファミマは一つになってる。

あと、用度品で結構高いのが プラスチックのフォークとスプーン (弁当用のでかいやつ)、 それと揚げ物につくケチャップやソースである。 確か前者が一本 2.3 円くらい、後者が 5 円くらいだったかなあ。 ケチャップはもうちょい高かったかも。 ヨーグルトなんかにつく小さいプラスプーンは たしか割り箸と同じで 1 円強だと思った。

ついでに言えば、用度品は各店が買うものなので、 本部から来るスーパーバイザ (SV) は用度品の節約には興味がない。 つーかむしろたくさん使ってくれたほうが嬉しい。 それゆえ SV の言うことを聞いて気前よく袋をあげてしまうと店長に怒られるから気をつけよう。

また、以前コンビニが一斉に弁当から箸をとったことがあったが、 あれもそのへんの構造がからんでいる。 弁当についてると箸のコストは弁当に含まれるのだが、 別付けになると明示的に店が買わないといけないのである。 つまり、本部にとっては箸を別付けにするだけで自分たちの売り上げが増えるというわけだ。 もちろん表向きの理由は「環境への配慮」ということになっているのだが、 実はコスい「売り上げアップ大作戦」なのである。 (05:48)

大学生の料理

http://daigakuseinoryouri.fc2web.com/cook.html

料理にもうちょっとバリエーションが欲しいので勉強しよう。

……というか、これはなんだ。

> ねぎと生姜とニンニクを日頃のストレスを解消するかの
> ように包丁で叩き刻む(奇声をあげながら)

(06:08)

「古い64ビットマシンをフリーソフトウェアで復活させよう」

http://www.itmedia.co.jp/enterprise/articles/0505/03/news004.html

悪かったね古くて。でも内容は基本的に気にいった。

かねがね思っていたのだが、Linux のインストールが趣味になっちゃってるような人は、 今度は Linux という足場を基盤にして異種アーキテクチャを征覇していくのはどうだろうか。 単なるインストール厨でも、i386 しか使えねー自作厨もどきに比べれば、 Alpha と SPARC と POWER にインストールしたことが ありますってほうがずっと自慢できるだろ。

もっとも、「親切なインストーラがなきゃヤダー」だの 「GNOME 動かなきゃヤダー」だのたわけたことを言うやつはやめとけ。 最低でもシリアルコンソールと vi だけで OS 全て設定できるようになっておくのが好ましい。 「そんなのはインストールしながら覚えてやるぜ」でも当然 OK。 (07:21)


2005-05-09

Windows と X

あー、やっと体温下がった。

それはともあれ、Windows と X の重大な違いにいまさら気付いたんですが、 X はマウスカーソルが黒かったんですね。

(09:03)

合宿

合宿って Rails 合宿のことだったのか……。

(09:09)

予定詰まりすぎ

結局今回のるびまは何もできんかった…… というかゴールデンウィークは寝てるだけで終わった。

そして今週も土曜まで暇がまったくなさげ

(09:10)


2005-05-12

samidare こけた (1)

内々に使っている samidare がこんなダイイングメッセージを 残して死ぬようになってしまった。

/var/samidare/htree/htree/loc.rb:258:in `loc_list': stack level too deep (SystemStackError)
        from /var/samidare/htree/htree/loc.rb:272:in `path'
        from /var/samidare/samidare/main.rb:367:in `ignore_tree'
        from /var/samidare/samidare/main.rb:366:in `filter'
        from /var/samidare/htree/htree/traverse.rb:261:in `each_with_index'
        from /var/samidare/htree/htree/traverse.rb:36:in `each'
        from /var/samidare/htree/htree/traverse.rb:36:in `each_with_index'
        from /var/samidare/htree/htree/traverse.rb:36:in `each_child_with_index'
        from /var/samidare/htree/htree/traverse.rb:261:in `filter'
... 2949 levels...
        from /var/samidare/samidare/main.rb:1282:in `main'
        from /var/samidare/samidare/main.rb:1400
        from /var/samidare/update.rb:10:in `load'
        from /var/samidare/update.rb:10

super しているその super 先が同じメソッドになってしまっているため、 無限ループになるらしい (追記:これは嘘だった)

とりあえず samidare と htree を HEAD にしてみよう。

digital:/var/samidare % ruby update.rb --single-thread
/var/samidare/wc/htree/htree/loc.rb:258:in `loc_list': stack level too deep (SystemStackError)
        from /var/samidare/wc/htree/htree/loc.rb:272:in `path'
        from /var/samidare/wc/samidare/main.rb:373:in `ignore_tree'
        from /var/samidare/wc/samidare/main.rb:372:in `filter'
        from /var/samidare/wc/htree/htree/traverse.rb:261:in `each_with_index'
        from /var/samidare/wc/htree/htree/traverse.rb:36:in `each'
        from /var/samidare/wc/htree/htree/traverse.rb:36:in `each_with_index'
        from /var/samidare/wc/htree/htree/traverse.rb:36:in `each_child_with_index'
        from /var/samidare/wc/htree/htree/traverse.rb:261:in `filter'
... 2949 levels...
        from /var/samidare/wc/samidare/main.rb:1291:in `main'
        from /var/samidare/wc/samidare/main.rb:1409
        from update.rb:10:in `load'
        from update.rb:10

変わらなかった。 引き続き調査中。

(23:15)

samidare こけた (2)

原因判明。HTML がこんなだった。

<FONT size="-1" color="#000000"><FONT size="-2"></FONT><FONT
size="-1"><BR><FONT color="#000000"><FONT size="-1"><FONT c
olor="#000000"><FONT size="-1"><FONT color="#000000"><FONT s
ize="-1"><FONT color="#999999" size="+2"><FONT size="+1"><FO
NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1"
color="#000000"><FONT color="#999999" size="+2"><FONT size=
"+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s
ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO
NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1"
><FONT size="-1" color="#000000"><FONT color="#999999" size=
"+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s
ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999
9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2"
><FONT size="+1"><FONT size="-1" color="#000000"><FONT color
="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s
ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO
NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0
00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000
000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c
olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col
or="#000000"><FONT color="#999999" size="+2"><FONT size="+1"
><FONT color="#000000" size="+2"><FONT size="+1"><FONT size=
"-1" color="#000000"><FONT color="#999999" size="+2"><FONT s
ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO
NT size="-1" color="#000000"><FONT color="#999999" size="+2"
><FONT size="+1"><FONT color="#000000" size="+2"><FONT size=
"+1"><FONT size="-1" color="#000000"><FONT color="#999999" s
ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO
NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9
99999" size="+2"><FONT size="+1"><FONT color="#000000" size=
"+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c
olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000
0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"
><FONT color="#999999" size="+2"><FONT size="+1"><FONT color
="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="
#000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO
NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1"
color="#000000"><FONT color="#999999" size="+2"><FONT size=
"+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s
ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO
NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1"
><FONT size="-1" color="#000000"><FONT color="#999999" size=
"+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s
ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999
9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2"
><FONT size="+1"><FONT size="-1" color="#000000"><FONT color
="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s
ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO
NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0
00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000
000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c
olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col
or="#000000"><FONT color="#999999" size="+2"><FONT size="+1"
><FONT color="#000000" size="+2"><FONT size="+1"><FONT size=
"-1" color="#000000"><FONT color="#999999" size="+2"><FONT s
ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO
NT size="-1" color="#000000"><FONT color="#999999" size="+2"
><FONT size="+1"><FONT color="#000000" size="+2"><FONT size=
"+1"><FONT size="-1" color="#000000"><FONT color="#999999" s
ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO
NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9
99999" size="+2"><FONT size="+1"><FONT color="#000000" size=
"+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c
olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000
0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"
><FONT color="#999999" size="+2"><FONT size="+1"><FONT color
="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="
#000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO
NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1"
color="#000000"><FONT color="#999999" size="+2"><FONT size=
"+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s
ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO
NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1"
><FONT size="-1" color="#000000"><FONT color="#999999" size=
"+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s
ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999
9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2"
><FONT size="+1"><FONT size="-1" color="#000000"><FONT color
="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s
ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO
NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0
00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000
000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c
olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col
or="#000000"><FONT color="#999999" size="+2"><FONT size="+1"
><FONT color="#000000" size="+2"><FONT size="+1"><FONT size=
"-1" color="#000000"><FONT color="#999999" size="+2"><FONT s
ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO
NT size="-1" color="#000000"><FONT color="#999999" size="+2"
><FONT size="+1"><FONT color="#000000" size="+2"><FONT size=
"+1"><FONT size="-1" color="#000000"><FONT color="#999999" s
ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO
NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9
99999" size="+2"><FONT size="+1"><FONT color="#000000" size=
"+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c
olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000
0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"
><FONT color="#999999" size="+2"><FONT size="+1"><FONT color
="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="
#000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO
NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1"
color="#000000"><FONT color="#999999" size="+2"><FONT size=
"+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s
ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO
NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1"
><FONT size="-1" color="#000000"><FONT color="#999999" size=
"+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s
ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999
9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2"
><FONT size="+1"><FONT size="-1" color="#000000"><FONT color
="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s
ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO
NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0
00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000
000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c
olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col
or="#000000"><FONT color="#999999" size="+2"><FONT size="+1"
><FONT color="#000000" size="+2"><FONT size="+1"><FONT size=
"-1" color="#000000"><FONT color="#999999" size="+2"><FONT s
ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO
NT size="-1" color="#000000"><FONT color="#999999" size="+2"
><FONT size="+1"><FONT color="#000000" size="+2"><FONT size=
"+1"><FONT size="-1" color="#000000"><FONT color="#999999" s
ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO
NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9
99999" size="+2"><FONT size="+1"><FONT color="#000000" size=
"+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c
olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000
0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"
><FONT color="#999999" size="+2"><FONT size="+1"><FONT color
="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="
#000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO
NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1"
color="#000000"><FONT color="#999999" size="+2"><FONT size=
"+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s
ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO
NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1"
><FONT size="-1" color="#000000"><FONT color="#999999" size=
"+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s
ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999
9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2"
><FONT size="+1"><FONT size="-1" color="#000000"><FONT color
="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s
ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO
NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0
00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000
000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c
olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col
or="#000000"><FONT color="#999999" size="+2"><FONT size="+1"
><FONT color="#000000" size="+2"><FONT size="+1"><FONT size=
"-1" color="#000000"><FONT color="#999999" size="+2"><FONT s
ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO
NT size="-1" color="#000000"><FONT color="#999999" size="+2"
><FONT size="+1"><FONT color="#000000" size="+2"><FONT size=
"+1"><FONT size="-1" color="#000000"><FONT color="#999999" s
ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO
NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9
99999" size="+2"><FONT size="+1"><FONT color="#000000" size=
"+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c
olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000
0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"
><FONT color="#999999" size="+2"><FONT size="+1"><FONT color
="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="
#000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO
NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1"
color="#000000"><FONT color="#999999" size="+2"><FONT size=
"+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s
ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO
NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1"
><FONT size="-1" color="#000000"><FONT color="#999999" size=
"+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s
ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999
9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2"
><FONT size="+1"><FONT size="-1" color="#000000"><FONT color
="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s
ize="+2"><FONT size="+1"><FONT size="-1" color="#000000"><FO
NT color="#999999" size="+2"><FONT size="+1"><FONT color="#0
00000" size="+2"><FONT size="+1"><FONT size="-1" color="#000
000"><FONT color="#999999" size="+2"><FONT size="+1"><FONT c
olor="#000000" size="+2"><FONT size="+1"><FONT size="-1" col
or="#000000"><FONT color="#999999" size="+2"><FONT size="+1"
><FONT color="#000000" size="+2"><FONT size="+1"><FONT size=
"-1" color="#000000"><FONT color="#999999" size="+2"><FONT s
ize="+1"><FONT color="#000000" size="+2"><FONT size="+1"><FO
NT size="-1" color="#000000"><FONT color="#999999" size="+2"
><FONT size="+1"><FONT color="#000000" size="+2"><FONT size=
"+1"><FONT size="-1" color="#000000"><FONT color="#999999" s
ize="+2"><FONT size="+1"><FONT color="#000000" size="+2"><FO
NT size="+1"><FONT size="-1" color="#000000"><FONT color="#9
99999" size="+2"><FONT size="+1"><FONT color="#000000" size=
"+2"><FONT size="+1"><FONT size="-1" color="#000000"><FONT c
olor="#999999" size="+2"><FONT size="+1"><FONT color="#00000
0" size="+2"><FONT size="+1"><FONT size="-1" color="#000000"
><FONT color="#999999" size="+2"><FONT size="+1"><FONT color
="#000000" size="+2"><FONT size="+1"><FONT size="-1" color="
#000000"><FONT color="#999999" size="+2"><FONT size="+1"><FO
NT color="#000000" size="+2"><FONT size="+1"><FONT size="-1"
color="#000000"><FONT color="#999999" size="+2"><FONT size=
"+1"><FONT color="#000000" size="+2"><FONT size="+1"><FONT s
ize="-1" color="#000000"><FONT color="#999999" size="+2"><FO
NT size="+1"><FONT color="#000000" size="+2"><FONT size="+1"
><FONT size="-1" color="#000000"><FONT color="#999999" size=
"+2"><FONT size="+1"><FONT color="#000000" size="+2"><FONT s
ize="+1"><FONT size="-1" color="#000000"><FONT color="#99999
9" size="+2"><FONT size="+1"><FONT color="#000000" size="+2"
><FONT size="+1"><FONT size="-1" color="#000000"><FONT color
="#999999" size="+2"><FONT size="+1"><FONT color="#000000" s
ize="+2"><FONT size="+1">(05/05/10)<BR></FONT></FONT></FONT>
</FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO
NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><
/FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON
T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></
FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT
></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F
ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>
</FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO
NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><
/FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON
T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></
FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT
></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F
ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>
</FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO
NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><
/FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON
T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></
FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT
></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F
ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>
</FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO
NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><
/FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON
T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></
FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT
></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F
ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>
</FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO
NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><
/FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON
T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></
FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT
></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F
ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>
</FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO
NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><
/FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON
T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></
FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT
></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F
ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>
</FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO
NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><
/FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON
T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></
FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT
></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F
ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>
</FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FO
NT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><
/FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FON
T></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></
FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT
></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></F
ONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT>
</FONT></FONT>

なにこの幾何学模様。

というわけで最後に一つだけ、 問題の HTML から一部を引用してこの話を終わることにしたい。

<META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 7.0.0.0 for Windows">

(00:24)

本日のツッコミ (全1件) [ツッコミを入れる]

i [VS.NETでもWEBデザイン画面で頻繁にラベルやテーブルをいじくってたらこうなります(w]


2005-05-14

setup.rb config --siteruby (2)

考えてみると --libruby の一族も値は不変であるべきのような気がする。 ruby にパスが埋め込まれてるってのもあるけど、 こいつらはオプションとして指定するためにあるわけじゃなくて、 値として使うためにあるからだ。

※ こういうことね。

$ ruby setup.rb config --rbdir=\$librubyver --sodir=\$librubyverarch

だからやっぱり --libruby* の値も不変にすべきだろう。

あと、--installdirs=std/site というのがあると いいんじゃねーかと提案されたので、これも実装しておこう。 ついでに home ってのがあってよさそうだなあ。

……いや、甘かった。この仕様だと stow が使えない。 やっぱりパラメタライズしないとだめだ。

setup.rb config --siteruby (3)

目先を変えて典型的なパターンを考えてみる。

  • パターン 1: プラットフォームのポリシーに従い site_ruby にインストール

この場合、パラメタライズしてあろーがなかろーがどうでもいい。 現状の setup.rb で問題なし。

  • パターン 2: プラットフォームのポリシーに従い libruby にインストール

プログラムのインストーラをそのまま活用するシステムでありうる。 この場合も現状の setup.rb で問題なし。

  • パターン 3: ポリシは全部無視して $HOME 以下にインストール

ちょっと面倒。--prefix=$HOME --rbdir=$HOME/lib/ruby --sodir=$HOME/lib/ruby のように三つ指定する必要がある。--installdirs=home を用意すれば一つになるか。 しかし ~/lib/ruby を固定にしてしまってよいのか、少し疑問。

  • パターン 4: プラットフォームのポリシーに従いローカルインストール (ruby はベンダインストールなので別の場所にある)

これが一番の問題か。 例えば ruby が /usr にあるけど /usr/local に入れたいという場合。 /usr/local という値は rbconfig からは取れないので、 適切な値を自動設定するには全てのプラットフォーム向けの値を用意しておくしかない。 この場合は --prefix=/usr/local --rbdir=\$siterubyver --sodir=\$siterubyverarch かな? --installdirs が用意されれば --prefix=/usr/local --installdirs=site で、多少は簡潔になりそうだな。

また、今回の変更もこのパターンでの便を考えてのことだ。

うーん、usrlocal, usrlocalxxx, opt くらいの 代表的なモデルは用意してもいいかもしれないなあ。 なんか自分から棺桶に片足つっこんでる気がするけど。

  • パターン 5: stow

この場合はまた別の問題として、 prefix その他をインストール時だけすりかえる手段が必要になる。 --override=prefix,/usr/pkg/tmail みたいなオプションを用意するか。

Makefile の場合は環境変数で上書きできるんだよね。 環境変数も見ようかなあ。でもなあ。 make の場合は環境変数を見るのはわかりやすいけど (イメージ的に sh と近いからかな)、 /bin/sh 独立なイメージのある setup.rb で環境変数を見るのはあまり直感的でない。 やはり --override 形式にしよう。

(12:48)

ruby 1.8.3 preview 1 / Tru64UNIX 5.1B

tunami:~/src/ruby-1.8.3 % uname -srm
OSF1 V5.1 alpha
 
tunami:~/src/ruby-1.8.3 % /usr/local/pkg/ruby-1.8.3p1/bin/ruby --version
ruby 1.8.3 (2005-05-12) [alphaev6-osf5.1b]
 
tunami:~/src/ruby-1.8.3 % gcc --version
gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
tunami:~/src/ruby-1.8.3 % /usr/local/pkg/ruby-1.8.3p1/bin/ruby test/runner.rb
Loaded suite test
Started
................................. 略
Finished in 175.576072 seconds.
 
  1) Error:
test_wsdl(XSD::TestEmptyCharset):
Iconv::InvalidEncoding: invalid encoding ("euc-jp", "utf-8")
(eval):6:in `iconv'
(eval):6:in `encode'
/usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/rexml/source.rb:41:in `encoding='
/usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/rexml/parsers/baseparser.rb:202:in `pull'
/usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/rexml/parsers/streamparser.rb:16:in `parse'
/usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/rexml/document.rb:171:in `parse_stream'
/usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/xsd/xmlparser/rexmlparser.rb:27:in `do_parse'
/usr/local/pkg/ruby-1.8.3p1/lib/ruby/1.8/wsdl/xmlSchema/parser.rb:60:in `parse'
./test/xsd/test_noencoding.rb:15:in `test_wsdl'
 
1102 tests, 11438 assertions, 0 failures, 1 errors

(17:48)

Hyper Threading considered harmful

http://www.daemonology.net/hyperthreading-considered-harmful/

なんか詳細が気になってしまったので、 このページにあった論文 Colin Percival "Cache Missing For Fun And Profit", 2005 を簡単にまとめてみた。

Abstract

複数スレッドがキャッシュを共有しているために、 悪意のあるスレッドが同一プロセッサ上におけるスレッドの活動を監視できる。

1. Introduction

HT ができた背景とか書いてるだけなので略

2. Covert Communication via Paging

ページングを利用した covert channel の構築について。 covert channel とは、通常は通信に使うとは考えられないものを使った通信経路のこと。 ちょっと前に話題になった IP over DNS みたいなやつのことだな。 この節ではページアクセスにかかる時間の差を使った covert channel の構築方法が説明されている。 例えば、特定のページがページアウトされているかいないかで 1 ビットが伝達可能になる。

3. L1 Cache Missing

HT Pentium 4 の L1 キャッシュを使った covert channel の構築方法。

  1. スパイプロセスがキャッシュを埋めておく。
  2. 特権プロセスが規則的にメモリにアクセスする。 アクセスしたところだけがキャッシュされる。
  3. スパイプロセスも規則的にメモリにアクセスし、 アクセスにかかる時間を計測して L1 キャッシュにヒットしたかどうか判定する。 遅くなったところで特権プロセスがメモリアクセスしているはず。 (このへんの関係がよくわからないな。キャッシュの埋まりかたに規則性がある?)

この方法と適切なエラー訂正機能を組み合わせた場合の 通信速度はおよそ 400KB/秒 である。

4. L2 Cache Missing

HT Pentium 4 の L2 キャッシュを使った covert channel の構築方法。 基本的には L1 キャッシュの場合と同じ。 アドレス変換キャッシュがからんでくるので、 適当にレイテンシを追加する必要があるらしい。

5. OpenSSL Key Theft

L1 cache covert channel を使って OpenSSL から秘密鍵を奪取する方法。 openssl rsautl -inkey priv.key -sign を動かしておき、 これに L1 cache spy をしかける (両方が同じ CPU で走るように工夫する)。

OpenSSL は Chinese Remainder Theorem と sliding window を使っているので かなり規則的にメモリにアクセスする。 スパイプロセスは L1 cache を監視することでこれを検出できる (具体的には 512 ビットの指数のうち 200 ビット程度を奪取できる)。

が、これ単独では RSA 鍵は再現できない。 最低でも指数の下位 256 ビットが必要である。 しかしこの不足分は計算開始時に決定されるテーブルの "footprint" を解析すれば補うことができる (このあたりの仕組みはさっぱりわからず)。 これは簡単ではないが、 OpenSSL の特定バージョンであることがわかっていれば 50% の確率で判明する。 結果として 110 ビットの指数が追加でき、 最終的には指数 512 ビットのうち 310 ビットが奪取できる。 これは RSA 鍵を解くには十分な値である。

6. Solutions and Workarounds

CPU で取れる対策

  • HT をオフにする。嬉しくないが簡単。
  • スレッドごとにキャッシュを分ける。めんどい。
  • キャッシュの追い出しアルゴリズムでスレッドのパラメータに配慮する。 パフォーマンスに悪影響するかも?

OS で取れる対策

  • HT をオフにする。嬉しくないが簡単。
  • クレデンシャルの違うスレッドは同時には動かさない。 setuid(2) みたいなシステムコールがからむと難しい?

アプリケーションで取れる対策

  • 重要なデータには規則的にアクセスしないようにする。 コードがすごく変わるので難しそう。

その他

  • アプリケーションからクロックカウンタへのアクセスを禁止する。 例えば Pentium なら RDTSC を発行禁止にする。
  • それはあんまりだってことなら、せめて発行頻度を制限する。

7. Recommendations

CPU

  • SMT ではキャッシュ追い出しアルゴリズムでスレッドを意識すべき。
  • マルチコアの場合、コア間でキャッシュを共有すべきではない。
  • x86 については、covert channel がふさがっているかどうか 判定する feature flag を用意すべき。

OS

  • 本稿で述べた covert channel が確認されるシステム上では、 違う権限のスレッドを一つの CPU で動かさないようにする。
  • めんどうなら、スレッドを一つしか動かさない (事実上の HT オフ)。

暗号ライブラリ

  • データや鍵に依存するメモリアクセスを行わないようにする。

感想

セキュリティってめんどくせー。

「キャッシュを共有してるから」云々てのを聞いて 最初はもろにキャッシュの中身が見えるのかと思ったけど、 さすがにそこまでアホな実装をするはずがなかった。 コードの傾向もわかってないといけないみたいなので、 コード一発で任意のプロセスを覗けるってわけじゃないんだね。 思っていたよりはずっと限定的な穴だった。

なんにしても local exploit だし、 信用できないユーザのいないマシンでは関係ないと。

細かいところはこんど笹田さんに聞こう。

(20:57)

本日のツッコミ (全4件) [ツッコミを入れる]

なかだ [--rb-dir=\$site-ruby-common も簡単にできるとちょっと嬉しいんですが。]

Oni [ほんと、「めんどくせーーー!」って感じですね。「そりゃあ、そうやれば可能なんだろうけど・・・」うーむ。]

kjana [local exploit に別の remote exploit での一般ユーザ奪取を組み合わされて、どこかが陥落してたのはいつのことだったか、っていう話があったり無かったり。]

青木 [> --rb-dir
そこまではちょっと……。
ちなみに最近はハイフンを取るようにしてるので
--rbdir=\$siteruby までは短縮できますが、
それはちょっと話が違いすぎる予感。]


2005-05-18

Alpha: The History in Facts and Comments

http://www.alasir.com/alpha/alpha_history.html

NetBSD/Alpha port ML より。

(17:25)


2005-05-20

FileUtils.rm_rf

さて、いいかげん rm_rf 問題をどうにかしよう。

(16:03)

fileutils.rb / lchmod, lchown

どうやって lchmod(2) があるか確かめたらいいんだよー! NotImplementedError 出すくらいならメソッドを定義しないでくれ!

うむむ、test_fileutils.rb みたいにテンポラリファイルを作って確かめるかなあ。 tmpdir が確実に見付かるなら何も問題はないが、 検出できない場合はどうすれば……。 見付かっても、エントリが残っちゃう可能性があるなあ。激しく嫌だ。

わかった。一般に検出しようとするからだめなんだ。 どうせ実際に必要になった時点で検出するんだから、 最初の一つで試せばいい。

(18:55)


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件) [ツッコミを入れる]

(う) [errno-*.txt、どっちも404ですだ。]

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


2005-05-25

rm -rf が効かない!?

fileutils.rb のテストをしてたら変なことが起こった。

/tmp % ruby -e 'Dir.mkdir"a"; 20000.times{|i| open("a/#{i}","w"){}; open("a/passwd","w"){} }'
/tmp % rm -rf a || ls a | wc -l
rm: cannot remove directory `a': Directory not empty
   9926
/tmp % rm -rf a || ls a | wc -l
rm: cannot remove directory `a': Directory not empty
   4817
/tmp % rm -rf a || ls a | wc -l
rm: cannot remove directory `a': Directory not empty
   2334
/tmp % rm -rf a || ls a | wc -l
rm: cannot remove directory `a': Directory not empty
   1022
/tmp % rm -rf a || ls a | wc -l
rm: cannot remove directory `a': Directory not empty
    436
/tmp % rm -rf a || ls a | wc -l
rm: cannot remove directory `a': Directory not empty
    144
/tmp % rm -rf a || ls a | wc -l

エントリが半分ずつしか減らない。いったいどうなってるんだ。

ちなみに /tmp 以外だと何も問題はない。

~/tmp % ruby -e 'Dir.mkdir"a"; 20000.times{|i| open("a/#{i}","w"){}; open("a/passwd","w"){} }'
~/tmp % rm -rf
~/tmp % ls a
ls: a: No such file or directory

これはもしかして tmpfs のバグか?

/tmp % uname -srm
Linux 2.4.22 i686
/tmp % mount | grep tmp
none on /tmp type tmpfs (rw,mode=1777,size=64m)

報告されてた。これだな。

新しいバージョンでは修正されてんのかな。

/d/src/linux-2.4.30 % grep tmpfs ChangeLog-2.4.*
ChangeLog-2.4.23:  o tmpfs 1/5 LTP ENAMETOOLONG
ChangeLog-2.4.23:  o tmpfs 2/5 LTP S_ISGID dir
ChangeLog-2.4.23:  o tmpfs 3/5 swapoff/truncate race
ChangeLog-2.4.23:  o tmpfs 4/5 getpage/truncate race
ChangeLog-2.4.23:  o tmpfs 5/5 writepage/truncate race
ChangeLog-2.4.25:  o tmpfs readdir does not update dir atime
ChangeLog-2.4.25:  o Fix tmpfs dcache oops
ChangeLog-2.4.27:  o tmpfs surplus page miscounted
ChangeLog-2.4.28:  o tmpfs: stop negative dentries
ChangeLog-2.4.28:  o tmpfs: fix shmem_file_write return value

いっぱいあった。2.4.28 以降なら大丈夫そう?

(19:27)

FileUtils.rm_rf (8)

次のような攻撃ができる可能性はあるんだろうか。 両プロセスのカレントディレクトリは /tmp で、 /tmp のパーミッションは 1777 とする。

rm -rf プロセス(euid=0)  クラックプロセス(euid=1000)
---------------------------------------------------------------------
                         (プログラム cmd を作り chmod(01777, "cmd"))
                         chmod(01777, "cmd")
                         mkdir("a")
readdir("/tmp")
unlink("a") = EISDIR
                         rmdir("a")
                         rename("cmd", "a")
lchown(0, "a")
                         execl("./a")        # setuid root で動作?
lchmod(0700, "a")

Linux 2.4 では lchown(2) で suid bit がクリアされたけど、 SUSv3 によると実装依存らしい。

If the specified file is a regular file, one or more of the S_IXUSR,
S_IXGRP, or S_IXOTH bits of the file mode are set, and the process has
appropriate privileges, it is implementation-defined whether the
set-user-ID and set-group-ID bits are altered.

……だりい……。 家にあるシステムを片端から実行してみて問題なければ OKってことにしちゃおうかなあ……。

アプリケーションを特定できればなんとかなるはずなんだよなあ。 万能のメソッドを一個だけ作ろうとするから無理なわけで……。

結論は fork, setuid, chdir ってことで。冗談です。

うーん、open したディレクトリに対して chown とか chmod できればいいのかなあ。 それなら普通に stat が使えるし。

え、いや違うか、 open する対象がすりかえられたら回避できない?! そうか、だから lchown が必要なんだっけ。 なんだ、それじゃ lchown が suid bit をクリアしないシステムでは どうやってもセキュアにはならないんだな。 それならクリアされるほうに賭けたほうが得だ。

非破壊検査 / シンボリックリンク

テンポラリファイルを使わずに調べよう、 シンボリックリンク編

/tmp % cat /d/tmp/have-symlink-p.rb
def have_symlink?
  File.symlink nil, nil
rescue NotImplementedError
  return false
rescue
  return true
end
 
p have_symlink?
 
/tmp % test-all-ruby /d/tmp/have-symlink-p.rb
ruby 1.4.6 (2000-08-16) [i686-linux]
/d/tmp/have-symlink-p.rb:3: parse error
rescue NotImplementedError
^
/d/tmp/have-symlink-p.rb:3: warning: useless use of a constant in void context
/d/tmp/have-symlink-p.rb:5: parse error
ruby 1.6.0 (2000-09-19) [i686-linux]
true
ruby 1.6.1 (2000-09-27) [i686-linux]
true
ruby 1.6.2 (2000-12-25) [i686-linux]
true
ruby 1.6.3 (2001-03-19) [i686-linux]
true
ruby 1.6.4 (2001-06-04) [i686-linux]
true
ruby 1.6.5 (2001-09-19) [i686-linux]
true
ruby 1.6.6 (2001-12-26) [i686-linux]
true
ruby 1.6.7 (2002-03-01) [i686-linux]
true
ruby 1.6.8 (2002-12-24) [i686-linux]
true
ruby 1.8.0 (2003-08-04) [i686-linux]
true
ruby 1.8.1 (2003-12-25) [i686-linux]
true
ruby 1.9.0 (2005-05-16) [i686-linux]
true

Windows での状況

~/src/ruby % ruby-vc6 -v have-symlink-p.rb
ruby 1.9.0 (2005-03-28) [i386-mswin32]
false
~/src/ruby % ruby-cygwin -v have-symlink-p.rb
ruby 1.9.0 (2005-03-28) [i386-cygwin]
true

ハードリンクも同じようにすれば調べられる。

しかし、なんか妙な知識ばっかり蓄積されてくなあ。

(02:20)


2005-05-26

ペド数学概論

http://homepage2.nifty.com/norp/kijo/list_norp/04rori_math.html

おもしろすぎ

(06:05)

脆弱性

vulnerability って綴りが難しくね?

(06:36)

stat(1)

ごめんなさいっ……! ごめんなさいっ……! stat(1) コマンドの存在をいまの今まで知りませんでした……っ!

うわー原稿直さなきゃ

(07:49)

落ち

もう

だめ

限界

寝る

(08:38)

Pacifica

AMD64 Virtualization Codenamed "Pacifica" Technology
Secure Virtual Machine Architecture Reference Manual
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/33047.pdf

Hammer-Info より

(08:52)

errno の差 (2)

さらにプラットフォーム追加

結論は変わらず。6 プラットフォームすべてに共通な errno は 72 で、 なんとなく Windows にはなさそうな印象のある EPERM や ELOOP, ECHILD などもすべて定義されている。

ちなみに最も定義数が多いのは (やっぱりというか何というか) Linux で、まったく欠けがない。

(20:42)

FileUtils.rm_rf (9)

うー、そうかあ、lchmod が set-user-id を落とさなければ昇格が起こり、 落とすと既存のプログラムを落としちゃうかもしれないわけか……。 こりゃ手詰まりだ。

あとは ruby-talk に出てた mkdir して rename するやつくらいか。 すると今度は親ディレクトリのパーミッションがからんでくるなあ。 なんかもう……。

(00:42)

今日はこれまで〜

明日は早いからもう寝る。

あー、ruby-dev summary もやんないとなあ。 二週あけるのもよくないので、今週はスキップせずに出します。

(01:24)


2005-05-28

SEGVな日々

朝っぱらから SEGV だし……。 えーと、

C = Struct.new(:a,:b,:c,:d, :e,:f,:g,:h, :i,:j,:k,:l)
c = C.new(0,0,0,0, 0,0,0,0, 0,0,0,0)
c.k

これで死亡か。やだなあ。

バックトーレス

(gdb) bt
#0  0x00000000 in ?? ()
#1  0x0805f4e9 in rb_call0 (klass=1075345696, recv=1075355776, id=10497,
oid=2, argc=0, argv=0x0, body=0x400092c4, nosuper=-1073745676)
at ../../src/ruby/eval.c:5549
#2  0x0806014e in rb_call (klass=1075505016, recv=1075503856, mid=10497,
argc=0, argv=0x0, scope=0) at ../../src/ruby/eval.c:5911
#3  0x0805b78e in rb_eval (self=1075571216, n=0x0)
at ../../src/ruby/ruby.h:641
#4  0x08069b05 in ruby_exec_internal () at ../../src/ruby/eval.c:1528
#5  0x08069b26 in ruby_exec () at ../../src/ruby/eval.c:1549
#6  0x08069d30 in ruby_run () at ../../src/ruby/eval.c:1566
#7  0x08053c98 in main () at ../../src/ruby/main.c:38
#8  0x400874ad in __libc_start_main () from /lib/libc.so.6

……なんか変な感じ

(gdb) f 1
#1  0x0805f4e9 in rb_call0 (klass=1075345696, recv=1075355776, id=10497,
oid=2, argc=0, argv=0x0, body=0x400092c4, nosuper=-1073745676)
at ../../src/ruby/eval.c:5549
5549          case 0:
(gdb) list
5544            return (*func)(recv, rb_ary_new4(argc, argv));
5545            break;
5546          case -1:
5547            return (*func)(argc, argv, recv);
5548            break;
5549          case 0:
5550            return (*func)(recv);
5551            break;
5552          case 1:
5553            return (*func)(recv, argv[0]);
(gdb) p func
No symbol "func" in current context.

は? しかもこれは call_cfunc() の中に見えるんですが。

あー……そうか、static inline なのね。 しかも gcc 3.4 を入れていたような気がする。 そういうことか。めんどくさいので gcc を 2.95 に戻して回避だ!

/d/rsrc/Ci-delta6 % ruby t                                 aamine@harmony
t:3: [BUG] Segmentation fault
ruby 1.9.0 (2005-05-26) [i686-linux]
 
zsh: 19877 abort (core dumped)  ruby t

な お ら な い

ちょっと待ってよー、なんなんだよこれ。 inline 取ってもなおらないどころか -O0 にしても起こるし。 コンパイラじゃないのか。

GC を止めても起きる。ますます嫌だ。

/d/rsrc/Ci-delta6 % gdb /d/obj/ruby/ruby                   aamine@harmony
GNU gdb 5.2.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
(gdb) run t
Starting program: /d/obj/ruby/ruby t
 
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb) bt
#0  0x00000000 in ?? ()
#1  0x0805db79 in call_cfunc (func=0, recv=1075503856, len=0, argc=0,
argv=0x0) at ../../src/ruby/eval.c:5550
#2  0x0805e242 in rb_call0 (klass=1075505016, recv=1075503856, id=10497,
oid=10497, argc=0, argv=0x0, body=0x401ae390, nosuper=0)
at ../../src/ruby/eval.c:5689
#3  0x0805eaf9 in rb_call (klass=1075505016, recv=1075503856, mid=10497,
argc=0, argv=0x0, scope=0) at ../../src/ruby/eval.c:5911
#4  0x080594bf in rb_eval (self=1075571216, n=0x401ae804)
at ../../src/ruby/eval.c:3334
#5  0x0805553d in eval_node (self=1075571216, node=0x401ae804)
at ../../src/ruby/eval.c:1350
#6  0x08055aae in ruby_exec_internal () at ../../src/ruby/eval.c:1528
#7  0x08055b07 in ruby_exec () at ../../src/ruby/eval.c:1549
#8  0x08055b46 in ruby_run () at ../../src/ruby/eval.c:1566
#9  0x08053d36 in Letext () at ../../src/ruby/main.c:38
#10 0x400874ad in __libc_start_main () from /lib/libc.so.6
(gdb) f 1
#1  0x0805db79 in call_cfunc (func=0, recv=1075503856, len=0, argc=0,
argv=0x0) at ../../src/ruby/eval.c:5550
5550            return (*func)(recv);
(gdb) p func
$1 = (VALUE (*)()) 0

うお……。なんで func が NULL になってんだ

(gdb) p *body
$3 = {flags = 98847, nd_file = 0x813e2e1 "t", u1 = {node = 0x0, id = 0,
value = 0, cfunc = 0, tbl = 0x0}, u2 = {node = 0x0, id = 0,
argc = 0, value = 0}, u3 = {node = 0x0, id = 0, state = 0,
entry = 0x0, cnt = 0, value = 0}}

body がまっ白になってらっしゃいます。

うーん。Struct のほうから攻略してみよう。

これか―――――――っ!

--- struct.c    18 Apr 2005 06:38:30 -0000      1.63
+++ struct.c    27 May 2005 23:24:04 -0000
@@ -132,7 +132,7 @@
 static VALUE rb_struct_ref8(obj) VALUE obj; {return RSTRUCT(obj)->ptr[8];}
 static VALUE rb_struct_ref9(obj) VALUE obj; {return RSTRUCT(obj)->ptr[9];}
 
-static VALUE (*ref_func[10])() = {
+static VALUE (*ref_func[])() = {
     rb_struct_ref0,
     rb_struct_ref1,
     rb_struct_ref2,
@@ -211,7 +211,7 @@
     for (i=0; i< RARRAY(members)->len; i++) {
        ID id = SYM2ID(RARRAY(members)->ptr[i]);
        if (rb_is_local_id(id) || rb_is_const_id(id)) {
-           if (i<sizeof(ref_func)) {
+           if (i < sizeof(ref_func) / sizeof(VALUE (*)())) {
rb_define_method_id(nstr, id, ref_func[i], 0);
            }
            else {

(08:41)


2005-05-31

rm -rf

オペミスでサイトの日記ディレクトリを rm -rf しちまいました。 まあデータもプログラムも全部別の場所に 置いてあるんで実質的なダメージはゼロ。 リンクだけ張り直したらほぼ復旧できたようだ。

つーかなんでこんな時間に家にいるんだろうな俺。

(13:11)

でう゛さま

しまった ruby-dev summary がまったく考慮に入ってねえ! ……とりあえず今日帰ってきてからなんとかしよう。

(13:22)


<前月 | 最新 | 次月>
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