Falco Ruleを紹介するシリーズ - Unexpected outbound connection destination

本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「Unexpected outbound connection destination」</b>です。
# Rule記述
```
- rule: Unexpected outbound connection destination
  desc: Detect any outbound connection to a destination outside of an allowed set of ips, networks, or domain names
  condition: >
    outbound and not
    ((fd.sip in (allowed_outbound_destination_ipaddrs)) or
     (fd.snet in (allowed_outbound_destination_networks)) or
     (fd.sip.name in (allowed_outbound_destination_domains)))
  enabled: false
  output: Disallowed outbound connection destination (command=%proc.cmdline connection=%fd.name user=%user.name user_loginuid=%user.loginuid container_id=%container.id image=%container.image.repository)
  priority: NOTICE
  tags: [network]
```
# Rule概要
予期しない宛先に対するアウトバウンド接続を検知します。
マルウェアや侵入した攻撃者は、外部のサーバに対して疑わしい接続や悪意のあるバイナリのダウンロードを実行することがあります。
たとえば、<a href=https://sysdig.jp/blog/tsunami-malware-jenkins-weblogic/ target=new>こちらのブログ記事</a>で紹介しているTsunamiマルウェアは、攻撃者が感染したシステムを完全に制御できるようにするバックドアで、一度感染するとIRCサーバーと通信し、新しいコマンドの実行を待ちます。
あらかじめ許可された接続先以外に対するアウトバンド接続が行われた場合には、このRuleを使うことで検知可能です。

# Condition（条件）
`outbound and`
アウトバウンド接続で、

かつ

`not ((fd.sip in (allowed_outbound_destination_ipaddrs)) or`
サーバーIPアドレスが許可された宛先IPアドレスではない、もしくは

`(fd.snet in (allowed_outbound_destination_networks)) or`
サーバーIPネットワークが許可された宛先IPネットワークではない、もしくは

`(fd.sip.name in (allowed_outbound_destination_domains))`
ドメイン名が許可された宛先ドメイン名ではない場合

---

outboundマクロの内容は以下となります。
```
- macro: outbound
  condition: >
    (((evt.type = connect and evt.dir=<) or
      (evt.type in (sendto,sendmsg) and evt.dir=< and
       fd.l4proto != tcp and fd.connected=false and fd.name_changed=true)) and
     (fd.typechar = 4 or fd.typechar = 6) and
     (fd.ip != "0.0.0.0" and fd.net != "127.0.0.0/8" and not fd.snet in (rfc_1918_addresses)) and
     (evt.rawres >= 0 or evt.res = EINPROGRESS))
```
`(evt.type = connect and evt.dir=<) or`
イベント名がconnectのexitイベント、もしくは

`(evt.type in (sendto,sendmsg) and evt.dir=< and`
イベント名がsendto、sendmsdgのどちらかのexitイベントで、

`fd.l4proto != tcp and fd.connected=false and fd.name_changed=true)) and`
プロトコルがTCPではなく、ソケットが接続済みではなく、イベントがファイルディスクリプタ名を変更する場合で（UDP接続の場合など）、

`(fd.typechar = 4 or fd.typechar = 6)) and`
ファイルディスクリプタがIPv4もしくはIPv6ソケットで、

`(fd.ip != "0.0.0.0" and fd.net != "127.0.0.0/8" and not fd.snet in (rfc_1918_addresses)) and`
IPアドレスが"0.0.0.0"ではなく、IPネットワークが"127.0.0.0/8"ではなく、サーバーIPネットワークがRFC 1918のアドレス（プライベートアドレス）でもなく、

`(evt.rawres >= 0 or evt.res = EINPROGRESS)`
イベントが成功もしくは進行中の場合

---

サンプルとしての、デフォルトのリストの内容は以下となります。

```
- list: allowed_outbound_destination_ipaddrs
  items: ['"127.0.0.1"', '"8.8.8.8"']

- list: allowed_outbound_destination_networks
  items: ['"127.0.0.1/8"']

- list: allowed_outbound_destination_domains
  items: [google.com, www.yahoo.com]
```

# Output（出力）
許可されていない宛先に対するアウトバンド接続

`%proc.cmdline`
コマンドライン

`%fd.name`
接続名

`%user.name`
ユーザー名

`%user.loginuid`
ユーザーのログインUID

`%container.id`
コンテナID

`%container.image.repository`
コンテナイメージリポジトリ