鳩小屋

落書き帳

Tracee:コンテナトレーサ

今回のテーマはAqua社が主導するコンテナトレーサ:traceeです。
システムコールフックのeBPFを利用していることからsysdig社Falcoが類似ツールだと思います。
aquasecurity.github.io

インストール

#eBPFモジュールのビルド
$ git clone --recursive https://github.com/aquasecurity/tracee.git
$ cd tracee
$ make bpf
$ ls
tracee.bpf.5_11_0-25-generic.v0_6_0-7-g26a9eb2.o  tracee.bpf.core.o

eBPFモジュールをマウントしてtraceeコンテナを起動します。

# docker run --privileged -it -v /path/in/host/tracee.bpf.5_11_0-25-generic.v0_6_0-7-g26a9eb2.o:/path/in/container/tracee.bpf.o -e TRACEE_BPF_FILE=/path/in/container/tracee.bpf.o aquasec/tracee
Loaded signature(s):  [TRC-1 TRC-2 TRC-3 TRC-4 TRC-5 TRC-6 TRC-7]

7つのシグネチャがロードされたみたいですが、特に何も出力されません。

動作確認

シグネチャ機能は鋭意作成中とのことです。
現状のシグネチャにはアンチデバッグやコードインジェクションなど、マルウェアチックな挙動が並んでいます。

シグネチャ機能

We are currently working on creating a library of behavioral signature detections. Currently, the following are available:

Name Description
Standard Input/Output Over Socket Redirection of process's standard input/output to socket
Anti-Debugging Process uses anti-debugging technique to block debugger
Code injection Possible code injection into another process
Dynamic Code Loading Writing to executable allocated memory region
Fileless Execution Executing a process from memory, without a file in the disk
kernel module loading Attempt to load a kernel module detection
LD_PRELOAD Usage of LD_PRELOAD to allow hooks on process

今回はアンチデバッグ検出機能を確認してみます。

#適当なコンテナを起動します。
$ sudo docker run --rm -it ubuntu
root@d23f0851e601:/#

#デバッグ検出プログラムの用意
$ nano antidebug.c
#include <stdio.h>
#include <sys/ptrace.h>

int main()
{
        if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) {
                printf("Debugging Dedected , Fuck You !\n");
                return 1;
        }
        printf("Normal Execution\n");
        return 0;
}

$gcc antidebug.c

# デバッグ検出プログラムをコンテナに配置
$docker cp a.out d23f0851e601:/a.out

#コンテナでデバッグ検出プログラムを実行
root@d23f0851e601:/# ./a.out 
Normal Execution

コンテナでデバッグ検出プログラムを実行すると、traceeコンテナのコンソールでAnti-Debuggingのアラートが出力されました。
おー動いた。

# docker run --privileged -it -v /path/in/host/tracee.bpf.5_11_0-25-generic.v0_6_0-7-g26a9eb2.o:/path/in/container/tracee.bpf.o -e TRACEE_BPF_FILE=/path/in/container/tracee.bpf.o aquasec/tracee
Loaded signature(s):  [TRC-1 TRC-2 TRC-3 TRC-4 TRC-5 TRC-6 TRC-7]

Detection
Time: 2021-08-08T12:52:30Z
Signature ID: TRC-2
Signature: Anti-Debugging
Data: map[]
Command: a.out
Hostname: d23f0851e601

シグネチャはRego言語で書かれている?ようです。
MITRE ATT&CKの記載もあるので、実装方針はfalcoと似ているのでしょうか。

package tracee.TRC_2

__rego_metadoc__ := {
    "id": "TRC-2",
    "version": "0.1.0",
    "name": "Anti-Debugging",
    "description": "Process uses anti-debugging technique to block debugger",
    "tags": ["linux", "container"],
    "properties": {
        "Severity": 3,
        "MITRE ATT&CK": "Defense Evasion: Execution Guardrails",
    }
}

tracee_selected_events[eventSelector] {
	eventSelector := {
		"source": "tracee",
		"name": "ptrace"
	}
}

tracee_match {
    input.eventName == "ptrace"
    arg := input.args[_]
    arg.name == "request"
    arg.value == "PTRACE_TRACEME"
}

トレース機能

