Off by one overflow
基本情報
1バイトのオーバーフローへのアクセスがあるだけで、攻撃者は次のチャンクのpre_in_use
ビットを変更でき、現在のチャンクが使用されていないため、チャンクの末尾は前のチャンクのサイズのメタデータ情報になります。
これにより、実際に解放されるチャンクを操作し、別の正当なチャンクを含むチャンクを生成する可能性があります。
オフバイワンの脆弱性には2種類あります:
任意のバイト:この種類はそのバイトを任意の値で上書きできるようにします
Null off by one:この種類はそのバイトを0x00でのみ上書きできるようにします
この脆弱性の一般的な例は、次のチャンクの先頭に0x00バイトを設定できるようにする、strlenとstrcpyの挙動が一貫していないコードで見ることができます。
目次
この攻撃はTcachesの使用によりもはや機能しません。
さらに、より大きなチャンクを使用して悪用しようとすると、エラーが発生します:
malloc(): invalid next size (unsorted)
ゴール
チャンクを別のチャンクの中に含ませ、その2番目のチャンクへの書き込みアクセスを許可して、含まれるチャンクを上書きできるようにする
必要条件
前のサイズのメタデータ情報を変更するためのオフバイワンオーバーフロー
攻撃
メモリの3つのチャンク(a、b、c)が順番に予約されます。次に、中央のチャンクが解放されます。最初のチャンクにはオフバイワンオーバーフローの脆弱性があり、攻撃者はそれを悪用します(前のバイトが0x10であれば、中央のチャンクが実際より0x10小さいと示します)。
次に、中央の解放されたチャンク(b)に2つのより小さなチャンクが割り当てられますが、
b + b->size
は c チャンクを更新しないため、指定されたアドレスが適切なサイズよりも小さいためです。次に、b1 と c が解放されます。
c - c->prev_size
はまだ b(今は b1)を指しているため、両方が1つのチャンクに統合されます。ただし、b2 はまだ b1 と c の間にあります。最後に、新しい malloc が実行され、このメモリ領域を再取得し、実際に b2 を含むことになり、新しい malloc の所有者が b2 の内容を制御できるようになります。
この画像は攻撃を完璧に説明しています:
その他の例と参考文献
オフバイワンを悪用してヒープからアドレスをリークすることが可能です。これは、次のフィールドによって上書きされる文字列の末尾のバイトが0x00であるためです。
オフバイワンを悪用して、ポインタを別の場所を指すように書き換え、偽のポインタを持つ偽の構造体が構築されるようにすることで、任意の書き込みを取得できます。その後、この構造体のポインタをたどることで、任意の書き込みを取得できます。
libc アドレスが漏洩するのは、ヒープが mmap を使用して拡張される場合、mmap によって割り当てられたメモリが libc から固定オフセットを持っているためです。
最後に、任意の書き込みを悪用して、__free_hook のアドレスに one gadget を書き込みます。
getline
関数には、ユーザー入力行を読み取る NULL オフバイワンの脆弱性があります。この関数は、コンテンツの「キー」を読み取るために使用されます。解説では、5つの初期チャンクが作成されます:
chunk1 (0x200)
chunk2 (0x50)
chunk5 (0x68)
chunk3 (0x1f8)
chunk4 (0xf0)
chunk defense (0x400) トップチャンクとの統合を回避するため
次に、chunk 1、5、3 が解放されます:
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]
[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]
Last updated