镜像漏洞扫描主要基于以下原理:
特征匹配
维护一个庞大的已知漏洞特征库,这个库包含了各种软件组件(如操作系统内核、应用程序、库文件等)在不同版本下存在的漏洞信息。例如,对于某个特定版本的OpenSSL库,其特征库中会记录已发现的诸如心脏滴血(Heartbleed)漏洞的特征信息,包括特定的代码模式、内存布局特征或者网络协议交互中的异常特征等。
当扫描镜像时,扫描工具会将镜像中的软件组件与特征库中的漏洞特征进行比对。如果发现镜像中的某个组件存在与特征库中某一漏洞特征相匹配的情况,就判定该镜像可能存在此漏洞。
对镜像中的文件计算哈希值(如MD5、SHA - 256等)。在漏洞特征库中,也会存储已知存在漏洞的文件的哈希值。如果在镜像中发现某个文件的哈希值与特征库中存在漏洞的文件哈希值相同,就可以确定该文件存在相应漏洞。
同时,一些软件组件会有特定的文件签名,扫描工具可以通过验证这些签名来判断组件的完整性和是否存在已知漏洞。
基于规则的检测
针对镜像中的配置文件、脚本等,定义一系列的语法和语义规则。例如,在Linux系统的配置文件中,某些特定的配置项设置可能会导致安全风险,如开放了不必要的端口或者设置了过于宽松的权限。
扫描工具会解析这些配置文件和脚本,按照预定义的规则进行检查。如果发现违反规则的情况,就认为存在潜在漏洞。对于脚本语言编写的程序,还会检查代码逻辑是否存在可能导致安全问题的情况,如注入漏洞(SQL注入、命令注入等)的可能性。
分析镜像中不同软件组件之间的关系。某些组件组合在一起可能会产生安全风险,例如,特定版本的Web服务器与数据库服务器的组合可能存在认证绕过或者数据泄露的风险。
扫描工具会根据预定义的组件关系规则,检查镜像中的组件搭配是否合理,是否存在已知的风险组合。
动态行为分析(部分高级扫描工具采用)
在一定程度上模拟镜像的运行环境,启动镜像中的部分服务或者进程。例如,对于一个包含Web应用的镜像,可能会启动Web服务器进程并模拟一些正常的用户请求。
在模拟运行过程中,监测软件的行为,如网络连接、文件访问、内存操作等。如果发现异常行为,如试图访问敏感文件、建立异常的网络连接等,就可能判定存在漏洞。
在安全可控的环境下,尝试利用已知漏洞的利用方式进行测试。不过这种方式比较谨慎,因为如果操作不当可能会对周围环境造成影响。通过尝试利用,可以更准确地判断镜像是否存在特定漏洞,但这种方式的使用受到严格的限制和规范。