ブログ

Falcoを使用してCVE-2020-8557を検出する

Falcoを使用してCVE-2020-8557を検出する

本文の内容は、2020年7月15日に Kaizhe Huangが投稿したブログ(https://falco.org/blog/detect-cve-2020-8557/)を元に日本語に翻訳・再構成した内容となっております。

2020年7月15日 -- Kaizhe Huang

CVE-2020-8557

/etc/hostsファイルは、ポッドによってエフェメラルストレージ使用率を計算する際、kubeletevictionマネージャが含まれていないkubeletによってポッドに取り付けられています。ポッドが/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は、コンテナとKuberenetesのランタイム脅威検出用のCNCFオープンソースプロジェクトです。Falcoを使用して、ホストレベルとコンテナレベルの両方で悪意のあるアクティビティを検出できます。Falcoは、カスタマイズ可能な一連のルールによって定義される異常な動作を検出すると、セキュリティイベントを生成します。

Falcoの利点の1つは、強力で柔軟なルール言語を活用することです。一方、Falcoには、すぐに使える少数の検出ルールが付属しています。誰かがCVE 2020-8557を悪用しようとしていることを検出する方法を見てみましょう。

この脆弱性は/etc/hosts、kubeletによってポッドにマウントされたファイルが、kubelet evictionマネージャーに含まれていないためです。通常、メモリやディスクなどの非圧縮性コンピューティングリソースの消費がevictionのしきい値に達すると、kubelet evictionマネージャーはポッドのevictを開始して、ワーカーノードとノードで実行されている他のポッドの両方の可用性を維持します。一方、/etc/hostsはシステムにとって重要なファイルでもあります。マシンが起動すると、DNSを参照する前に、ホスト名とIPアドレスのマッピングを知る必要があります。このマッピングは、/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/

ご質問・お問い合わせはこちら

top