ClamAV – 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 YARA / ClamAV ../../../202310011706/ Sun, 01 Oct 2023 01:46:03 +0000 ../../../?p=1706 YARAと呼ばれるオープンソースのマルウェアを検知・解析・分類するための仕組みが、ClamAVでも使用できることを知り試してみました。

参考)
https://security.sios.jp/vulnerability/antivirus-security-20151215/
https://qiita.com/suzuki-kei/items/5a2f2dff9130c878c586

環境)

ClamAV & BPF

まず今回使用するルールファイルを作成しました。
特定の文字列をもつテキストファイル判定することを目的としています。

sample_txt.yara

rule sample_txt {
strings:
        $my_text="mal"
condition:
        $my_text
}

特定のバイト列を持つバイナリファイル判定することを目的としています。
sample_bin.yara

rule sample_bin {
strings:
        $my_hex={ 03 04 }
condition:
        $my_hex
}

sample_bin2.yara

rule sample_bin {
strings:
        $my_hex={ 04 03 }
condition:
        $my_hex
}

sample_bin3.yara

rule sample_bin {
strings:
        $my_hex={ 01 02 [2-4] 05 06 }
condition:
        $my_hex
}

sample_bin4.yara

rule sample_bin {
strings:
        $my_hex={ 01 02 [2-4] 05 07 }
condition:
        $my_hex
}

バイナリは、エンディアンによる判定やバイトスキップの確認をできるようにしています。

次にテストに使うファイルです。

n@n0c:~/yana-test$ cat sample.txt
This file is malware.
n@n0c:~/yana-test$ cat sample2.txt
This file is text.
n@n0c:~/yana-test$ od -x sample.bin
0000000 0201 0403 0605 0807
0000010

テキストファイルの検知したときと、しなかったときの実行結果
(UNOFFICIAL FOUND:検知した場合)

n@n0c:~/yana-test$ clamscan –database=sample_txt.yara sample.txt
/home/n/yana-test/sample.txt: YARA.sample_txt.UNOFFICIAL FOUND

———– SCAN SUMMARY ———–
Known viruses: 1
Engine version: 0.103.9
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 0.006 sec (0 m 0 s)
Start Date: 2023:09:29 23:57:17
End Date: 2023:09:29 23:57:17
n@n0c:~/yana-test$ clamscan –database=sample_txt.yara sample2.txt
/home/n/yana-test/sample2.txt: OK

———– SCAN SUMMARY ———–
Known viruses: 1
Engine version: 0.103.9
Scanned directories: 0
Scanned files: 1
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 0.006 sec (0 m 0 s)
Start Date: 2023:09:29 23:57:47
End Date: 2023:09:29 23:57:47

バイナリファイルは一つで、複数複数のルールでテスト
実行結果

n@n0c:~/yana-test$ clamscan –database=sample_bin.yara sample.bin
/home/n/yana-test/sample.bin: YARA.sample_bin.UNOFFICIAL FOUND

———– SCAN SUMMARY ———–
Known viruses: 1
Engine version: 0.103.9
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 0.005 sec (0 m 0 s)
Start Date: 2023:09:30 00:01:33
End Date: 2023:09:30 00:01:33
n@n0c:~/yana-test$ clamscan –database=sample_bin2.yara sample.bin
/home/n/yana-test/sample.bin: OK

———– SCAN SUMMARY ———–
Known viruses: 1
Engine version: 0.103.9
Scanned directories: 0
Scanned files: 1
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 0.007 sec (0 m 0 s)
Start Date: 2023:09:30 00:01:45
End Date: 2023:09:30 00:01:45
n@n0c:~/yana-test$ clamscan –database=sample_bin3.yara sample.bin
/home/n/yana-test/sample.bin: YARA.sample_bin.UNOFFICIAL FOUND

———– SCAN SUMMARY ———–
Known viruses: 1
Engine version: 0.103.9
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 0.004 sec (0 m 0 s)
Start Date: 2023:09:30 00:01:54
End Date: 2023:09:30 00:01:54
n@n0c:~/yana-test$ clamscan –database=sample_bin4.yara sample.bin
/home/n/yana-test/sample.bin: OK

———– SCAN SUMMARY ———–
Known viruses: 1
Engine version: 0.103.9
Scanned directories: 0
Scanned files: 1
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 0.004 sec (0 m 0 s)
Start Date: 2023:09:30 00:02:03
End Date: 2023:09:30 00:02:03

メモでした。

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

]]>
ClamAV ../../../202302141567/ Tue, 14 Feb 2023 13:20:51 +0000 ../../../?p=1567 Linuxで動作するアンチウィルスソフトを試してみました。

参考)
「Linux向けウィルス対策ソフトClamAVの使い方」
https://zenn.dev/gladevise/articles/clamav-usage

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

sudo apt install clamav clamav-daemon libclamunrar9
sudo service clamav-daemon start

デーモンとして起動して運用する方法と、コマンドを実行してファイルをスキャンする方法があります。
スキャンテストするためのウィルスに感染したテストファイルが下記にありますので入手します。

テストファイルのダウンロード
https://www.eicar.org/download-anti-malware-testfile/

wget https://secure.eicar.org/eicar.com
wget https://secure.eicar.org/eicar.com.txt
wget https://secure.eicar.org/eicar_com.zip
wget https://secure.eicar.org/eicarcom2.zip

これらのファイルは、Windowsでダウンロードすると、Windows Defenderで検出されます。感染しているオリジナルファイルは、eicar.comですが、他は拡張子を変えたり、圧縮したりしたバリエーションです。eicar.comは下記バイナリデータでなくテキストデータですが、DOSの実行ファイルです。(当然Linuxでは実行できない)

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

