How to Bypass Falco

falco のルールは、そこそこ柔軟に書けるのだが、故にバイパスできてしまうよという話。 1. /proc/self/root を使う falco のデフォルトルールに /etc/shadow などが開かれたことを検知するルールがある。 https://github.com/falcosecurity/falco/blob/dev/rules/falco_rules.yaml#L1405 抜粋するとこういうルール。 - list: sensitive_file_names items: [/etc/shadow, /etc/sudoers, /etc/pam.conf, /etc/security/pwquality.conf] - macro: sensitive_files condition: > fd.name startswith /etc and (fd.name in (sensitive_file_names) or fd.directory in (/etc/sudoers.d, /etc/pam.d)) - rule: Read sensitive file untrusted desc: > an attempt to read any sensitive file (e.g. files containing user/password/authentication information). Exceptions are made for known trusted programs. condition: > sensitive_files and open_read and proc_name_exists これは fd.

cxray で falco のルールを生成する

以前 は BPF を使ってコンテナの中のイベントを取得する cxray を作った話を書いた。 cxray で現在取得できるイベントは次の4つ。 起動したプロセス 開かれたファイル TCPv4 での接続先 TCPv4 での network listener cxray のユースケースとして、生成されたイベントをホワイトリストとして定義し、別のモニタリングツールのルールなどに利用することを想定している。 ここではシンプルな Rails 環境を動かし、falco のルールを作るところまでやってみる。 環境 次のような docker-compose.yml を用意し、rails が起動するところまでのイベントを取得する。 version: "3" services: app: build: . ports: - "3000:3000" environment: - "DATABASE_HOST=db" - "DATABASE_PORT=5432" - "DATABASE_USER=postgres" - "DATABASE_PASSWORD=password" links: - db volumes: - "./:/app" stdin_open: true db: image: postgres:10.1 ports: - "5432:5432" environment: - "POSTGRES_USER=postgres" - "POSTGRES_PASSWORD=password" cxray を起動し、 docker-compose up する。

Profiling Event in Container With Cxray

前回は bcc を使ってコンテナ内の execve を取得する方法について書きました。 最近 falco などを使い、Kubernetes の Pod の安全性を高めているのですが、そのルールを定義するのが難しいと感じていました。 例えば NIST の Application Container Security Guide の 4.4.4 節では次のイベントが発生することを検知できるようにしたほうが良いと書かれています。 Invalid or unexpected process execution, Invalid or unexpected system calls, Changes to protected configuration files and binaries, Writes to unexpected locations and file types, Creation of unexpected network listeners, Traffic sent to unexpected network destinations, and Malware storage or execution. ref : https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-190.pdf 「期待していないプロセス」「期待していない通信先」などと言われても列挙するのは難しいと思います。 そこで、BPF を使って特定のシステムコールを取得すれば、ある程度ホワイトリスト化できるのではないかと思い、 cxray というツールを作りはじめました。