TCACHE exploitation
2018-04-09 19:51:47 Author: medium.com(查看原文) 阅读量:18 收藏

berming

最近越來越排斥在medium上寫很技術性的東西,因為我發現自己點開medium也不想看太艱澀的內容,所以之後會考慮把這類內容移動到其
他地方,接下來進入本篇正題。

  • 若不熟悉ptmalloc heap exploitation的人可以參考這裡這裡
  • 非常熟悉ptmalloc heap exploitation而不想看太多廢話的人可以直接
    參考這裡

TCACHE(per-thread cache)是glibc 2.26約2017年中段才新增的優化技術,該優化能增快malloc速度,具體上是減少了_int_malloc()的呼叫次數。

Data Structure

/* We overlay this structure on the user-data portion of a chunk when
the chunk is stored in the per-thread cache. */
typedef struct tcache_entry
{
struct tcache_entry *next;
} tcache_entry;

/* There is one of these for each thread, which contains the
per-thread cache (hence "tcache_perthread_struct"). Keeping
overall size low is mildly important. Note that COUNTS and ENTRIES
are redundant (we could have just counted the linked list each
time), this is for performance reasons. */
typedef struct tcache_perthread_struct
{
char counts[TCACHE_MAX_BINS];
tcache_entry *entries[TCACHE_MAX_BINS];
} tcache_perthread_struct;

static __thread char tcache_shutting_down = 0;
static __thread tcache_perthread_struct *tcache = NULL;

其實結構就和一般的bin差不多,但更像fastbin(FIFO、single linked-list),特別的是這個tcache_perthread_struct是被分配在heap上的(而不像一般bins位於main_arena),其中有三個重要的性質要注意:

  • 總共64個bins
  • chunk size 24 ~ 1032 bytes (x86_64)
  • 一個bin最多放7個chunks

Operation

tcache藉由tcache_puttcache_get把chunk拿進拿出,細節不需要了解,只需要知道這兩個動作都沒有做security check

前面提到TCACHE減少了_int_malloc()的呼叫次數,換句話說就是TCACHE chunk不會去呼叫到_int_malloc(),而大多數的security check卻都位於其中,再者TCACHE chunk本身的operation又不自帶檢查,其結果就是幾乎沒有security check存在

所以現在要考慮的很簡單-什麼時候 chunk 會被放進 tcache /從 tcache取出?

放進tcache

  1. 基本上fast/small chunk被free之後都會先被放進tcache。
  2. 如果malloc一個fast/small chunk,那麼一樣大小的其他free chunks被放入對應的tcache bin。(就是快取做的事情呀,用過的先拿出來放。)

從tcache取出

  1. _int_malloc()之前,size對了就先從tcache拿。

另外tcache chunk還有一個特性是free chunks不做合併,有了這些知識後,就能理解大部分的tcache exploitation了。

Powerful The House of Spirit

The House of Spirit變得更有威力了,原本要通過一些檢查像invalid next size (fast),現在不需要了,而以往通常只作用在fast chunk,現在small chunk也可行

以下是執行結果,輕鬆的做到arbitrary allocation.

The House of Spirit with tcache 
There’s no nextsize check (invalid next size (fast))
[Fastbin]
Evil chunk : 0x7ffde7de5a20
Next allocation : 0x7ffde7de5a20
Now it works in small chunk too
[Smallbin]
Evil chunk : 0x7ffde7de59a0
Next allocation : 0x7ffde7de59a0

Corrupt tcache_entry next

這就很類似fastbin attacktcache_entry中有個next指標存著下一塊chunk
,跟fast chunk上的fd差不多,覆寫他達到下下次malloc能夠arbitrary alloc-
ation,不同的是做fastbin attack時會檢查chunk size是否符合bin index,且會做double free check,這些檢查在tcache中都沒有,非常強大。

Corrupt next of tcache_entry, it's simialr to fastbin attack but no size check corresponding to fastbin index need to be satisfied.Evil : 0x7ffff02157b0
1st allocation : 0x561ceee3b670
2nd allocation : 0x7ffff02157b0, content = hack!

其他的exploitation我都放在我的github上,另外這裡有我在hackmd做的詳細版筆記,想繼續鑽研的可以參考看看

TCACHE是個很有趣的東西,他把malloc效率提升了一個等級,工程師們樂開懷,但同時也捨棄相當多的security check,駭客們也開心了,雙贏雙贏!

而除了基本的heap exploitation變得更加容易以外,或許也有新的技術出現
,就等待之後大神們的挖掘。

http://repwn.com/archives/32/


文章来源: https://medium.com/@ktecv2000/tcache-exploitation-871044f8b210?source=rss-eb87faee21ca------2
如有侵权请联系:admin#unsafe.sh