BPF – DECODE https://decode.red/blog data decode, decoder or decoded ... design of code Mon, 15 Dec 2025 06:15:00 +0000 ja hourly 1 https://wordpress.org/?v=4.7.29 ClamAV & BPF ../../../202303071588/ Tue, 07 Mar 2023 05:55:44 +0000 ../../../?p=1588 カーネルSysCallを使ったClamAV の On-Access Scanningについて、下記ClamAVの環境で試してみました。

ClamAV

参考)
「ClamAVで+(clamd、clamonacc)+fanotifyを用いたオンアクセススキャンの確認とテスト」
https://security.sios.jp/security/clamav-fanotify-onaccess-20210827/

カーネルのトレーシングもしたいので、下記で使用したiovisor/bccにある、libbpf-toolsのビルドをしました。

BPF Compiler Collection


環境) Ubuntu 22.04

その前に、結局使わなかったのですが、bpftoolというものをインストールしました。(この後の環境に影響があったかもしれないため明記しておきます)

$ uname -r
5.15.0-67-generic
$ sudo apt install linux-tools-common
$ sudo apt install linux-tools-5.15.0-67-generic

(元々は、5.15.0-60でしたが、最初のtools-commonのインストール後リブートで67に変わってしまいました)

参考)
https://valinux.hatenablog.com/entry/20220825

$ sudo apt install make gcc libelf-dev clang llvm
$ git clone https://github.com/iovisor/bcc.git
$ cd bcc
$ git submodule update –init –recursive
$ cd libbpf-tools

$ sudo apt install libc6-dev-i386 (asm/なしのため、デフォルトx64なのでありがち)

$ make

$ ls /usr/local/bin
$ sudo make install
INSTALL libbpf-tools
$ ls /usr/local/bin
bashreadline bitesize drsnoop fsdist klockstat numamove runqslower tcpconnect tcptracer
bindsnoop btrfsdist execsnoop fsslower ksnoop offcputime sigsnoop tcpconnlat vfsstat
biolatency btrfsslower exitsnoop funclatency llcstat oomkill slabratetop tcplife wakeuptime
biopattern cachestat ext4dist gethostlatency mdflush opensnoop softirqs tcprtt xfsdist
biosnoop capable ext4slower hardirqs mountsnoop readahead solisten tcpstates xfsslower
biostacks cpudist filelife javagc nfsdist runqlat statsnoop tcpsynbl
biotop cpufreq filetop killsnoop nfsslower runqlen syscount tcptop

$ make install

たくさんのツールがインストールされます。
この中のsyscountを使ってfanotifyシステムコールを確認します。ただこのままではカウントされたTop10しか表示しないため、syscount -lで表示される438のsyscall表示されるようにコードを変更しました。
syscount.c

static struct env {
        bool list_syscalls;
        bool milliseconds;
        bool failures;
        bool verbose;
        bool latency;
        bool process;
        int filter_errno;
        int interval;
        int duration;
        int top;
        pid_t pid;
        char *cgroupspath;
        bool cg;
} env = {
        .top = 438,
};

あと、fanotifyが使えるかどうかの確認です。

$ ls /proc/sys/fs/fanotify/
max_queued_events max_user_groups max_user_marks

次にメインのClamAVの設定です。(ClamAV関連で前回から追加のインストールはなし)
前回との違い

$ diff /etc/clamav/clamd.conf /etc/clamav/clamd.conf.org
10c10
< User root

> User clamav
88,94d87
< OnAccessIncludePath /home/n/clamav-test
< OnAccessPrevention yes
< OnAccessExtraScanning true
< OnAccessExcludeUID 0
< OnAccessExcludeUname root
< OnAccessIncludePath /home/n/clamav-test
<

設定変更後再起動

service clamav-daemon restart

オンアクセススキャンの実行(このまま常駐する。停止はkillコマンドでやった。)
clamonacc –config-file=/etc/clamav/clamd.conf –log=/var/log/clamav/clamonacc.log

ERROR: /var/log/clamav/freshclam.log is locked by another process
ERROR: Problem with internal logger (UpdateLogFile = /var/log/clamav/freshclam.log).

上のようなエラーがでる場合は、下のように対応。参考) https://forums.ubuntulinux.jp/viewtopic.php?pid=112770

sudo rm /var/log/clamav/freshclam.log
sudo freshclam

