
Rizinはradare2からフォークされたリバースエンジニアリングフレームワークであり、そのELFパーサーコードに欠陥が発見され、 細工されたファイルによるサービス拒否を引き起こす可能性があります。これにより、ユーザーはファイルをrizinに読み込めなくなりますが、 ファイル自体の実行には影響を与えません。
一般的なELFファイルは動的リンク/ロードに依存しているため、多くの情報がファイルに埋め込まれています。その情報の1つが、 .dynamicセクションにあるDT_VERNEEDNUMエントリです。このフィールドは、シンボルバージョン依存テーブルのエントリ数を 指定します。したがって、この値は各バージョン依存関係を解析する際に使用されるべきものですが、 テーブルは最後のverneedエントリではvn_nextフィールドが0になるように設計されています。しかし、末尾を検出するまで各エントリをループする代わりに、 rizinはDT_VERNEEDNUMエントリから取得した値を使用してテーブルエントリをループします。 これにより、DT_VERNEEDNUMの値を0xFFFFFFFFFFFFFFFFのような非常に大きな値に偽装された場合、 ELFパーサーは、nullになったvn_nextフィールドで次のエントリのオフセットを計算しながら、 まだ反復処理するエントリがあると考えて最後のエントリを延々と処理し続けます。これはrizinのELFパーサーに影響しますが、 Linuxローダーは偽のDT_VERNEEDNUMによってテーブルの末尾に達したことを検出するため、バイナリの実行には一切影響しません。 これは、vn_nextがnullのときにそれを検出してループを抜けるだけで簡単に 解決できます。
このバグはv0.5.0より前のバージョンに存在し、コミット4564986ef29f8872a95733416ce0a860ac2aa7e5で修正されました。 影響を受けるファイルと関数はlibrz/bin/format/elf/elf_info.c:get_gnu_verneed(ELFOBJ *bin)です。
https://github.com/rizinorg/rizin/pull/3214
https://github.com/rizinorg/rizin/pull/3214/commits/4564986ef29f8872a95733416ce0a860ac2aa7e5