Featured Image for Detect CVE-2020-8557 using Falco
Kaizhe Huang

Detect CVE-2020-8557 using Falco

CVE-2020-8557

kubelet管理器在计算pod的临时存储使用量时,不包括kubelet装载在pod中的/etc/hosts文件。如果pod将大量数据写入/etc/hosts文件,可能会填满节点的存储空间,并导致节点失败,这相当于DoS攻击。

严重程度

  • 中等的

受影响的 Kubernetes 版本

  • kubelet v1.18.0-1.18.5
  • kubelet v1.17.0-1.17.8
  • kubelet < v1.16.13

使用 Falco 检测 CVE-2020-8557

检测此漏洞的攻击目的至关重要。Falco是CNCF的开源项目,用于容器和Kuberenetes的运行时威胁检测。您可以使用Falco在主机和容器级别检测恶意活动。Falco在发现异常行为时会生成安全事件,这些异常行为由一组可定制的规则定义。

Falco的好处之一是利用其强大而灵活的规则语言。与此同时,Falco提供了一些现成的检测规则。让我们看看如何检测有人试图利用CVE 2020-8557。

该漏洞是因为kubelet管理器不包括kubelet装载在pod中的/etc/hosts文件。通常,当不可压缩的计算资源消耗(如内存和磁盘)达到退出阈值时,kubelet逐出管理器将开始逐出POD,以保持工作节点和节点上运行的其他POD的可用性。同时,/etc/hosts也是系统的一个重要文件,当您的机器启动时,它需要知道一些主机名到IP地址的映射,然后才能引用DNS。此映射保存在/etc/hosts文件中。在没有名称服务器的情况下,系统上的任何网络程序都会参考此文件来确定与主机名对应的IP地址。在Falco开箱即用规则中,有一个特殊的规则来检测/etc 文件夹下包括/etc/hosts 文件的任何修改。

- rule: Write below etc
  desc: an attempt to write to any file below /etc
  condition: write_etc_common
  output: "File below /etc opened for writing (user=%user.name command=%proc.cmdline parent=%proc.pname pcmdline=%proc.pcmdline file=%fd.name program=%proc.name gparent=%proc.aname[2] ggparent=%proc.aname[3] gggparent=%proc.aname[4] container_id=%container.id image=%container.image.repository)"
  priority: ERROR
  tags: [filesystem, mitre_persistence]

或者,您可以为 CVE 设置此特定规则:

- rule: Detect Write Below /etc/hosts
  desc: an attempt to write to /etc/hosts file (CVE-2020-8557)
  condition: open_write and container and fd.name=/etc/hosts
  output: "File /etc/hosts opened for writing (user=%user.name command=%proc.cmdline parent=%proc.pname pcmdline=%proc.pcmdline file=%fd.name program=%proc.name gparent=%proc.aname[2] ggparent=%proc.aname[3] gggparent=%proc.aname[4] container_id=%container.id image=%container.image.repository)"
  priority: ERROR
  tags: [filesystem, mitre_persistence]

当/etc/host文件发生文件写入活动时,将触发上面的 Falco 规则,他的输出将如下所示:

File /etc/hosts opened for writing (user=root command=bash parent=bash pcmdline=bash file=/etc/hosts program=bash gparent=<NA> ggparent=<NA> gggparent=<NA> container_id=384fc3447d54 image=kaizheh/nginx)

在工作节点上检查文件大小时,您会发现以下内容:

root@ip-172-20-48-137:/home/admin# find /var/lib/kubelet/pods/*/etc-hosts -size +1M
/var/lib/kubelet/pods/a8e75db1-b0cf-487a-ab5c-8041d33824f1/etc-hosts

工作节点上的文件大小/etc/hosts大于 1M。

缓解策略

因为该漏洞的目标是/etc/hosts文件。一个具体的缓解策略是将以下AppArmor配置文件应用于您正在运行的容器:

#include <tunables/global>
 
profile cve-2020-8557 flags=(attach_disconnected,mediate_deleted) {
  #include <abstractions/base>
 
  # accessing to network resources are subject to change per container
  network inet tcp,
  network inet udp,
  network inet icmp,
  deny network raw,
  deny network packet,
 
  file,
  Umount,
 
  # deny writes to /etc/hosts file
  deny /etc/hosts wl,
 
  # capabilities are subject to changes per container
  capability chown,
  capability dac_override,
  capability setuid,
  capability setgid,
}

前面的AppArmor配置文件允许来自容器的大多数活动,但拒绝写入/etc/hosts文件。

结论

在升级之前,应用缓解策略很重要。除了防止漏洞被利用之外,检测或监控 /etc/hosts 文件上的任何文件写入也很重要。查看 Falco 和 Sysdig Secure 了解更多信息以帮助缓解漏洞。

参考

https://github.com/kubernetes/kubernetes/issues/93032
https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/