traceサブコマンド実行するシステムコールトレースっぽいログが出力されます。
フォレンジックあたりで使えそうです。
Traceeという名前からトレース機能がメインと思われますが、今後シグネチャが充実すればEDRツールとしても期待できそうです。

# docker run --privileged -it -v /path/in/host/tracee.bpf.123.o:/path/in/container/tracee.bpf.o -e TRACEE_BPF_FILE=/path/in/container/tracee.bpf.o aquasec/tracee trace
TIME             UID    COMM             PID     TID     RET              EVENT                ARGS
...
13:36:50:056945  1000   dbus-daemon      1835    1835    0                close                fd: 9
13:36:50:059291  1000   snap-store       2279    2279    0                security_file_open   pathname: /usr/share/zoneinfo/Japan, flags: O_RDONLY|O_LARGEFILE, dev: 7340033, inode: 9322
13:36:50:059272  1000   snap-store       2279    2279    16               openat               dirfd: -100, pathname: /etc/localtime, flags: O_RDONLY, mode: 0
13:36:50:059416  1000   snap-store       2279    2279    0                fstat                fd: 16, statbuf: 0x7FFFBE8FF1D0
13:36:50:059466  1000   snap-store       2279    2279    0                close                fd: 16
13:36:50:059629  1000   snap-store       2279    2279    0                security_file_open   pathname: /usr/share/zoneinfo/Japan, flags: O_RDONLY|O_LARGEFILE, dev: 7340033, inode: 9322
13:36:50:059617  1000   snap-store       2279    2279    16               openat               dirfd: -100, pathname: /etc/localtime, flags: O_RDONLY, mode: 0
13:36:50:059712  1000   snap-store       2279    2279    0                fstat                fd: 16, statbuf: 0x7FFFBE8FF1D0
13:36:50:059746  1000   snap-store       2279    2279    0                close                fd: 16
13:36:50:106080  118    pool-whoopsie    838     8281    0                security_file_open   pathname: /etc/services, flags: O_RDONLY|O_LARGEFILE, dev: 8388611, inode: 1704147
13:36:50:106070  118    pool-whoopsie    838     8281    11               openat               dirfd: -100, pathname: /etc/services, flags: O_RDONLY|O_CLOEXEC, mode: 0
13:36:50:106162  118    pool-whoopsie    838     8281    0                close                fd: 11
13:36:50:106192  118    pool-whoopsie    838     8281    0                security_file_open   pathname: /etc/services, flags: O_RDONLY|O_LARGEFILE, dev: 8388611, inode: 1704147
13:36:50:106187  118    pool-whoopsie    838     8281    11               openat               dirfd: -100, pathname: /etc/services, flags: O_RDONLY|O_CLOEXEC, mode: 0
13:36:50:106238  118    pool-whoopsie    838     8281    0                close                fd: 11
13:36:50:106402  118    pool-whoopsie    838     8281    0                security_socket_create family: AF_NETLINK, type: SOCK_RAW, protocol: 0, kern: 0
13:36:50:106398  118    pool-whoopsie    838     8281    11               socket               domain: AF_NETLINK, type: SOCK_RAW|SOCK_CLOEXEC, protocol: 0
13:36:50:106429  118    pool-whoopsie    838     8281    0                bind                 sockfd: 11, addr: {'sa_family': 'AF_NETLINK'}, addrlen: 12
13:36:50:106465  118    pool-whoopsie    838     8281    0                getsockname          sockfd: 11, addr: {'sa_family': 'AF_NETLINK'}, addrlen: 0x7F9770D5A3D4
13:36:50:106538  118    pool-whoopsie    838     8281    0                close                fd: 11
13:36:50:106577  118    pool-whoopsie    838     8281    0                security_file_open   pathname: /etc/hosts, flags: O_RDONLY|O_LARGEFILE, dev: 8388611, inode: 1704099
13:36:50:106572  118    pool-whoopsie    838     8281    11               openat               dirfd: -100, pathname: /etc/hosts, flags: O_RDONLY|O_CLOEXEC, mode: 0
13:36:50:106632  118    pool-whoopsie    838     8281    0                close                fd: 11
13:36:50:106668  118    pool-whoopsie    838     8281    0                security_socket_create family: AF_INET, type: SOCK_DGRAM, protocol: 0, kern: 0
13:36:50:106665  118    pool-whoopsie    838     8281    11               socket               domain: AF_INET, type: SOCK_DGRAM|SOCK_NONBLOCK|SOCK_CLOEXEC, protocol: 0
13:36:50:106707  118    pool-whoopsie    838     8281    0                security_socket_connect sockfd: 11, remote_addr: {'sa_family': 'AF_INET','sin_port': '53','sin_addr': '127.0.0.53'}
13:36:50:106702  118    pool-whoopsie    838     8281    0                connect              sockfd: 11, addr: {'sa_family': 'AF_INET','sin_port': '53','sin_addr': '127.0.0.53'}, addrlen: 16
13:36:50:107084  101    systemd-resolve  592     592     0                security_socket_create family: AF_INET, type: SOCK_DGRAM, protocol: 0, kern: 0
13:36:50:107081  101    systemd-resolve  592     592     16               socket               domain: AF_INET, type: SOCK_DGRAM|SOCK_NONBLOCK|SOCK_CLOEXEC, protocol: 0
13:36:50:107142  101    systemd-resolve  592     592     0                security_socket_connect sockfd: 16, remote_addr: {'sin_addr': '192.168.11.1','sa_family': 'AF_INET','sin_port': '53'}
13:36:50:107138  101    systemd-resolve  592     592     0                connect              sockfd: 16, addr: {'sa_family': 'AF_INET','sin_port': '53','sin_addr': '192.168.11.1'}, addrlen: 16
13:36:50:138031  101    systemd-resolve  592     592     0                close                fd: 16
13:36:50:138165  118    pool-whoopsie    838     8281    0                close                fd: 11
13:36:50:138236  118    pool-whoopsie    838     8281    0                security_socket_create family: AF_INET, type: SOCK_DGRAM, protocol: 0, kern: 0
13:36:50:138200  118    pool-whoopsie    838     8281    11               socket               domain: AF_INET, type: SOCK_DGRAM|SOCK_CLOEXEC, protocol: 0
13:36:50:138273  118    pool-whoopsie    838     8281    0                security_socket_connect sockfd: 11, remote_addr: {'sin_addr': '162.213.33.108','sa_family': 'AF_INET','sin_port': '0'}
13:36:50:138268  118    pool-whoopsie    838     8281    0                connect              sockfd: 11, addr: {'sa_family': 'AF_INET','sin_port': '0','sin_addr': '162.213.33.108'}, addrlen: 16
13:36:50:138301  118    pool-whoopsie    838     8281    0                getsockname          sockfd: 11, addr: {'sa_family': 'AF_INET','sin_port': '35285','sin_addr': '10.0.2.15'}, addrlen: 0x7F9770D5A540
13:36:50:138317  118    pool-whoopsie    838     8281    0                connect              sockfd: 11, addr: {'sa_family': 'AF_UNSPEC'}, addrlen: 16
13:36:50:138334  118    pool-whoopsie    838     8281    0                security_socket_connect sockfd: 11, remote_addr: {'sa_family': 'AF_INET','sin_port': '0','sin_addr': '162.213.33.132'}
13:36:50:138330  118    pool-whoopsie    838     8281    0                connect              sockfd: 11, addr: {'sin_addr': '162.213.33.132','sa_family': 'AF_INET','sin_port': '0'}, addrlen: 16
13:36:50:138349  118    pool-whoopsie    838     8281    0                getsockname          sockfd: 11, addr: {'sa_family': 'AF_INET','sin_port': '57882','sin_addr': '10.0.2.15'}, addrlen: 0x7F9770D5A540
13:36:50:138371  118    pool-whoopsie    838     8281    0                close                fd: 11
13:36:50:181517  1000   gnome-shell      1982    1982    0                cap_capable          cap: CAP_SYS_ADMIN
13:36:50:181618  1000   gnome-shell      1982    1982    0                cap_capable          cap: CAP_SYS_ADMIN
13:36:50:181730  1000   gnome-shell      1982    1982    0                cap_capable          cap: CAP_SYS_ADMIN
13:36:50:181908  1000   gnome-shell      1982    1982    0                cap_capable          cap: CAP_SYS_ADMIN