国内关于云原生安全的书籍讲解得都不是很深入,在偶然的一次机会找到了Liz Rice的《Container Security》的这本书,从书籍的目录来看,对于容器安全、云原生安全的知识讲解较为全面,我大致看了几章内容,讲得较为深入且娓娓道来。
因此为了让更多人了解容器安全,也为了记录自己的一个学习过程,本文从第2部分开始翻译自《Container Security》的第7.1 章节内容,主要介绍了漏洞行业的相关基础研究,主要为后期镜像漏洞扫描技术的讲解奠定基础。本文结构如下所示:
给软件中漏洞打补丁一直以来都是维护已经部署的代码的安全的一个重要的方向。在容器世界中,这任然一个具有相关性的问题。但是在这一章中,你会认识到打补丁的过程完全被重塑了。不过,首先我们来介绍一下,什么是软件中的漏洞以及他们是怎么被发布和跟踪的。
软件是一个能够实现某种特定功能的计算机程序或程序集合;软件包是一组文件和依赖项的集合,可以包含一个或多个程序或库;库是一组可重用的代码和函数,可以用于多个应用程序中。在软件开发过程中,包、软件和库都起着重要的作用,可以帮助开发人员提高开发效率和代码质量。
一个问题或缺陷不一定会导致漏洞,但漏洞一定源于问题或缺陷。例如,一个网络应用程序的漏洞可能源于开发人员没有考虑到某些用户的输入数据可能包含恶意代码,这就是一个缺陷,它使攻击者可以利用该缺陷进行攻击,这就是漏洞。
Expose旨在识别和解决漏洞以保护系统的安全性和完整性,而Exploit则是利用这些漏洞来获取未经授权的访问或执行恶意操作。
因此,补丁和修复都是为了解决软件中的问题而进行的操作。补丁通常是一个临时性的解决方案,仅仅针对软件中的特定问题进行修复,而修复则是一个永久性的更改,针对软件中的整体性能和安全性进行优化。在软件开发过程中,补丁和修复都是非常重要的操作,可以帮助软件开发人员及时修复问题并提高软件的稳定性和可靠性。
漏洞是软件的一种已知的缺陷(flaw),攻击者可以利用这个缺陷来进行一些恶意的活动。通常,你可以认为一个软件越复杂,有这种已知的缺陷的可能性就越大,甚至有些缺陷可以被利用的(exploitable)。
当一个通用的软件存在漏洞时,无论漏洞在哪里,攻击者也许都就可以进行利用。因此,整个漏洞研究行业都致力于发现并报送公开可用的软件中的新的漏洞。特别是一些操作系统的软件包(package)和语言的库(library)。
你可能听说过一些最具破坏性的漏洞,像是shellshock、Meltdown和Heartbleed。这些漏洞不仅仅是一个名字,有时甚至是一个标识。这些漏洞是漏洞世界中的摇滚明星,但他们仅是每年报送的成千上万个问题(issue)中的一个小小的碎片。
一旦一个问题被认为是一个漏洞,一场用户与攻击者的竞赛就开始了,在这场竞赛中,用户需要在攻击者利用问题之前,获取并部署好一个可以修复问题的发布程序来修复问题。
如果立即公布新问题,这将为攻击者创造一个完全免费的利用问题的条件。为了避免这件事情的发生,一个负责任的安全纰漏(responsible security disclosures)的概念诞生了:发现漏洞的安全研究人员会与相关软件的开发人员或供应商联系。双方可以约定一个时间,在这个时间之后,安全研究员就可以公布他的发现了。
这样做也给供应商施加了一些积极的压力,这会要求供应商努力及时提供修复程序,因为对于供应商及其用户来说,在安全研究员公布其发现之前都可以提供修复程序。
然后,这个新的问题将会获得一个以CVE(Common Vulnerabilities and Exposures,常见漏洞和暴露)开头的唯一标识符。CVE标识符后面紧接着是年份。例如,Shell-Shock漏洞于2014年被发现,正式称为CVE-2014-6271。
管理CVE编号的组织叫做MITRE,并且他还会监督许多CVE编号机构(CVE Numbering Authorities,CNA)。所谓CVE编号机构指的是一些可以在特定范围内签发CVE编号的机构,这通常是一些大型的软件供应商。例如微软、Redhat和Oracle,他们都可以为自己产品中的漏洞分配编号。GitHub在2019年底成为CNA。
这些CVE编号被美国国家漏洞数据库(National Vulnerability Database,NVD)用来跟踪受漏洞影响的软件包和版本。
乍一看,你可能会认为这就是故事的结局:有一个受影响的所有软件包版本的列表,所以如果你有一个在受影响的软件包版本列表的软件,漏洞就会被揭露(expose),但不幸的是,它并没有那么简单,因为根据您使用的Linux发行版本,不同的Linux发行版本可能会有不同的软件包补丁版本。