パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

rsync 2.5.6 にバッファオーバーフローの脆弱性」記事へのコメント

  • 何これ? (スコア:2, 参考になる)

    あらら、これ rsync だけの問題で終わるのかしらん?

    改めてパッチを見たところ、メモリ割り当て関連コードが、

    • malloc() → new(バイト数)
    • malloc() → new_array(型, 配列数)
    • Realloc() → realloc_array(ポインタ, 型, 配列数)

    で全て書き直されていますね(C++ か

    • メモリ割り当て関数コードの追加は、使い勝手をよくするためのものでしょう。バグフィックスついでに従来の割り当てコードも書き直してしまえ、といったところではないでしょうか。

      また、メモリの割り当て最大サイズが 1GB に制限されています(こちらは DoS 対策か)。

      これは

      +#define MALLOC_MAX 0x40000000

      と、_new_array_realloc_array

      + if (num >= MALLOC_MAX/size)
      + return NULL; (これは2ヶ所)

      の部分のことですか?。これは単なる桁あふれ対策に見えま

      --
      巧妙に潜伏したバグは心霊現象と区別が付かない。
      • Re:何これ? (スコア:2, すばらしい洞察)

        ぱっとみーしかしてないんで外してそうですが、

        batch_flist->malloced *= 2;

        してメモリ再確保とかしているので、

        1. 最初にメモリ確保する部分でinteger overflowが起きてた
        2. そこだけ修正してOkだぜ、と思ったらやっぱり落ちる
        3. うは、*2 して realloc してるよ。最大確保可能量を1ビット減らそう
        4. 良く考えたら realloc するところも今回作った新しいメモリ確保の関数で確保するように変えればいいんだ

        という

        --
        -- Takehiro TOMINAGA // may the source be with you!
        • 0x40000000が10GBだとか、size_tが符号付きかもしれないだとか、だいぶ寝ぼけたことを書いてしまいました。失礼。

          size_tが最低32ビット(longの最低保証されるされるサイズ)はあると仮定するのは問題ないと思ってましたが、今調べたら、符号なし整数としか定義されていないんですね。迂闊でした。
          ということは、size_tのサイズが8ビット(shortの最低保証されるサイズ、16ビットより小さかったりしますが、charも整数に変わりはありませんし)な処理系があってもいいわけですね。最大255バイトしか確保できないmallocなんてヤですが。

          ということ
          --
          巧妙に潜伏したバグは心霊現象と区別が付かない。
          • by Anonymous Coward on 2003年12月05日 12時21分 (#448686)
            理想的な修正は、configureSIZE_MAX の存在・SIZE_T_MAX の存在・sizeof(size_t) のチェックをして、その結果を使うことなんでしょうが、「フィックスを早急にリリースする必要があり、configure のテストまでする余裕がない」「rsync の動作環境で size_t が32ビット以下はありえない」という状況なら、十分な修正であると思います。
            親コメント

Stay hungry, Stay foolish. -- Steven Paul Jobs

処理中...