トップ 追記   RSS 1.0 FEED  

Journal InTime


2017-12-15 (Fri) [長年日記]

_ ファイルオープンの罠

僕が書いたNet::FTPのコードに脆弱性報告があり、修正版がリリースされた。関係者のみなさん、ありがとうございました。

問題があったのは以下のようなコードだった。

def getbinaryfile(remotefile, localfile = File.basename(remotefile),
                  blocksize = DEFAULT_BLOCKSIZE, &block) # :yield: data
  f = nil
  result = nil
  if localfile
    if @resume
      rest_offset = File.size?(localfile)
      f = open(localfile, "a")
    else
      rest_offset = nil
      f = open(localfile, "w")

ここでKernel#openを使っていたのが問題で、localfile|で始まる文字列だと外部コマンドが実行されてしまう。 しかも、まずいことにlocalfileのデフォルト値はFile.basename(remotefile)なので、悪意のあるFTP上に|で始まる名前のファイルがあって、ディレクトリ内のファイルをすべてダウンロードするようなプログラムを書いていると、クライアント側でコマンドが実行されてしまう。パイプ以外ではopen-uriをrequireしているようなケースでも何かまずいことができてしまうかもしれない。

普段書き捨てのコード以外ではFile.openの方を使うのだけど、確認したところ1997年8月13日リリースのruby-1.1a0のころからKernel#openを使っていたようだ。

ちなみにopen以外にも罠があって、例えば

p File.read("|echo hello") #=> "hello"

のようにしてもコマンドが実行されてしまう。

これは、Fileクラスには実はreadは定義されておらず、IO.readが呼び出されるため。 他には、binread, write, binwrite, foreach, readlinesなども同様の罠がある。 わざわざFile.と書いてパイプをオープンしている意図的なコードはそうそうないと思うので、Fileクラスにパイプをオープンしないバージョンを追加してオーバーライドした方がよいのではないかと思うが、今さら2.5には間に合わないだろう。

当面は引数をFile.expand_pathでフルパスに展開するとか、先にFile.statするなどすれば、上記のような罠を回避することができると思う。

Tags: Ruby

2017-11-25 (Sat) [長年日記]

_ 広瀬温泉

photo

天気がよかったので峠を越えて広瀬温泉へ。

天気がいい日はバイクをよく見かけるコースだけど、さすがにこの寒さのせいかバイクは帰りに一台すれ違っただけだった。

photo

帰ってからチェーンがまだ温かいうちにウェスで掃除したり、車体を拭いたりしていたら、せっかく温泉で暖まったのにすっかり冷えてしまった。

12月のツーリング大丈夫だろうか。

Tags: 250DUKE

2017-11-17 (Fri) [長年日記]

_ 冬支度

photo

出社前にKLX125のお下がりのハンドルカバーを装着。 換えたばかりのバーエンドが隠れてしまうが仕方ない。

これでもうちょっと寒さに耐えられるかな。

Tags: 250DUKE

2017-11-03 (Fri) [長年日記]

_ ハンドルバーエンドとタンクサイドパッド

photo

AliExpressで注文していた怪しいハンドルバーエンドとタンクサイドパッドが届いたので装着した。

純正オプションにこんなバーエンドないのに、KTMのロゴがバッチリ入っててすごい。

付属のワッシャーだと足りなかったので工具箱にたまたまあったワッシャーで調整した。

photo

タンクサイドパッドの方も作りが雑で、粘着部分が少しはみ出してしまった。 貼る前にカットしておけばよかった。

Tags: 250DUKE

2017-10-25 (Wed) [長年日記]

_ 360°リフレクト透湿防水防寒ジャンパー

photo

56designのコットンパーカーでは下にフリースを着てもつらい季節になってきたので、出社前にワークマンに寄ってWM3624Aを買ってきた。

イージスと迷ったけど、ズボンはいらないのと、ライムグリーンよりオレンジの方がDUKEに合うかなというのでこちらに。

耐水圧はイージスより低いけど、基本的に雨の日は乗らないので十分だろうと判断(しかし、8000mmという記載と5000mmという記載があってどっちやねん)。

帰りに着てみたけど、下はコットンのシャツと肌着だけでも暖かかったので、これで冬を乗り切れそうかな。

Tags: 250DUKE