下記syscountを実行してから、上のようにclamonacc を実行し、CTL-Cで停止させると、fanotify_init を確認できます。

n@n0c:~/bcc/libbpf-tools$ sudo ./syscount (ソースを変更しているのでビルドディレクトリで実行)
Tracing syscalls, printing top 438… Ctrl+C to quit.
^C[04:39:32]
SYSCALL COUNT
mmap 216
close 78
rt_sigprocmask 72
mprotect 72
newfstatat 71
read 70
rt_sigaction 68
openat 60
write 29
futex 27
fcntl 26
ppoll 18
ioctl 18
clone3 14
poll 13
set_robust_list 10
fchdir 10
rseq 8
prctl 7
sendto 6
getpid 6
socket 6
clock_nanosleep 6
brk 5
epoll_wait 4
fanotify_mark 4
inotify_add_watch 4
wait4 4
clone 4
munmap 4
pread64 4
timerfd_settime 4
getdents64 4
getsockname 3
getpeername 3
connect 3
dup2 3
socketpair 3
recvmsg 3
getsockopt 3
pselect6 3
accept 3
shutdown 3
sendmsg 3
getrandom 2
arch_prctl 2
times 2
setpgid 2
umask 2
setsid 1
ftruncate 1
lseek 1
bpf 1
sysinfo 1
gettid 1
execve 1
fanotify_init 1
inotify_init1 1
pipe2 1
set_tid_address 1
access 1
prlimit64 1

最後に肝心のオンアクセススキャニングの確認です。
前回利用したテストウィルスファイルをcatコマンドでオープンすると、

$ cat eicar.com
cat: eicar.com: Operation not permitted

※表示をせずにブロックしています。

ログに表示されます。

$ tail -f /var/log/clamav/clamav.log /var/log/clamav/clamonacc.log

==> /var/log/clamav/clamav.log <== Tue Mar 7 04:44:08 2023 -> /home/n/clamav-test/eicar.com: Win.Test.EICAR_HDB-1(44d88612fea8a8f36de82e1278abb02f:68) FOUND

==> /var/log/clamav/clamonacc.log <== /home/n/clamav-test/eicar.com: Win.Test.EICAR_HDB-1 FOUND

このタイミングでは、syscallは確認できませんでした。

299: recvmmsg

300: fanotify_init
301: fanotify_mark
302: prlimit64
303: name_to_handle_at

意味を考えても、initとmarkなので、なんらかの設定をしたときに呼ばれるものなのでしょう。(syscount -lで出力)

このときclamav-testフォルダ以外のファイルや、rootユーザの場合は、検出しません。
今回インストールした/usr/local/binにあるopensnoopコマンドを使うと、その違いがあることが確認できます。

ClamAVとBPFどちらがメインの話かわらりづらくなりましたが、BPFはセキュリティに関してもよく使われるため、同時に抑えておく必要性を感じました。
(BPFという名前自体、バケットフィルタの略ですが、名前のまま理解すると過少評価してしまいます)

]]>
BPF Tracing Tools ../../../202302201582/ Mon, 20 Feb 2023 13:22:13 +0000 ../../../?p=1582 BPFの開発をするときに欠かせない、「bpftrace」というトレーシングツールを試してみました。

参考)
https://github.com/iovisor/bpftrace/blob/master/INSTALL.md#ubuntu
「BPFによるトレーシングが簡単にできる「bpftrace」の使い方」
https://atmarkit.itmedia.co.jp/ait/articles/2006/15/news016.html

環境) Ubuntu 20.04
インストール)

sudo apt install build-essential
sudo apt-get update
sudo apt-get install -y \
bison \
cmake \
flex \
g++ \
git \
libelf-dev \
zlib1g-dev \
libfl-dev \
systemtap-sdt-dev \
binutils-dev \
libcereal-dev \
llvm-12-dev \
llvm-12-runtime \
libclang-12-dev \
clang-12 \
libpcap-dev \
libgtest-dev \
libgmock-dev \
asciidoctor

git clone –recurse-submodules https://github.com/iovisor/bpftrace
cd bpftrace
mkdir build
cd build
../build-libs.sh
cmake ..
make
sudo make install

下記にインストールされる。

/usr/local/bin/bpftrace

実行例(rootユーザ)

