web-dev-qa-db-ja.com

LinuxのASLRはライブラリを個別にランダム化しません

CentOS 7.2.1115 x86_64でASLRがどのように機能するかを具体的に試してみました。

これが私の/proc/$pid/maps(Pastebin上の)Firefoxの2つの実行からのダンプ: #1#2

基本的に、ASLRは機能します。 .dataおよび.textオフセットをランダム化します。

ただし、すべてのライブラリと実行可能ファイルが同じ順序でギャップなしでパックされます。(まあ、ほとんど。いくつかのバリエーションがありますが、それらはまったく偶然に見えます。)

したがって、単一のアドレスが侵害されるとすぐに、ASLRのこの部分全体がウィンドウの外に出ます。

私の質問はですが、今のところ一般的なケースですか?どのシステムがこの問題にどのように対処していますか?

つまり、64ビットのアドレス空間はhugeであり、各ライブラリをランダムにスローし、それが何かと重複しているかどうかを確認し、2回の再試行後に正常に配置できます最も。それでも、グーグルで見つけた実装済みの最良のソリューションは、Androidでのライブラリのロード順のランダム化です。

6
EvgEnZh

ただし、すべてのライブラリと実行可能ファイルが同じ順序で隙間なくパックされます。したがって、単一のアドレスが侵害されるとすぐに、ASLRのこの部分全体がウィンドウの外に出ます。

結構です。 ASLRは、ブラインドエクスプロイトの可能性を減らすために引き続き機能し、攻撃者が実行ポイントに確実にジャンプすることを防ぎます。上書きする特定のポイントがわからない場合、次の戦術はとにかく近くのメモリをNOPスレッドにすることです。開始アドレスがランダム化されることと相まって、断片化に関係なく、決して不可能な土地で有用なコードと同じように何かを選ぶ可能性があります。

つまり、64ビットのアドレス空間は巨大であり、各ライブラリをランダムにスローし、それが何かと重複しているかどうかを確認し、最大で数回の再試行後に正常に配置できます。

本当ですが、パフォーマンスの問題が発生します。すべてのランダム化エントリは [〜#〜] tlb [〜#〜] のエントリを必要とするため、リソースの使用率が高くなり、ブロックアラインメントによりメモリが無駄になり、使用されなくなります。

私の質問は、今のところ一般的なケースですか?どのシステムがこの問題にどのように対処していますか?

上記の理由により、それは確かに一般的なケースです。攻撃の制限を理解すると、より高価な「どこでもメモリのビット」を使用してもメリットが限定される理由を理解するのに役立ちます。

ボーナスポイント:最も一般的な悪用は、データブロックに大量のデータを書き込んでから実行することです。 [〜#〜] nx [〜#〜] ビットも重要な対策です。

4
Jeff Ferland