漏洞的本质是race condition。在Linux内核中,可以通过af_unix传递fd,为了避免产生循环引用造成内存泄漏使用unix_gc进行清理。而unix_gc使用unix_gc_lock自旋锁,peek操作却没有同步使用gc锁,导致skb在check之后移出接收队列之前出现竞争窗口导致race condition,最终引发uaf
漏洞分析
在unix_gc进行操作时会获取unix_gc锁防止并发
static void __unix_gc(struct work_struct *work)
{
struct sk_buff_head hitlist;
struct sk_buff *skb;
spin_lock(&unix_gc_lock);
if (!unix_graph_maybe_cyclic) {
spin_unlock(&unix_gc_lock);
goto skip_gc;
}
__skb_queue_head_init(&hitlist);
if (unix_graph_grouped)
unix_walk_scc_fast(&hitlist);
else
unix_walk_scc(&hitlist);
spin_unlock(&unix_gc_lock);
skb_queue_walk(&hitlist, skb) {
if (UNIXCB(skb).fp)
UNIXCB(skb).fp->dead = true;
}
__skb_queue_purge(&hitlist);
skip_gc:
WRITE_ONCE(gc_in_progress, false);
}
改单,数据,渗透黑客提权拿站
XSS攻击 CSRF攻击 SQL注入
DDOs攻击,dns劫持
合作意向:
@Senior_010