パスワードを忘れた? アカウント作成
15755 story

Hiki 0.8.7、任意ファイル削除の危険を修正 15

ストーリー by Acanthopanax
チェックは厳しく 部門より

tamo 曰く、

Hiki 0.8.0 から 0.8.6 に、任意のファイルを削除させられてしまう脆弱性 が発見され、修正されました。Hiki は Ruby で書かれた Wiki クローンとして、日本を中心に人気を集めています。今回の脆弱性は、セッション ID を管理するためのファイルを削除する際に、ファイル名のチェックが不十分だったことが原因です。ログアウトするときにはセッション ID と同名のファイルが削除されますが、セッション ID(として与えられた文字列)が [0-9a-f] を 16 文字含むことしかチェックされていなかった模様です。0.8.7 では 16 進数 16 文字のみを含むことが確認されます。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • というか (スコア:1, 興味深い)

    by Anonymous Coward on 2007年06月26日 6時46分 (#1180080)
    削除対象のファイルとそうでないファイルを名前だけで区別していることに驚いた。それって普通なんだろか。
    # あまり脅威ではないけど、修正後も「任意のセッションIDファイル」は消せるのか
    • Re:というか (スコア:3, 興味深い)

      by tietew (6130) on 2007年06月26日 10時20分 (#1180126) ホームページ
      その「任意の有効なセッションID」が推測できるとすれば、それはそれで脆弱性です。
      # ただし今のRubyには暗号安全な乱数関数が(OpenSSL以外)にないが、その辺の評価方法は知らない
      • Re:というか (スコア:1, すばらしい洞察)

        by Anonymous Coward on 2007年06月26日 13時45分 (#1180215)
        「任意の有効なセッションID」が推測できる必要はないんじゃないか?推測できた方が危険度は増すけど、コントロール下にないはずのファイルを消せてしまうことが脆弱性の本質なわけで。
        • by Anonymous Coward
          仰ることはもっともですが、そうするとステートレスなHTTPでステートフルを実現するためのセッション機構の全てが脆弱性になってしまいます。実際、脆弱性には違いがないのですが、十分なビット長のセッションIDを持つことによって事実上問題がないということを併記しておかないと、単に危険性を喧騒するだけになってしまいます。
    • by JnJ (23012) on 2007年06月26日 8時43分 (#1180096) ホームページ
      長いファイル名&[0-9a-f]以外を許容すると../とかも許可されてしまうので
      たとえセッションファイルが専用のディレクトリに格納されていたとしても
      別のディレクトリのファイルの削除ができてしまうということでは?
      #使ってるわけでもソース読んだわけでもないので予測ですが。
      --
      LAN内LAN稼働中
  • by Anonymous Coward on 2007年06月26日 11時02分 (#1180153)
    Ruby はほとんど使ったことが無いんですが、Ruby で記述されたウェブアプリケーションのためのフレームワークの中にセッション管理の機能って無いんでしたっけ?私は PHP をよく使うんですが、最初から用意されているセッション管理機能にべったり依存してしまっていたりします。
  • by Anonymous Coward on 2007年06月26日 10時30分 (#1180132)
    相変わらず、よくわからないネタフリだな。

    > セッション IDが [0-9a-f] を 16 文字含むことしかチェックされていなかった模様です。

    これよんでも不具合かはさっぱりわかんね。
    [A-F]のチェックが抜けてるから?
    • by Anonymous Coward on 2007年06月26日 10時42分 (#1180140)
      > > セッション IDが [0-9a-f] を 16 文字含むことしかチェックされていなかった模様です。
      > これよんでも不具合かはさっぱりわかんね。

      「含むこと」がポイントですね。正規表現で /[0-9a-f]{16}/ にマッチするかというチェックしかしてなかったから、
      idを「../../../0123456789abcdef/../../../foo/bar/…」みたいな指定をしても有効になってたってことでしょう。
      で、正規表現を/^[0-9a-f]{16}$/に変えたと。
      • 正規表現がさっぱりなんだけど要は、
        今まで → 「0123456789abcdef」さえ含まれていれば他にどんなものが含まれていようがおk
        修正後 → 「0123456789abcdef」だけで構成されていないとダメ
        ってことかな?
  • by Anonymous Coward on 2007年06月26日 10時35分 (#1180137)
    0.8.7 では 16 進数 16 文字のみを含むことが確認されます。
    なんだかなあ。そういう対策方法はひろみちゅ先生(誰)に叱られそうです。

    こういう方法はどうですか?
    ログアウトボタンが押されたら、そのセッション(cookieで指定された)のセッションオブジェクトを参照して、それが存在すれば、そのセッション用のセッション保管用ファイルのファイル名を導出して、削除する。

    • by Anonymous Coward
      食わせた相手のIPアドレスを控えておいて照合、とかやらない限り、cookieだって簡単に書き換え可能だと思うんだが。
typodupeerror

吾輩はリファレンスである。名前はまだ無い -- perlの中の人

読み込み中...