回顾:关于漏洞研究的一些想法


回家的路上,思绪漫无目的地游荡。忽然潜意识里飘过了点什么,我有了想要把之前研究过的零碎内容以某种新的形式整合抽象的想法,于是回来后打开作图软件开始拖拽。最后我终于把路上脑子里的想法呈现在屏幕上,它就是下面这样:

一图胜千言,所以我把想要表达的尽可能多地放在上图。然而,下面还是要写下一些注解,以免未来自己回过头来也不知道当初一时兴起画了个什么。

上图想表达的意思大概有下面这些:

  1. 在上图这样一个也许真实也许虚幻、但是技术上可以实现的架构中,攻击者可能需要先break in,然后层层突破,不断break out。不过,这里仅仅考察了单节点环境,没有涉及横向移动。
  2. 就时下而言,PWN的狭义定义通常主要包括二进制程序和二进制协议实现的漏洞利用,技术上可以大概分为用户态(userland)PWN和内核态(kernel)PWN。在这一语义环境下,结合相关技术原理与实践经验,我们发现:
    1. 容器逃逸、用户态权限提升、内核RCE(如攻击Linux TIPC模块漏洞)和虚拟机逃逸(如攻击KVM)都会涉及到内核PWN。反过来说,内核漏洞利用知识与技术可以是这三者的前提或基础。
    2. 用户态RCE、用户态权限提升和虚拟机逃逸(如攻击QEMU)都会涉及到用户态PWN。就用户态而言,容器逃逸部分涉及的用户态程序漏洞多出于逻辑问题、对系统机制(如符号链接、Seccomp和Namespaces)的考虑与使用不周等,相对来说比较杂。
    3. 内核态PWN场景通常需要考虑内核态的漏洞缓解机制,不需要考虑用户态的漏洞缓解机制(如ASLR、Stack Canary和PIE);用户态场景通常需要考虑用户态的漏洞缓解机制,不需要考虑内核态的漏洞缓解机制。
    4. 用户态PWN与内核态PWN有很多共通的漏洞利用技术或利用思想,如ROP与kROP;也有很多相似的漏洞缓解机制,如ASLR与KASLR。然而,其细节又有所不同。例如,虽然内核态KASLR的熵更小,但是一旦绕过KASLR失败,后果很可能是内核崩溃,对于意图非DoS的攻击者来说得不偿失。在这里,前因与后果形成了补足和制衡。
  3. 再从广义角度来看,如果我们将PWN定义为某种形式的入侵,那么上图涉及的不同环节都可以归到用户态PWN和内核PWN。当然,每个分类都更加抽象,其内部的漏洞利用技术之间的差异就更大了。
  4. 上图中的应用沙盒指服务端的应用沙盒技术。我主要接触过Python和Bash相关的沙盒场景,逃逸方式不尽相同,其中部分与Web后端攻击场景有相似之处。我对客户端(如Chrome)的沙盒技术了解比较少,在此不做讨论。
  5. 研究走入艰深,凭借不断的回顾和总结,明确自己所处的阶段、想做什么和能做什么,也许会帮助找到下一阶段的方向。

以上内容纯属有感而发,画出、写下后感觉还挺有意思,因此分享出来。如有谬误、改进之处还请指教。