Relro
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
RELROはRelocation Read-Onlyの略で、GOT (Global Offset Table)の上書きに関連するリスクを軽減するためにバイナリで使用されるセキュリティ機能です。RELRO保護には2種類あります:(1) Partial RELROと(2) Full RELROです。どちらもELFファイルからGOTとBSSの順序を変更しますが、結果と影響は異なります。具体的には、GOTセクションをBSSの前に配置します。つまり、GOTはBSSよりも低いアドレスにあり、したがってBSS内の変数をオーバーフローさせることでGOTエントリを上書きすることは不可能です(メモリへの書き込みは低いアドレスから高いアドレスに向かって行われることを思い出してください)。
この概念を明確にするために、2つの異なるタイプに分解しましょう。
Partial RELROは、バイナリのパフォーマンスに大きな影響を与えずにセキュリティを強化するためのよりシンプルなアプローチを取ります。Partial RELROは**.gotを読み取り専用にします(GOTセクションの非PLT部分)。セクションの残りの部分(.got.pltなど)はまだ書き込み可能であり、したがって攻撃の対象となることに注意してください。このGOTが任意の書き込み**の脆弱性から悪用されるのを防ぐことはありません。
注:デフォルトでは、GCCはPartial RELROでバイナリをコンパイルします。
Full RELROは、GOT全体(.gotと.got.pltの両方)および.fini_arrayセクションを完全に読み取り専用にすることで保護を強化します。バイナリが起動すると、すべての関数アドレスが解決され、GOTにロードされ、その後、GOTは読み取り専用としてマークされ、実行時にそれに対する変更を効果的に防ぎます。
ただし、Full RELROのトレードオフはパフォーマンスと起動時間にあります。GOTを読み取り専用としてマークする前に、起動時にすべての動的シンボルを解決する必要があるため、Full RELROが有効なバイナリは読み込み時間が長くなる可能性があります。この追加の起動オーバーヘッドが、すべてのバイナリでFull RELROがデフォルトで有効になっていない理由です。
バイナリでFull RELROが有効かどうかを確認することができます:
フルRELROが有効な場合、バイパスする唯一の方法は、任意の実行を得るためにGOTテーブルに書き込む必要のない別の方法を見つけることです。
LIBCのGOTは通常、パーシャルRELROですので、任意の書き込みで変更できます。詳細はTargetting libc GOT entriesを参照してください。
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)