tags: container,方法论

容器安全研究的三重境界

与其他形态的技术相比,容器安全的漏洞更聚集在设计层面,而非实现层面,准确得说,非编码层面。

编码层面的漏洞更容易发现,且更容易自动化发现,但这种“优势”不会一直存在。因此,必然将形成漏洞越来越难挖的局面。而对容器技术而言,这个时间点来得相当早。这使得深入容器安全显得不那么容易,使研究者沮丧,但这也会极大地锻炼安全研究者的思维能力。

一、四级安全性

如果我们作以下定义:

  1. 将理想状态的安全定义为“理想模型”
  2. 将实际设计的结果定义为“设计模型”
  3. 将真实实现的代码定义为“实现模型”

我们将会得到4个不同级别的安全性: $$ \begin{equation} \left\lbrace \begin{array}{lr} 理想模型 \newline 设计模型 \newline 实现模型 \newline 编码漏洞 \end{array} \right. \end{equation} $$

以及3个可供挖掘漏洞的空间:

1. 编码漏洞

该类问题通常与语言本身强相关,较为显著的包括C语言带来的内存安全类问题、PHP弱类型引发的问题等。各语言都有一些不同的、隐蔽的特性,如果开发者不能熟知这些特性,则可能会埋藏漏洞。

这类问题的发现手段多,包括Fuzz,代码审计等。呈现出的漏洞数量也相当可观。

2. 三种模型间的差距

  • 分别分析出设计模型和实现模型,将二者对比,即可得出实现层面的漏洞
  • 将设计模型与理想模型对比,则可得出设计层面的漏洞

二、三重境界

1. 设计漏洞

寻找设计层面的漏洞,我们需要回答两个问题

  1. 什么是容器的理想模型?
  2. 某容器相关的项目,当前的设计模型是什么样的

对于容器来说,问题2是容易回答的,oci有翔实的specification。

难点在于解答问题一,或者我们是否有已知的安全设计模式可以套上去?

我暂时没有发现有可以直接使用的方法论,也许我们可以自行总结一套。这方面,后续我可以尝试用很长一个篇幅解答。

2. 实现漏洞

我们将追求放低至发现实现层面的漏洞,需要做的事情就简单多了

  1. 熟读oci specification
  2. 走读容器相关项目的代码

看,简单多了——至少是可执行的!

3. 编码漏洞

开篇即谈到了,容器安全的漏洞更聚集于非编码层面。但这个论述的对象主要是针对容器相关产品自身而言的,但如果将范围扩大至容器生态链呢?

例如

  • docker所调用的各组件,甚至各LSM模块
  • 由各云厂商以开源形式贡献至k8s的CNI

这样看,我们还是有希望在此层面挖掘相关漏洞的,但可能需要将挖掘范围扩大、将漏洞挖掘的方法进行微调,以适应于发现容器类漏洞。

三、结语

对容器来说,少有编码层面的漏洞可以挖,没有办法;对其他类型的技术栈来说,现在编码层面还有很大的研究空间,但已经有这种趋势,也应该尽早布局。

如果安全也有修仙一样的等级的话,挖掘编码层漏洞的集大成者就像是斗宗强者。当然很厉害了,但是上层似乎还有更广阔的空间。

(一个斗之气一段的臆想 T_T)