root@n07:~# bpftrace -e ‘tracepoint:syscalls:sys_enter_openat{printf(“%s\n”,str(args->filename));}’
Attaching 1 probe…
/proc/interrupts
/proc/stat
/proc/irq/20/smp_affinity
/proc/irq/19/smp_affinity
/proc/irq/19/smp_affinity
/proc/irq/0/smp_affinity
/proc/irq/1/smp_affinity
/proc/irq/8/smp_affinity
/proc/irq/12/smp_affinity
/proc/irq/14/smp_affinity
/proc/irq/15/smp_affinity
/etc/ld.so.cache
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/locale/locale-archive
/var/log/syslog

上記は、ファイルオープンをトレースしています。(別コンソールで、syslogを開く)

またユーザ関数もトレースしてみました。

#include <stdio.h>

int myadd(int a, int b){
    return a + b;
}
int main(){
    printf("%d\n",myadd(1,2));
}

トレースする関数の確認

root@n07:~# cc -o bpftest bpftest.c
root@n07:~# readelf -s /root/bpftest | grep FUNC
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.2.5 (2)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
6: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.2.5 (2)
29: 0000000000001090 0 FUNC LOCAL DEFAULT 16 deregister_tm_clones
30: 00000000000010c0 0 FUNC LOCAL DEFAULT 16 register_tm_clones
31: 0000000000001100 0 FUNC LOCAL DEFAULT 16 __do_global_dtors_aux
34: 0000000000001140 0 FUNC LOCAL DEFAULT 16 frame_dummy
45: 0000000000001000 0 FUNC LOCAL DEFAULT 12 _init
46: 0000000000001210 5 FUNC GLOBAL DEFAULT 16 __libc_csu_fini
50: 0000000000001218 0 FUNC GLOBAL HIDDEN 17 _fini
51: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@@GLIBC_2.2.5
52: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
57: 0000000000001149 24 FUNC GLOBAL DEFAULT 16 myadd
58: 00000000000011a0 101 FUNC GLOBAL DEFAULT 16 __libc_csu_init
60: 0000000000001060 47 FUNC GLOBAL DEFAULT 16 _start
62: 0000000000001161 49 FUNC GLOBAL DEFAULT 16 main
65: 0000000000000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.2

トレースの実行後、別コンソールで”/root/bpftest”の実行

root@n07:~# bpftrace -e ‘uprobe:/root/bpftest:myadd{printf(“%d, %d\n”, arg0, arg1);}’
Attaching 1 probe…
1, 2

root@n07:~# /root/bpftest
3

また、数々のツールが用意されています。
https://github.com/iovisor/bpftrace/tree/master/tools

下記にインストールされているのでrootユーザでパスを通しておきます。

/usr/local/share/bpftrace/tools

root@n07:~# execsnoop.bt
Attaching 3 probes…
TIME(ms) PID ARGS
8496 17036 ls –color=auto
34839 17041 cat /var/log/syslog

上記は、プロセスのトレースで、別コンソールで”ls”と”cat /var/log/syslog”を実行しました。

*.btは専用の言語でかかれており、そのまま実行できます。このあたり構文解析に必要なbisonやflexがインストールされた理由でしょう。

execsnoop.bt

#!/usr/bin/env bpftrace
BEGIN
{
	printf("%-10s %-5s %s\n", "TIME(ms)", "PID", "ARGS");
}
tracepoint:syscalls:sys_enter_exec*
{
	printf("%-10u %-5d ", elapsed / 1e6, pid);
	join(args->argv);
}

かなり整備されているツールという印象を受けました。
次は内容について深堀していきたいです。

]]>
Berkeley Packet Filter ../../../202302181573/ Sat, 18 Feb 2023 10:06:25 +0000 ../../../?p=1573 BPF(Berkeley Packet Filter)の話題は下記に続いてですが、カーネルプログラムのことなので、本当はこちらを先にやるべきでしたが、後追いでテストしてみました。(環境は下記と同じ)

「BPF Compiler Collection」

BPF Compiler Collection

参考)
「BPFによるパケットトレース――C言語によるBPFプログラムの作り方、使い方」
https://atmarkit.itmedia.co.jp/ait/articles/1911/05/news010.html

ここで紹介されているのはカーネルにあるBPFりサンプルプログラムなので、自分の環境で動かすことはBPF以外でも使えますのでやっておく意義があります。

https://github.com/torvalds/linux/blob/v5.3/samples/bpf/sockex1_user.c
紹介されているコードは、上記カーネルの一部なので、ダウンロードしてきてビルドを試しましたが、ソースのパッケージとしてダウンロードしたものを利用した方がよいようです。

