Elkeid 静态检测插件 scanner_clamav ,使用clamav 引擎:https://docs.clamav.net/Introduction.html 对 Linux 系统进程和敏感目录进行周期扫描,以发现可疑静态文件(UPX/挖矿二进制/挖矿脚本/可疑脚本文件/...)。
开源地址: https://github.com/bytedance/Elkeid/tree/main/plugins/scanner_clamav
在 Elkeid 的 agent 中,静态检测插件需要在极其有限的内存和CPU资源占用条件下,在不同发行版和内核版本的 Linux x64 架构系统上进行静态扫描,因此使用完全静态链接的 libclamav 库以及裁剪后的 clamav database 与 yara 规则实现。资源占用数据如下:
Agent-插件占比 PCT | CPU 单核百分比 | RSS Mb |
静默 | 0 | 25.6 |
50 | 0.18 | 64.2 |
75 | 0.80 | 64.4 |
90 | 1.12 | 64.8 |
95 | 1.58 | 65 |
99 | 1.69 | 66 |
999 | 2.88 | 75 |
MAX | 10 | 111 |
(PCT.50~PCT.999 为 Agent 每次心跳上报的数据统计分布占比)
参考 Github readme
中文 https://github.com/bytedance/Elkeid/blob/main/plugins/scanner_clamav/README-zh_CN.md
英文 https://github.com/bytedance/Elkeid/blob/main/plugins/scanner_clamav/README.md
考虑到部分国内用户无法在编译时正常拉取 zlib、ssl 等标准库的代码,这里配置了 github action 对应的 dockerfile 编译方式,参见:
Dockerfile
https://github.com/bytedance/Elkeid/blob/main/plugins/scanner_clamav/docker/Dockerfile
Github Action runner
https://github.com/bytedance/Elkeid/blob/main/.github/workflows/Elkeid.yml#L46
Action 产物
https://github.com/bytedance/Elkeid/actions/runs/2202809672
1.周期性扫描:对敏感目录和系统进程进行静态扫描
2.插件扫描任务:对静态检测插件下发扫描任务,对指定文件进行静态扫描
3.与策略联动:外网下载 & php/jsp/asp 文件创建扫描,以发现 webshell 上传
数据类型汇总
types | 文件类型 |
class | 恶意分类 |
name | 恶意家族 |
exe | 目标文件 |
exe_size | 文件大小(byte) |
exe_hash | 快速hash,对标 driver exe_hash |
md5_hash | md5 |
create_at | 文件 brith_time, 文件系统不支持则为0 |
modify_at | 文件修改时间, 文件系统不支持则为0 |
pid | 目标进程pid |
ppid | 父进程 pid |
pgid | 父进程 组id |
tgid | thread group id |
argv | 进程命令行 cmdline |
comm | 进程的命令名 |
sessionid | 进程所在会话 ID |
uid | 用户ID |
pns | Process name space |
error | 扫描任务执行错误信息(如果有) |
token | 扫描任务 token |
{custom} | 自定义数据 |
在 示例 https://github.com/bytedance/Elkeid/blob/main/plugins/scanner_clamav/README-zh_CN.md#%E6%89%AB%E6%8F%8F%E4%BB%BB%E5%8A%A1 中,
{
"id_list": [
"33623333-3365-4905-b417-331e183333ff"
],
"data": {
"task": {
"data_type":6053,
"name": "scanner_clamav",
"data": "{\"exe\":\"/path/to/target\"}"
}
}
}
字段 data 为给插件下发的扫描任务 json string,其中,exe 为待扫描的文件绝对路径,exe、data_type 以外的所有字段会 插入/覆盖(如果已经存在)到命中规则后上报的数据中。例,如果需要在上报的数据中插入预定义的sid,则需要变更如下:
{
"id_list": [
"33623333-3365-4905-b417-331e183333ff"
],
"data": {
"task": {
"data_type":6053,
"name": "scanner_clamav",
"data": "{\"exe\":\"/path/to/target\",\"sid\":42414236}"
}
}
}
完整的 clamav database 中包含六百万以上样本数据,加载需要 2G 以上内存使用,且 clamav database 中大部分规则类型为:文件 hash 校验、Section hash 校验,以及大量的 windows 相关病毒规则。在 Linux 服务端的场景下,windows pe 等无关的病毒规则可以裁剪掉,此外 hash 校验部分则可以在扫描时提取对应特征,随 agent 数据流到后端统一验证。裁剪后的 database 再配合低频率的扫描任务,这样可以大幅减少静态检测在端上的内存和 CPU 资源资源占用。
clamav 数据库支持 yara 格式(但有一些限制),且数据库文件支持自定义,详细格式以及数据库定义规则请参考 https://docs.clamav.net/manual/Signatures.html。