ClamAV & BPF

カーネル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

あと、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という名前自体、バケットフィルタの略ですが、名前のまま理解すると過少評価してしまいます)

About

Categories: 未分類 タグ: ,