介绍
官方文档:https://docs.clamav.net/manual/Signatures/DatabaseInfo.html
ClamAV 是一个开源的反病毒引擎,它由多个模块组成,负责不同的任务处理。以下是 ClamAV 的主要模块和它们的功能:
- clamd:clamd 是 ClamAV 的守护进程,它在后台运行,监听端口并等待其他进程发送文件以进行扫描。clamd 可以同时处理多个连接,并且可以在多个 CPU 核心上并行扫描文件。
- clamdscan:clamdscan 是一个命令行工具,它与 clamd 守护进程通信,将文件发送给 clamd 进行扫描。clamdscan 可以扫描单个文件或目录中的所有文件。
- lamscan:clamscan 是一个命令行工具,它直接扫描文件,而不依赖于 clamd 守护进程。clamscan 可以扫描单个文件或目录中的所有文件。
- freshclam:freshclam 是一个命令行工具,它用于更新 ClamAV 的病毒数据库。freshclam 可以自动定期检查并下载最新的病毒数据库。
核心概念
● freshclam 用来更新 clamav 病毒数据库。数据库放置在 /var/lib/clamav/,且文件的用户和用户组都是 clamav。
● clamd 是 clamav daemon 进程,它会读取配置文件 /etc/clamav/clamd.conf。clamd 不会自动查毒。
● clamdtop 是 clamd 进程的监控程序。查看 clamd 线程池。
● clamdscan 通知 clamd 进程进行查毒。通常执行 clamdscan --fdpass <文件或目录>。
● clamscan 与 clamd 无关,直接根据当前命令参数执行查毒,因此也不会读取配置文件 /etc/clamav/clamd.conf。通常执行 sudo clamscan -ri /。
● clamconf 显示或生成 clamav 的配置文件。
● clamonacc 是 on-access 扫描服务,当文件变化会立刻扫描。依赖 clamd。配置文件 /etc/clamav/clamd.conf 里以 OnAccess 开头的都是相关配置项。
病毒签名
category
Follow with the category.
Options for this field in official signatures include:
Adware 广告, Backdoor 后门, Coinminer 挖矿, Countermeasure, Downloader 下载器, Dropper 滴管, Exploit 蠕虫, File, Filetype, Infostealer, Ircbot, Joke, Keylogger, Loader 木马, Macro, Malware, Packed 木马, Packer, Phishing, Proxy, Ransomware, Revoked, Rootkit 恶意软件, Spyware间谍, Test 测试
Docker运行
docker run -it --rm \
--name "clam_container_01" \
--mount type=bind,source=/var/lib/docker/data/clamav/dbs/,target=/var/lib/clamav \
--publish 13310:3310 \
--publish 17357:7357 \
clamav/clamav:1.2
病毒扫描
下载病毒文件
https://www.eicar.org/download-anti-malware-testfile/
命令行测试
mkdir eicar && cd eicar
curl -O https://secure.eicar.org/eicar.com \
-O https://secure.eicar.org/eicar.com.txt \
-O https://secure.eicar.org/eicar_com.zip \
-O https://secure.eicar.org/eicarcom2.zip
Java API
@Slf4j
@RestController
@RequestMapping("/scan")
public class ClamAvScanTestController {
@Autowired
private ClamAVClient clamAVClient;
@GetMapping("")
public String test() throws IOException {
boolean pong = clamAVClient.ping();
if (pong){
System.out.println("服务器连接成功");
return "服务器连接成功";
}
System.out.println("服务器连接失败");
return "服务器连接失败";
}
@PostMapping(value = "/uploadFile")
public ResultUtil<?> uploadFile(@RequestParam("file") MultipartFile file) {
// 判断文件是否存在病毒
try {
InputStream inputStream = file.getInputStream();
byte[] scan = clamAVClient.scan(inputStream);
String res = new String(scan, StandardCharsets.UTF_8);
log.info("检测结果:{}",res);
if(ClamAVEnum.OK.getCode().equals(res)){
System.out.println(ClamAVEnum.OK.getDesc());
}else if(ClamAVEnum.ALLOCATE_MEMORY.getCode().equals(res)){
return ResultUtil.error(ClamAVEnum.ALLOCATE_MEMORY.getDesc());
}else {
return ResultUtil.error(ClamAVEnum.INFECTED.getDesc());
}
} catch (IOException e) {
try {
clamAVClient.ping();
} catch (IOException ioException) {
return ResultUtil.error("连接杀毒服务失败!");
}
return ResultUtil.error("连接杀毒服务异常或上传文件超过杀毒软件最大文件限制!");
}
return ResultUtil.ok("ok");
}
}
Python API
import pyclamd
cd = pyclamd.ClamdNetworkSocket(host='192.168.1.115',port=13310,timeout=15)
cd.ping()
result = cd.scan_stream(cd.EICAR())
print(result)