チェックポイント会社
Safe-Linking を実装するパッチは、Glibc (ptmalloc)、uClibc-NG (dlmalloc)、gperftools (tcmalloc)、Google TCMalloc 用に用意されており、Chromium の保護をアップグレードするためにも提案されています (
2012 年以来、Chromium には同じ問題の解決を目的とした MaskPtr 保護技術が組み込まれていますが、Checkpoint のソリューションはより高いパフォーマンスを示しています)。
提案されたパッチは、8 月のリリースでの配信がすでに承認されています
開発者
セーフリンクにより、free() が呼び出されるたびに 2 ~ 3 個の追加のアセンブリ命令が実行され、malloc() が呼び出されるたびに 3 ~ 4 個の追加のアセンブリ命令が実行されます。初期化ステージとランダム値生成ステージを実行する必要はありません。
セーフリンクを使用すると、さまざまなヒープ実装のセキュリティを向上させるだけでなく、バッファ自体の隣に配置されたポインタの単一リンク リストを使用するデータ構造に整合性制御を追加することもできます。このメソッドは実装が非常に簡単で、マクロを 1 つ追加し、それをコード内の次のブロックへのポインターに適用するだけです (たとえば、Glibc の場合)。
+#define PROTECT_PTR(pos, ptr) \
+ ((__typeof (ptr)) ((((size_t) pos) >> 12) ^ ((size_t) ptr)))
+#define REVEAL_PTR(ptr) PROTECT_PTR (&ptr, ptr)
- nextp = p->fd;
+ nextp = REVEAL_PTR (p->fd);
...
この方法の本質は、ASLR アドレスランダム化メカニズム (mmap_base) からのランダム データを使用して、Fast-Bins や TCache などの単一リンク リストを保護することです。値がリスト内の次の要素へのポインターに適用される前に、マスク変換が実行され、ページの配置がチェックされます。ポインタは、演算「(L >> PAGE_SHIFT) XOR (P)」の結果によって置き換えられます。ここで、P はポインタの値、L はポインタが格納されているメモリ位置です。
システムで使用する場合
この方法は、部分的なポインターの書き換え (下位バイトの変更)、完全なポインターの書き換え (攻撃者のコードへのリダイレクト)、および整列されていないアドレスでのリストの位置の変更を使用する攻撃から保護するのに効果的です。例として、最近では、malloc で Safe-Linking を使用すると悪用をブロックできることが示されています。
出所: オープンネット.ru