uname -r

4.15.0-202-generic

sudo apt install linux-source-4.15.0

バージョンにあったものをインストールしました。

cd /usr/src/linux-source-4.15.0/linux-source-4.15.0

sudo make olddefconfig
sudo make headers_install

sudo apt install libssl-dev
sudo apt install netperf

sudo make samples/bpf/

makeで、test_attr__openが未定義でエラーになるので、下記を参考に無効化しました。
https://github.com/bpftools/linux-observability-with-bpf/issues/46
https://lore.kernel.org/all/157111750919.12254.12122425573168365300.tip-bot2@tip-bot2/T/

tools/perf/perf-sys.h

sys_perf_event_open(struct perf_event_attr *attr,
pid_t pid, int cpu, int group_fd,
unsigned long flags)
{
int fd;

fd = syscall(__NR_perf_event_open, attr, pid, cpu,
group_fd, flags);

#undef HAVE_ATTR_TEST

#ifdef HAVE_ATTR_TEST
if (unlikely(test_attr__enabled))
test_attr__open(attr, pid, cpu, fd, group_fd, flags);
#endif
return fd;
}

対象ファイル
/usr/src/linux-source-4.15.0/linux-source-4.15.0/samples/bpf/sockex1_user.c

// SPDX-License-Identifier: GPL-2.0
#include <stdio.h>
#include <assert.h>
#include <linux/bpf.h>
#include "libbpf.h"
#include "bpf_load.h"
#include "sock_example.h"
#include <unistd.h>
#include <arpa/inet.h>

#include <sys/resource.h>

int main(int ac, char **argv)

{
        struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};

        char filename[256];
        //FILE *f;
        int i, sock;

        snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
        setrlimit(RLIMIT_MEMLOCK, &r);

        if (load_bpf_file(filename)) {
                printf("%s", bpf_log_buf);
                return 1;
        }

        sock = open_raw_sock("lo");
        assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd,
                          sizeof(prog_fd[0])) == 0);

        //f = popen("ping -4 -c5 localhost", "r");
        //(void) f;

        for (i = 0; i < 30; i++) {
                long long tcp_cnt, udp_cnt, icmp_cnt;
                int key;

                key = IPPROTO_TCP;
                assert(bpf_map_lookup_elem(map_fd[0], &key, &tcp_cnt) == 0);

                key = IPPROTO_UDP;
                assert(bpf_map_lookup_elem(map_fd[0], &key, &udp_cnt) == 0);

                key = IPPROTO_ICMP;
                assert(bpf_map_lookup_elem(map_fd[0], &key, &icmp_cnt) == 0);

                printf("TCP %lld UDP %lld ICMP %lld bytes\n",
                       tcp_cnt, udp_cnt, icmp_cnt);
                sleep(1);
        }

        return 0;
}

実行(カレントディレクトリ: /usr/src/linux-source-4.15.0/linux-source-4.15.0/samples/bpf/)

sudo ./sockex1

変更部分
実行すると下記エラーがでたことから、sockex2_user.cを参考に、setrlimit部分を追加しました。
また、pingの接続は外部コマンドで実行したのでコメント、そして監視時間を30秒の伸ばしました。

failed to create map ‘Operation not permitted’

sockex1_user.cは、下記コードとセットになって動作します。(sockex1_kern.oをロードしている)
sockex1_kern.c

#include <uapi/linux/bpf.h>
#include <uapi/linux/if_ether.h>
#include <uapi/linux/if_packet.h>
#include <uapi/linux/ip.h>
#include "bpf_helpers.h"

struct bpf_map_def SEC("maps") my_map = {
        .type = BPF_MAP_TYPE_ARRAY,
        .key_size = sizeof(u32),
        .value_size = sizeof(long),
        .max_entries = 256,
};

SEC("socket1")
int bpf_prog1(struct __sk_buff *skb)
{
        int index = load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol));
        long *value;

        if (skb->pkt_type != PACKET_OUTGOING)
                return 0;

        value = bpf_map_lookup_elem(&my_map, &index);
        if (value)
                __sync_fetch_and_add(value, skb->len);

        return 0;
}
char _license[] SEC("license") = "GPL";

実行画面

上記実行後、別コンソールでUDP通信(下記)、PING通信(ping localhost)と続いてやりました。