comというのは、ドメインネームのことではなくexeと同じ実行ファイルの拡張子ですが、確かタイニーモデル(あとスモールとラージがある)というサイズが小さいモデルでコンパイルするとcomになった記憶があります。

clamav-testというフォルダに格納してコマンド実行してみました。

実行結果

検出されました。(clamd.confはデーモンテスト用)
しかしこの文字列の何がいけないのか、をもっと詳しくしりたいと思い調べてみると、

https://ja.wikipedia.org/wiki/EICAR%E3%83%86%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB

ファイル自体は単純なテキストファイルで、長さは通常68バイトであり、[1]マイクロソフトのオペレーティングシステムやOS/2などで動作するCOMファイルと呼ばれる実行ファイルになっている。実行すると “EICAR-STANDARD-ANTIVIRUS-TEST-FILE!” と表示して停止する。このテスト文字列は人間の読めるASCII文字だけで構成されるよう工夫されていて、通常のキーボードで容易に作成できる。自己書き換えコードになっている。

という記述がありました。自己書き換えコードなら、検出するのかもと思い、いくつかそのようなコードをコンパイルしたものスキャンしましたが、ウィルスとして判定されませんでした。(そんな簡単ではないですね)この文字列のあるパターンがデータベースに登録されており、マッチしたのでしょう。

次にデーモンを起動してみます。
フォアグラウンドで確認するために、まずバックグラウンドを停止します。

sudo service clamav-daemon stop

sudo clamd -F

出力の中にサポートされているファイルがありました。

デーモン用のコマンド(clamdscan)を試しましたが、テストファイルのパーミッションエラーで実行できませんでした。(実行権限、ファイル権限、オーナ、いろいろと試しましだが、よくわらかず・・保留事項)

運用はシンプルですが、検出の仕組みなどは、もっと知りたいと思いました。
最後に、どういったことができるかを知る参考になりそうですので、下記に設定ファイルを引用いたします。

/etc/clamav/clamd.conf

#Automatically Generated by clamav-daemon postinst
#To reconfigure clamd run #dpkg-reconfigure clamav-daemon
#Please read /usr/share/doc/clamav-daemon/README.Debian.gz for details
LocalSocket /var/run/clamav/clamd.ctl
FixStaleSocket true
LocalSocketGroup clamav
LocalSocketMode 666
# TemporaryDirectory is not set to its default /tmp here to make overriding
# the default with environment variables TMPDIR/TMP/TEMP possible
User clamav
ScanMail true
ScanArchive true
ArchiveBlockEncrypted false
MaxDirectoryRecursion 15
FollowDirectorySymlinks false
FollowFileSymlinks false
ReadTimeout 180
MaxThreads 12
MaxConnectionQueueLength 15
LogSyslog false
LogRotate true
LogFacility LOG_LOCAL6
LogClean false
LogVerbose false
PreludeEnable no
PreludeAnalyzerName ClamAV
DatabaseDirectory /var/lib/clamav
OfficialDatabaseOnly false
SelfCheck 3600
Foreground false
Debug false
ScanPE true
MaxEmbeddedPE 10M
ScanOLE2 true
ScanPDF true
ScanHTML true
MaxHTMLNormalize 10M
MaxHTMLNoTags 2M
MaxScriptNormalize 5M
MaxZipTypeRcg 1M
ScanSWF true
ExitOnOOM false
LeaveTemporaryFiles false
AlgorithmicDetection true
ScanELF true
IdleTimeout 30
CrossFilesystems true
PhishingSignatures true
PhishingScanURLs true
PhishingAlwaysBlockSSLMismatch false
PhishingAlwaysBlockCloak false
PartitionIntersection false
DetectPUA false
ScanPartialMessages false
HeuristicScanPrecedence false
StructuredDataDetection false
CommandReadTimeout 30
SendBufTimeout 200
MaxQueue 100
ExtendedDetectionInfo true
OLE2BlockMacros false
AllowAllMatchScan true
ForceToDisk false
DisableCertCheck false
DisableCache false
MaxScanTime 120000
MaxScanSize 100M
MaxFileSize 25M
MaxRecursion 16
MaxFiles 10000
MaxPartitions 50
MaxIconsPE 100
PCREMatchLimit 10000
PCRERecMatchLimit 5000
PCREMaxFileSize 25M
ScanXMLDOCS true
ScanHWP3 true
MaxRecHWP3 16
StreamMaxLength 25M
LogFile /var/log/clamav/clamav.log
LogTime true
LogFileUnlock false
LogFileMaxSize 0
Bytecode true
BytecodeSecurity TrustSigned
BytecodeTimeout 60000
OnAccessMaxFileSize 5M

/etc/clamav/freshclam.conf

# Automatically created by the clamav-freshclam postinst
# Comments will get lost when you reconfigure the clamav-freshclam package

DatabaseOwner clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogVerbose false
LogSyslog false
LogFacility LOG_LOCAL6
LogFileMaxSize 0
LogRotate true
LogTime true
Foreground false
Debug false
MaxAttempts 5
DatabaseDirectory /var/lib/clamav
DNSDatabaseInfo current.cvd.clamav.net
ConnectTimeout 30
ReceiveTimeout 0
TestDatabases yes
ScriptedUpdates yes
CompressLocalDatabase no
Bytecode true
NotifyClamd /etc/clamav/clamd.conf
# Check for new database 24 times a day
Checks 24
DatabaseMirror db.local.clamav.net
DatabaseMirror database.clamav.net

]]>