som*_*ing 6 linux scanner bugs clamav
我正在尝试做的事情:
我正在尝试扫描我的文件服务器中的恶意软件,并且我正在使用 clamav/clamscan,其中手册页说它可以扫描最大 4GB 的文件。
该手册页指出:
--max-filesize=#n
Run Code Online (Sandbox Code Playgroud)
从每个存档中提取和扫描最多 #n 千字节。您可以以 xM 或 xm 格式传递以兆字节为单位的值,其中 x 是一个数字。此选项可保护您的系统免受 DoS 攻击(默认:25 MB,最大:<4 GB)
--max-scansize=#n
Run Code Online (Sandbox Code Playgroud)
从每个扫描的文件中提取和扫描最多 #n 千字节。您可以以 xM 或 xm 格式传递以兆字节为单位的值,其中 x 是一个数字。此选项可保护您的系统免受 DoS 攻击(默认:100 MB,最大:<4 GB)
我的系统是:
新硬件华擎主板,
CPU:AMD Athlon(tm) II X2 270 处理器(3400MHz)
内存:4GB
操作系统:Debian Wheezy 所有更新。
问题:
我在这里做错了什么?
下面的这些错误和警告是什么意思?
这种行为有解决办法吗?
我的情况:
clamscan
一个多星期以来,我一直在尝试扫描两个 3TB 硬盘驱动器,但它总是出现相同的错误(字节码编号不同):
LibClamAV Warning: [Bytecode JIT]: recovered from error
LibClamAV Warning: [Bytecode JIT]: JITed code intercepted runtime error!
LibClamAV Warning: Bytcode 38 failed to run: Time limit reached
LibClamAV Warning: [Bytecode JIT]: Bytecode run timed out, timeout flag set
LibClamAV Warning: [Bytecode JIT]: recovered from error
LibClamAV Warning: [Bytecode JIT]: JITed code intercepted runtime error!
LibClamAV Warning: Bytcode 38 failed to run: Time limit reached
LibClamAV Warning: [Bytecode JIT]: recovered from error
LibClamAV Warning: [Bytecode JIT]: Bytecode run timed out, timeout flag set
LibClamAV Warning: [Bytecode JIT]: JITed code intercepted runtime error!
LibClamAV Warning: Bytcode 38 failed to run: Time limit reached
Run Code Online (Sandbox Code Playgroud)
大约之后 40-50 小时的扫描:
(请注意,在下一个片段中是clamscan
我尝试运行的实际命令)
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
2012 root 20 0 1903M 246M 1244 R 101. 6.6 47h27:45 clamscan -r -i --remove --max-filesize=4000M --max-scansize=4000M /DATA1/
Run Code Online (Sandbox Code Playgroud)
我试着删除建议在一个论坛,让他们在一些是这些文件的涉嫌贪污的文件bytecode.cvd
,main.cvd
,daily.cld
并重新下载他们(与更新工具):
root ~ # ls -ahl /usr/local/share/clamav/
total 145M
drwxr-sr-x 2 clamav clamav 4.0K Mar 26 04:29 .
drwxrwsr-x 10 root staff 4.0K Mar 20 01:59 ..
-rw-r--r-- 1 clamav clamav 65K Mar 26 04:29 bytecode.cvd
-rw-r--r-- 1 clamav clamav 83M Mar 26 04:29 daily.cld
-rw-r--r-- 1 clamav clamav 62M Mar 18 01:17 main.cvd
-rw------- 1 clamav clamav 156 Mar 26 04:29 mirrors.dat
root ~ # rm -f /usr/local/share/clamav/bytecode.cvd /usr/local/share/clamav/daily.cld /usr/local/share/clamav/main.cvd
root ~ # freshclam
ClamAV update process started at Thu Mar 26 04:42:21 2015
Downloading main.cvd [100%]
main.cvd updated (version: 55, sigs: 2424225, f-level: 60, builder: neo)
Downloading daily.cvd [100%]
daily.cvd updated (version: 20242, sigs: 1358870, f-level: 63, builder: neo)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 247, sigs: 41, f-level: 63, builder: dgoddard)
Database updated (3783136 signatures) from db.UK.clamav.net (IP: 129.67.1.218)
Run Code Online (Sandbox Code Playgroud)
我还尝试根据我在此处找到的论坛帖子进行设置--max-filesize
和--max-scansize
降低,其中指出文件/扫描大小的限制为 2.17GB:
clamscan -r -i --remove --max-filesize=2100M --max-scansize=2100M /DATA1/
Run Code Online (Sandbox Code Playgroud)
但它给出了同样的错误。
该程序是来自官方站点的最新版本:clamav-0.98.6 使用以下选项从源代码配置和编译:
./configure --enable-bzip2
Run Code Online (Sandbox Code Playgroud)
我尝试重新安装程序,而且起初我在编译中设置了更多选项(--enable-experimental,--with-dbdir=/usr/local/share/clamav)
我知道的最后一个选项是卸载此版本并尝试从我的发行版存储库中安装软件包。但如果可能的话,我想让这个工作。
更新:我也尝试从存储库安装 clamav,但它给出了相同的问题/错误。
我找到了这个,但它很旧,似乎不知道问题是什么。而在这里,但仍然没有一个明确的答案或修复。
我一直在尝试扫描的驱动器是这些:
# df -h
/dev/sdb1 2.7T 2.6T 115G 96% /DATA1
/dev/sdc1 2.7T 2.6T 165G 95% /DATA2
Run Code Online (Sandbox Code Playgroud)
这是 fdisk:
# fdisk -l
WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/sdb: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders, total 5860533168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdb1 1 4294967295 2147483647+ ee GPT
Partition 1 does not start on physical sector boundary.
WARNING: GPT (GUID Partition Table) detected on '/dev/sdc'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/sdc: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders, total 5860533168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdc1 1 4294967295 2147483647+ ee GPT
Partition 1 does not start on physical sector boundary.
Run Code Online (Sandbox Code Playgroud)
可能的原因:
它可能与系统拥有的内存/CPU 相关,但我没有这些信息
我发现这表明 clamscan 加载文件以扫描到内存中,如果没有足够的内存,它将失败。当我将扫描仪设置为扫描高达 4Gigs 的文件时,这可能是正在发生的事情,这就是系统有多少内存。
摘抄:
那个文件有多大?扫描机上安装了多少 RAM(物理和交换分开,请)?目前,ClamAV 的硬文件限制约为 2.17GB。因为我们将文件映射到内存中,如果您没有足够的内存来映射整个文件,内存映射代码(如当前实现的那样)将失败并且不会扫描文件。
我们的长期目标之一是调查是否能够正确支持大文件。
可能的解决方案:
希望以上是问题(内存不足),然后我可以简单地将系统内存扩展到 8GB,但不太可能如此简单,因为我试图在具有 12GB 内存的系统上运行这些扫描。
编辑#1
这是在 Fedora 21 + 12 GB RAM 的另一个系统上运行的结果:
clamscan -r -i --remove --max-filesize=1700M --max-scansize=1700M --exclude=/proc --exclude=/sys --exclude=/dev /
Run Code Online (Sandbox Code Playgroud)
LibClamAV Warning: [Bytecode JIT]: recovered from error
LibClamAV Warning: [Bytecode JIT]: JITed code intercepted runtime error!
LibClamAV Warning: [Bytecode JIT]: Bytecode run timed out, timeout flag set
LibClamAV Warning: Bytcode 27 failed to run: Time limit reached
LibClamAV Error: cli_scanxz: premature end of compressed stream
LibClamAV Error: cli_scanxz: premature end of compressed stream
Run Code Online (Sandbox Code Playgroud)
----------- SCAN SUMMARY -----------
Known viruses: 3779101
Engine version: 0.98.6
Scanned directories: 101382
Scanned files: 744103
Infected files: 0
Total errors: 18419
Data scanned: 285743.78 MB
Data read: 394739.73 MB (ratio 0.72:1)
Time: 32171.073 sec (536 m 11 s)
Run Code Online (Sandbox Code Playgroud)
当我在其上运行相同的扫描并将大小设置为 2100M-4000M 时,它给出了与我原始问题中提到的相同的错误。
我发现了这个(感谢@FloHimself):ClamAV Bytecode Signatures 的简要重新介绍,它很好地概述/补充了该程序的一些用法和一些有用的选项:
摘抄:
字节码签名是一种特殊类型的 ClamAV 签名,它能够对扫描的文件执行额外的处理并允许更强大的检测。与标准的 ClamAV 签名类型不同,字节码签名有许多独特的区别,需要注意它们的有效使用。
相信
默认情况下,字节码签名被认为是不受信任的。事实上,只有 Cisco 发布的字节码签名在 bytecode.cvd 中才被认为是“可信的”。这意味着 ClamAV 引擎默认不会加载、触发或执行不受信任的字节码。可以通过向引擎指定字节码无符号选项来绕过这种安全机制,但应该注意的是,使用不受信任的字节码签名取决于用户的判断力。
对于 clamscan,命令行选项是
--bytecode-unsigned
.
对于 clamd,需要指定BytecodeUnsigned yes
to clamd.conf
。
暂停
字节码签名设计为仅在由内部超时值指定的有限时间内运行。如果执行时间超过该值,则终止字节码签名的执行并通知用户。字节码签名超时值可由用户设置。
对于 clamscan,命令行是
--bytecode-timeout=[time in ms]
.
对于 clamd,可以指定BytecodeTimeout [time in ms]
为clamd.conf
。
这很有用:
问题报告
如果有人遇到字节码签名问题,无论是在 clambc 编译器内还是在 ClamAV 内,他们都可以向https://bugzilla.clamav.net/报告 。确保包含字节码签名、字节码源(如果可能)和任何其他有用信息。
回答
关键似乎是设置--bytecode-timeout=
高,以便扫描仪有时间扫描整个文件。默认值为60000
毫秒/60 秒,我已将其设置为 190000,它可以工作并且不会出现超时错误。这个值可能设置得更低,但它对我有用。在设置之前出现错误的两个系统上进行了测试。
更新:
在三个系统上进行了多次扫描测试,此设置的错误消失了--bytecode-timeout
。
这是新命令:
clamscan -r -i --remove --max-filesize=4000M --max-scansize=4000M --bytecode-timeout=190000 /DATA1
Run Code Online (Sandbox Code Playgroud)
笔记:
我还将服务器内存升级到 8GB,我不确定 clamscan 是否在扫描文件时将文件加载到内存中,但一篇帖子说了这么多,如果是这样,那是另一个考虑因素。