nc -u -l -p 9999

別コンソールで

nc -u localhost 9999

TCP通信は、内部で動作しているサーバやSSH接続によるものと思われます。

ここまで動作確認できました。

]]>
BPF Compiler Collection ../../../202302031560/ Fri, 03 Feb 2023 13:22:40 +0000 ../../../?p=1560 eBPF(extended Berkekey Packet Filter)という機能を利用したカーネルトレースや操作プログラムを作成するためのツールキット、BCCを試してみました。
OSには、通常のプログラミングが動作するユーザモードと特権をもつプログラムを実行するカーネルモードがあり、BCCを使うとBPFの仕組みを使ってカーネルモードのプログラムをカーネルのコードをビルドすることなく実行できるようです。
Pythonコードの中にC言語のコードを書き、それをコンパイルして実行するようですが、printk関数をはさんでデバッグしていたころに比べてかなり便利な設計になったていると感じました。

参考)
https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu—binary
https://github.com/iovisor/bcc/blob/master/examples/tracing/hello_fields.py
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0690

環境)

$ uname -r
4.15.0-202-generic
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.6 LTS (Bionic Beaver)”
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME=”Ubuntu 18.04.6 LTS”
VERSION_ID=”18.04″
HOME_URL=”https://www.ubuntu.com/”
SUPPORT_URL=”https://help.ubuntu.com/”
BUG_REPORT_URL=”https://bugs.launchpad.net/ubuntu/”
PRIVACY_POLICY_URL=”https://www.ubuntu.com/legal/terms-and-policies/privacy-policy”
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
$ grep BPF /boot/config-uname -r
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NET_CLS_BPF=m
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_TEST_BPF=m
$ python -V
Python 2.7.17

インストール)

$ sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 4052245BD4284CDD
$ echo “deb https://repo.iovisor.org/apt/$(lsb_release -cs) $(lsb_release -cs) main” | sudo tee /etc/apt/sources.list.d/iovisor.list
$ sudo apt-get update
$ sudo apt-get install bcc-tools libbcc-examples linux-headers-$(uname -r)

hello.py

from bcc import BPF
from bcc.utils import printb
import pprint

# define BPF program
prog = """
#include <linux/sched.h>

int hello(void *ctx) {
    char comm[TASK_COMM_LEN];
    bpf_get_current_comm(&comm, sizeof(comm));
    bpf_trace_printk("Hello!: %s\\n", comm);
    return 0;
}
"""

# load BPF program
b = BPF(text=prog)
b.attach_kprobe(event=b.get_syscall_fnname("clone"), fn_name="hello")

pprint.pprint(dir(b))
pprint.pprint(vars(b))

# header
print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "MESSAGE"))

# format output
while 1:
    try:
        (task, pid, cpu, flags, ts, msg) = b.trace_fields()
    except ValueError:
        continue
    except KeyboardInterrupt:
        exit()
    printb(b"%-18.9f %-16s %-6d %s /%s %d" % (ts, task, pid, msg, flags, cpu))

プロセスがcloneされたときに呼び出される処理が書かれています。オリジナルから、bオブジェクトの情報表示と、明示的なタスク、追加項目の表示を加えています。
また以下、exampleにあるhello_work.pyには、”イベント名__関数名”でカーネル内部の任意の関数をフックできるしくみで書かれていますが、ここではget_syscall_fnname(“clone”)という形でかかれています。

BPF(text='int kprobe__sys_clone(void *ctx) { bpf_trace_printk("Hello, World!\\n"); return 0; }').trace_print()

プログラムを起動した後、別コンソールでlsコマンド、curlコマンドを実行してみました。

実行結果

