单县网站建设,保定八大平台公司,微盟商户助手,人才市场官方网站1 背景
镜像或者容器中#xff0c;如果用户是通过包管理软件安装的程序#xff0c;可以通过包管理软件获取对应的软件信息和版本信息#xff0c;但是#xff0c;如果用户自己编译了一个二进制#xff0c;然后打包到镜像或者通过拷贝命令放到容器中#xff0c;该如何识别…1 背景
镜像或者容器中如果用户是通过包管理软件安装的程序可以通过包管理软件获取对应的软件信息和版本信息但是如果用户自己编译了一个二进制然后打包到镜像或者通过拷贝命令放到容器中该如何识别该程序是否有风险呢
漏洞检测方式有两种
版本对比将软件的版本跟漏洞库中影响的版本进行匹配如果匹配上说明有对应的漏洞有一定的误报而且需要先识别出软件名称和版本POC脚本执行执行漏洞POC查看是否有漏洞上报准确率高但是有些漏洞没有POC而且这种方式可能对正在运行的系统造成影响
我们先尝试第一种方式看能否获取二进制的版本信息(包含二进制使用的开源组件的版本信息)。
2 SCA(Software Composition Analysis)
SCA是一项对源代码或者二进制进行分析的技术通过分析软件的一些组成部分和依赖等识别出软件可能包含的漏洞。例如某个软件在开发过程中使用了一些公开的库那么这些库可能包含一些漏洞。
2.1 AquaSecurity
Aqua是一家容器安全初创公司主要的开源产品有Trivy(容器漏洞扫描)、kube-bench(k8s的CIS安全基准测试)。而Aqua的容器安全平台使用的扫描引擎就是Trivy而且可以设置选项Scan standalone binaries in images扫描不通过包管理安装的软件(使用开源的Trivy未发现可以扫描二进制估计是在开源版本上通过plugin机制增加了额外的扫描能力)。
Trivy提供的命令有
trivy image扫描镜像通过分析操作系统的包管理器的配置文件得到安装的软件包和版本然后通过软件包和版本得到对应的漏洞数据trivy fs扫描本地文件系统的语言包和配置文件trivy rootfs扫描rootfs相当于扫描容器扫描的方式跟镜像类似trivy repository扫描远程的仓库trivy server以server模式运行然后提供接口trivy config扫描配置文件中的密码和token等信息例如Dockerfile、k8s的yaml、cloudformation、Terraformtrivy kubernetes扫描k8s的漏洞
通过对trivy提供的命令以及使用的分析发现开源的trivy采用的依然是以下三种方式
通过操作系统包管理器(apt、yum)获取安装的软件信息然后根据软件版本信息分析出漏洞通过分析语言包的依赖库以及依赖库的漏洞信息得出整个软件的漏洞数据扫描相关的配置文件(Dockerfile、yaml、Terraform)中的敏感信息(passwd、key、token)
2.2 Synopsys Black Duck
Black Duck提供以下几种能力
程序分析依赖分析(显然也是通过分析配置文件)、码纹分析(可以识别C/C开发的应用中使用的开源和第三方组件)、二进制分析、许可证分析漏洞扫描
Black Duck包含detect和serverdetect没有做太多的扫描动作通常会将数据上传到server执行。
安装detectbash (curl -s -L https://detect.synopsys.com/detect7.sh)。
运行detectjava -jar synopsys-detect-7.13.2.jar --detect.binary.scan.file.path/usr/bin/ping --blackduck.offline.modetrue --detect.cleanupfalse。
但是detect在运行时一般需要制定server的地址特别地对于二进制扫描模式需要将二进制上传到server进行扫描分析。而在实现原理上则没有找到更多资料。
2.3 腾讯
腾讯的云产品T-Sec 二进制软件成分分析能够对二进制提供自动化的分析能力产品提供的功能包括
开源组件识别敏感信息扫描漏洞扫描
腾讯云的二进制软件成分分析产品就是基于科恩的BinaryAI而BinaryAI就是基于下面两篇论文
基于图神经网络的二进制代码分析判断两个二进制是否是同一份源代码编译出来的。那么在对待检测而进制而言如果可以找到同一份源代码编译出来的其他二进制那么他们应该就是从同一份源代码编译出来的就可以得到待检测的二进制使用的软件和版本信息。当然不同版本的软件可能修改的代码不是太多可能造成版本识别不正确基于跨模态检索的二进制代码-源代码匹配在给定二进制的情况下匹配出对应的源代码。那么在对待检测的二进制而言如果可以找到对应的源代码也就可以知道对应的软件和版本即便是通过不同参数编译而成的。
在github上BinaryAI和BinAbsInspector则都不太活跃。
腾讯的方案利用AI模型对开源软件的数据进行训练然后对待检测的二进制进行匹配找到相似的二进制或者对应的源代码基本可以确定使用的软件和版本。基于AI模型的方法比较重要的是数据集BinaryAI每天会自动跟踪开源平台上的项目变化对数据集进行更新。目前BinaryAI已经采集全网主流C/C项目的数万个仓库的上百万个版本累计百亿C/C源代码特征文件。
2.4 悬镜安全
悬镜安全是一家做软件供应链安全的公司它开源了OpenSCA根据它所支持的检测能力看它的实现方式是基于对包管理软件的配置文件的分析。
例如对于golang通过分析go.mod和go.sum文件得出该软件依赖的包和版本可以看出这种方案其实还是源代码级别的分析。
2.5 小结
基于对上述产品的调研相对比较公开的SCA实现方式通常是
分析操作系统的包管理软件分析语言包的配置文件
而其他的实现方式例如大数据或者AI要么比较封闭查不到太多资料要么需要利用AI大数据算法实现比较复杂。
3 Sandbox
容器是基于namespace、cgroup和chroot技术构建成的运行单元但是多个容器之间依然是共享内核的容器还是可能逃逸到宿主机会对其他容器造成安全隐患因此通常有两种方式能够提供比原生容器更高的隔离性
基于虚拟机例如KVM或者Xen在虚拟机之上搭建用户内核各虚拟机之间完全隔离但是这种方式的缺点在于启动时间较长、消耗的资源更多基于规则例如Seccomp、SELinux和AppArmor通过限定用户程序能够执行的操作达到隔离缺点在于规则比较复杂而且内核依然是共用的
Sandbox是一种更加安全的环境比虚拟机轻量的同时比容器更加安全可以在该环境中执行POC测试从而检测二进制的漏洞。
3.1 gVisor(Google)
gVisor通过伪装成内核对用户程序进行响应由用户态进程执行系统调用。
gVisor有两个组件
Sentry用户态的应用程序内核本身运行在用户态而且使用Seccomp限制了操作当应用程序执行系统调用时Sentry会收到请求它自身会处理一些逻辑无法执行的操作会通过9P协议转发给Gofer。GoferGofer是个运行在宿主机的进程当Gofer收到请求后会处理所有对资源的访问当然也会提供额外的隔离。
于是当容器中的进程执行系统调用时需要有种机制截获该系统调用然后转发给SentrySentry在执行时如果需要IO操作则转发给Gofer。根据截获系统调用的机制区分有两种方式KVM和ptrace。
gVisor的安装以及作为docker的运行时gVisor Installation
一些重要的选项
–platformkvm/ptrace默认使用ptrace使用kvm时宿主机需要加载kvm模块–overlay默认情况下在容器中读写文件操作的还是宿主机上面的文件如果想要完全隔离可以设置该参数–networksandbox/host/none默认使用sandbox网络容器和宿主机可以通信并做转发如果设置为host时则使用宿主机的网络如果设置为none时容器中则只有loopback容器不能与宿主机通信–debug启用debug–debug-log/tmp/runsc/debug日志路径
gVisor的一些问题
本身对内核版本要求高(使用了user namespace3.8开始引入3.10需要修改配置/proc/sys/user/max_user_namespaces)Sentry没有实现所有的系统调用部分程序可能无法运行没有在大规模场景下使用过可能有很多潜在的bug
3.2 kata-containers
kata-containers是一个基于轻量虚拟机实现的容器化技术它有容器的性能但是提供比容器更好的隔离性和安全性可以将它理解为一个经过裁剪的虚拟机。
分别下载containerd和kata
tar -C / -xf cri-containerd-cni-1.5.2-linux-amd64.tar.gztar -C / -xf kata-static-2.5.1-x86_64.tar.xzcp -f containerd.service /etc/systemd/system/containerd.service mkdir /etc/containerd
cp -f config.toml /etc/containerd/config.tomlsystemctl restart containerdctr image pull docker.io/library/busybox:latest然后运行一个容器ctr run --runtime io.containerd.kata.v2 --rm -t docker.io/library/busybox:latest test-kata uname -r会发现容器的内核跟宿主机的内核是不一样的说明它不是传统的容器方式运行。
4 总结
根据以上的调研如果使用版本对比的方式得到二进制漏洞有以下方式
基于包管理的软件清点包括操作系统(yum、apt)和应用软件(pip等)采集DockerHub中的主流软件的主程序的哈希值形成知识库然后用哈希值对比的方式获取软件信息利用gVisor在沙箱中运行容器中的主程序的命令得到应用的版本号可以优化现有的容器进程的软件版本清点的卡死、影响业务的问题基于腾讯开源的BinaryAI库或者BinAbsInspector建立自己的知识库(成本较高)
如果使用POC执行的方式得到二进制漏洞只能基于一些不会对系统造成影响的环境进行测试例如gvisor和kata-containers。