【安全】容器中二进制漏洞检测方案

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、Terraform
  • trivy kubernetes:扫描k8s的漏洞

通过对trivy提供的命令以及使用的分析发现,开源的trivy采用的依然是以下三种方式:

  • 通过操作系统包管理器(apt、yum)获取安装的软件信息,然后根据软件版本信息分析出漏洞
  • 通过分析语言包的依赖库,以及依赖库的漏洞信息,得出整个软件的漏洞数据
  • 扫描相关的配置文件(Dockerfile、yaml、Terraform)中的敏感信息(passwd、key、token)
2.2 Synopsys Black Duck

Black Duck提供以下几种能力:

  • 程序分析:依赖分析(显然,也是通过分析配置文件)、码纹分析(可以识别C/C++开发的应用中使用的开源和第三方组件)、二进制分析、许可证分析
  • 漏洞扫描

Black Duck包含detect和server,detect没有做太多的扫描动作,通常会将数据上传到server执行。

安装detect:bash <(curl -s -L https://detect.synopsys.com/detect7.sh)

运行detect:java -jar synopsys-detect-7.13.2.jar --detect.binary.scan.file.path=/usr/bin/ping --blackduck.offline.mode=true --detect.cleanup=false

但是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。
  • Gofer:Gofer是个运行在宿主机的进程,当Gofer收到请求后,会处理所有对资源的访问,当然,也会提供额外的隔离。

于是,当容器中的进程执行系统调用时,需要有种机制截获该系统调用,然后转发给Sentry,Sentry在执行时,如果需要IO操作,则转发给Gofer。根据截获系统调用的机制区分,有两种方式:KVM和ptrace。

gVisor的安装以及作为docker的运行时:gVisor Installation

一些重要的选项:

  • –platform=kvm/ptrace:默认使用ptrace,使用kvm时,宿主机需要加载kvm模块
  • –overlay:默认情况下,在容器中读写文件,操作的还是宿主机上面的文件,如果想要完全隔离,可以设置该参数
  • –network=sandbox/host/none:默认使用sandbox网络,容器和宿主机可以通信,并做转发;如果设置为host时,则使用宿主机的网络;如果设置为none时,容器中则只有loopback,容器不能与宿主机通信
  • –debug:启用debug
  • –debug-log=/tmp/runsc/:debug日志路径

gVisor的一些问题:

  • 本身对内核版本要求高(使用了user namespace,3.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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式 - 结构型模式考点篇:适配器模式(类适配器、对象适配器、接口适配器)

目录 一、适配器模式 一句话概括结构式模式 1.1、适配器模式概述 1.2、案例 1.2.1、类适配器模式实现案例 1.2.2、对象适配器 1.2.3、接口适配器 1.3、优缺点&#xff08;对象适配器模式&#xff09; 1.4、应用场景 一、适配器模式 一句话概括结构式模式 教你将类和对…

阿里云上了新闻联播

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 阿里新任的CEO吴泳铭上央视新闻联播了! 在昨天的新闻联播里&#xff0c;出席科技座谈会&#xff0c;有一个特别镜头&#xff0c;出现了阿里新任CEO吴泳铭的镜头。 这个信号意义明显&#xff0c;我…

uniapp下拉刷新

为什么要使用uniapp的下拉刷新呢 跨平台兼容性&#xff1a; Uniapp 允许你一次编写代码&#xff0c;然后在多个平台&#xff08;如微信小程序、H5、iOS 和 Android 等&#xff09;上运行。使用 Uniapp 的下拉刷新功能&#xff0c;可以确保在不同平台上都能提供一致的用户体验&a…

程序员的注释:编程艺术与沟通工具

在软件开发的世界中&#xff0c;注释是一种常见的做法。然而&#xff0c;对于许多程序员来说&#xff0c;写注释可能会被视为一种不必要的繁琐工作&#xff0c;或者被认为是对代码的“耍流氓”。这种观点引发了一个有趣的问题&#xff1a;我们是否应该写注释&#xff1f;如果应…

kali linux安装redis

官网&#xff1a;Install Redis from Source | Redis wget https://download.redis.io/redis-stable.tar.gztar -xzvf redis-stable.tar.gz cd redis-stable make显示如下即可进入下一步 sudo make installredis-server 可以看到已经可以使用了。 但是由于第一次使用导致了re…

Rust专属开发工具——RustRover发布

JetBrains最近推出的Rust集成开发工具——RustRover已经发布&#xff0c;官方网站&#xff1a;RustRover: Rust IDE by JetBrains JetBrains出品过很受欢迎的开发工具IntelliJ IDEA、PyCharm等。 RustRover优势 Rust集成环境&#xff0c;根据向导可自动下载安装rust开发环境提…

Centos7中安装Jenkins教程

1.必须先配置jdk环境&#xff0c;安装jdk参考 Linux配置jdk 2.先卸载Jenkins # rpm卸载 rpm -e jenkins # 检查是否卸载成功 rpm -ql jenkins # 彻底删除残留文件 find / -iname jenkins | xargs -n 1000 rm -rf 3.安装Jenkins 在 /usr/ 目录下创建 jenkins文件夹 mkdir -p je…

Maven 构建Java项目

Maven 使用原型 archetype 插件创建项目。要创建一个简单的 Java 应用&#xff0c;我们将使用 maven-archetype-quickstart 插件。 在下面的例子中&#xff0c;我们将在 C:\MVN 文件夹下创建一个基于 maven 的 java 应用项目。 命令格式如下&#xff1a; mvn archetype:gene…

微信小程序--》从模块小程序项目案例23.10.09

配置导航栏 导航栏是小程序的门户&#xff0c;用户进来第一眼看到的便是导航栏&#xff0c;其起着对当前小程序主题的概括。而我们 新建的小程序 时&#xff0c;第一步变开始配置导航栏。如下&#xff1a; 配置tabBar 因为配置tabBar需要借助字体图标&#xff0c;我这里平常喜…

C++中的运算符重载

目录 1、运算符重载规则 2、运算符重载的两种形式 2.1、成员函数重载形式 2.2、普通的非成员函数重载形式 1、运算符重载规则 C中可以重定义或重载大部分 C 内置的运算符。这样&#xff0c;我们就能使用自定义类型的运算符。 重载的运算符是带有特殊名称的函数&#xff0c…

【数据库——MySQL】(16)游标和触发器习题及讲解

目录 1. 题目1.1 游标1.2 触发器 2. 解答2.1 游标2.2 触发器 1. 题目 1.1 游标 创建存储过程&#xff0c;利用游标依次显示某部门的所有员工的实际收入。(分别用使用 计数器 来循环和使用 标志变量 来控制循环两种方法实现) 创建存储过程&#xff0c;将某部门的员工工资按工作…

前端js调试如何复制console.log打印的对象或数组

在使用console.log()打印我们的内容时&#xff0c;时常需要将打印的内容复制粘贴使用&#xff0c;然而控制台打印出来的对象是经过格式化处理且直接选择粘贴会有格式问题&#xff0c;此时我们可以通过控制台的 copy() 方法来进行打印结果的复制&#xff0c;如图所示&#xff1a…

使用python查找指定文件夹下所有xml文件中带有指定字符的xml文件

文件夹目录如下&#xff08;需要递归删除文件夹下的.DS_Store文件&#xff09;&#xff1a; labels文件夹下面是xml文件&#xff1a; import os import os.pathpath "name/labels" files os.listdir(path) # 得到文件夹下所有文件名称 s []for xmlFile in files:…

JAVA String 和 String[][]互转的两种方法

第一种方法&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.40</version> </dependency>字符串转数组&#xff1a; String s "[[22,23,23],[1,10,20]]"…

华为云云耀云服务器L实例评测|企业项目最佳实践之云服务器介绍(一)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…

【轻松玩转MacOS】指引篇:这9篇指南助你轻松上手

引言 亲爱的读者&#xff0c;欢迎来到《轻松玩转MacOS》&#xff01;这里是专为MacOS新手打造的使用教学专栏&#xff0c;无论您是从Windows转投Mac的初学者&#xff0c;还是对MacOS操作略知一二但希望更进一步的朋友&#xff0c;都能在这里找到您需要的答案。 正文 1、基本…

Java8实战-总结40

Java8实战-总结40 用Optional取代null如何为缺失的值建模采用防御式检查减少 NullPointerExceptionnull 带来的种种问题其他语言中 null 的替代品 用Optional取代null 如何为缺失的值建模 假设需要处理下面这样的嵌套对象&#xff0c;这是一个拥有汽车及汽车保险的客户。 pub…

QT作业二

1、思维导图 https://www.zhixi.com/view/9e899ee0 2、作业 #include <iostream>using namespace std;class Rect {int width;int height; public:void init(int w,int h);//初始化函数void set_w(int w);//更改宽度void set_h(int h);//更改高度void show();//输出矩形…

php 外贸代购系统网站

PHP 外贸代购系统网站建设需要以下步骤&#xff1a; 链接各大热门商城上的商品并自动获取参数&#xff0c;程序集成了淘宝、拍拍等大型热门商城抓取规则&#xff0c;可以直接一键代购上面的任何商品&#xff0c;自动获取相应的参数。 确定网站功能&#xff0c;如&#xff1a;产…

你真的懂Java的继承吗?你知道什么时候用继承吗?设计继承是为了什么?

目录 1. 封装的意义是什么&#xff1f; 2. 为什么需要继承&#xff1f; 3. 继承是什么&#xff1f;如何使用&#xff1f; 4. 继承的好处是什么&#xff1f; 5. 设计继承需要注意什么&#xff1f; 6. 继承的特点 7. 子类到底继承了父类的哪些内容 7.1 继承内容 7.2 虚方…