$ sudo python hello.py
[‘CGROUP_DEVICE’,
‘CGROUP_SKB’,
‘CGROUP_SOCK’,
‘CGROUP_SOCK_ADDR’,
‘CLOCK_MONOTONIC’,
‘Function’,
‘KPROBE’,
‘LWT_IN’,
‘LWT_OUT’,
‘LWT_XMIT’,
‘PERF_EVENT’,
‘RAW_TRACEPOINT’,
‘SCHED_ACT’,
‘SCHED_CLS’,
‘SK_MSG’,
‘SK_SKB’,
‘SOCKET_FILTER’,
‘SOCK_OPS’,
‘TRACEPOINT’,
‘Table’,
‘XDP’,
‘XDP_ABORTED’,
‘XDP_DROP’,
‘XDP_PASS’,
‘XDP_REDIRECT’,
‘XDP_TX’,
‘__class__’,
‘__delattr__’,
‘__delitem__’,
‘__dict__’,
‘__doc__’,
‘__enter__’,
‘__exit__’,
‘__format__’,
‘__getattribute__’,
‘__getitem__’,
‘__hash__’,
‘__init__’,
‘__iter__’,
‘__len__’,
‘__module__’,
‘__new__’,
‘__reduce__’,
‘__reduce_ex__’,
‘__repr__’,
‘__setattr__’,
‘__setitem__’,
‘__sizeof__’,
‘__str__’,
‘__subclasshook__’,
‘__weakref__’,
‘_add_kprobe_fd’,
‘_add_uprobe_fd’,
‘_attach_perf_event’,
‘_auto_includes’,
‘_bsymcache’,
‘_check_path_symbol’,
‘_check_probe_quota’,
‘_clock_gettime’,
‘_decode_table_type’,
‘_del_kprobe_fd’,
‘_del_uprobe_fd’,
‘_find_file’,
‘_get_uprobe_evname’,
‘_librt’,
‘_probe_repl’,
‘_sym_cache’,
‘_sym_caches’,
‘_syscall_prefixes’,
‘_trace_autoload’,
‘add_module’,
‘attach_kprobe’,
‘attach_kretprobe’,
‘attach_perf_event’,
‘attach_raw_socket’,
‘attach_raw_tracepoint’,
‘attach_tracepoint’,
‘attach_uprobe’,
‘attach_uretprobe’,
‘attach_xdp’,
‘cleanup’,
‘debug’,
‘decode_table’,
‘detach_kprobe’,
‘detach_kprobe_event’,
‘detach_kretprobe’,
‘detach_perf_event’,
‘detach_raw_tracepoint’,
‘detach_tracepoint’,
‘detach_uprobe’,
‘detach_uprobe_event’,
‘detach_uretprobe’,
‘disassemble_func’,
‘donothing’,
‘dump_func’,
‘find_exe’,
‘find_library’,
‘fix_syscall_fnname’,
‘free_bcc_memory’,
‘funcs’,
‘generate_auto_includes’,
‘get_kprobe_functions’,
‘get_syscall_fnname’,
‘get_syscall_prefix’,
‘get_table’,
‘get_tracepoints’,
‘get_user_addresses’,
‘get_user_functions’,
‘get_user_functions_and_addresses’,
‘kprobe_fds’,
‘kprobe_poll’,
‘ksym’,
‘ksymname’,
‘load_func’,
‘load_funcs’,
‘module’,
‘monotonic_time’,
‘num_open_kprobes’,
‘num_open_tracepoints’,
‘num_open_uprobes’,
‘open_perf_events’,
‘perf_buffer_poll’,
‘perf_buffers’,
‘raw_tracepoint_fds’,
‘remove_xdp’,
‘str2ctype’,
‘support_raw_tracepoint’,
‘sym’,
‘tables’,
‘timespec’,
‘trace_fields’,
‘trace_open’,
‘trace_print’,
‘trace_readline’,
‘tracefile’,
‘tracepoint_exists’,
‘tracepoint_fds’,
‘uprobe_fds’]
{‘debug’: 0,
‘funcs’: {‘hello’: },
‘kprobe_fds’: {‘p_sys_clone’: 4},
‘module’: 94590567723712,
‘open_perf_events’: {},
‘perf_buffers’: {},
‘raw_tracepoint_fds’: {},
‘tables’: {},
‘tracefile’: None,
‘tracepoint_fds’: {},
‘uprobe_fds’: {}}
TIME(s) COMM PID MESSAGE
3859.149581000 bash 1827 Hello!: bash /…. 0
3861.768011000 bash 1827 Hello!: bash /…. 0
3861.773422000 curl 3930 Hello!: curl /…. 1
3865.956510000 bash 1827 Hello!: bash /…. 0
3865.962982000 curl 3932 Hello!: curl /…. 1

eBPFは、クラウドサービスでよく使われるコンテナ中通信(CNI:Container Network Interface)を実現するCiliumで使われているようです。
「CNIのCiliumについて調べてみた」
https://blog.framinal.life/entry/2021/02/20/222728
このあたり、また掘り下げて調べたいと思っています。

]]>