rfxn/linux-malware-detect
GitHub: rfxn/linux-malware-detect
专为 Linux 共享托管环境设计的恶意软件扫描器,通过多引擎检测和实时监控弥补传统杀毒软件在用户空间威胁检测上的短板。
Stars: 1376 | Forks: 246
Linux Malware Detect v1.6.6
(C) 2002-2025, R-fx Networks
(C) 2025, Ryan MacDonald
本程序可以根据 GNU GPL v2 的条款自由分发
::::::::::::::::::::::::::::::::::
:: 目录 ::
.: 1 [ 描述 ]
.: 2 [ 功能 ]
.: 3 [ 威胁源数据 ]
.: 4 [ 版本更新 ]
.: 4.1 [ 特征库更新 ]
.: 5 [ 已检测威胁 ]
.: 6 [ 威胁共享 ]
.: 7 [ 配置 ]
.: 8 [ 忽略选项 ]
.: 9 [ 命令行使用 ]
.: 10 [ 每日 Cron 任务 ]
.: 11 [ Inotify 监控 ]
.: 12 [ ModSecurity2 上传扫描 ]
.: 13 [ 清除规则 ]
::::::::::::::::::::::::::::::::::
.: 1 [ 描述 ]
Linux Malware Detect (LMD) 是一个在 GNU GPLv2 许可证下发布的 Linux 恶意软件扫描器,其设计旨在应对共享托管环境中面临的威胁。它利用来自网络边缘入侵检测系统的威胁数据来提取攻击中主动使用的恶意软件,并生成用于检测的特征码。此外,威胁数据也来源于用户通过 LMD 的 checkout 功能提交的内容以及恶意软件社区资源。LMD 使用的特征码包括 MD5 文件哈希和 HEX 模式匹配,它们也很容易导出到任何数量的检测工具中,例如 ClamAV。
LMD 背后的驱动力在于,目前针对 Linux 系统且专注于恶意软件检测的开源/无限制工具非常有限,更重要的是,能做对的工具更是凤毛麟角。许多在 Linux 上执行恶意软件检测的 AV 产品在检测威胁方面的记录非常糟糕,特别是针对共享托管环境的威胁。
共享托管环境中的威胁形势与标准 AV 产品的检测套件不同,因为它们主要检测的是操作系统(OS)级的木马、rootkits 和传统的文件感染病毒,却忽略了用户账号级别上日益增多的各种恶意软件,而这些正是用作攻击平台的。
使用 CYMRU 恶意软件哈希注册表(为 30 个主要的 AV 包提供恶意软件检测数据),我们可以展示当前威胁检测中的这一短板。以下是对 LMD 1.5 中附带的 8,882 个 MD5 哈希的分析,以及目前主要 AV 产品对这些哈希的检测百分比。
已知恶意软件: 1951
% AV 检测率 (平均): 58
% AV 检测率 (最低): 10
% AV 检测率 (最高): 100
未知恶意软件: 6931
这些信息意味着,在这 8,883 个哈希中,有 78%(即 6,931 个)恶意软件威胁未被 Top 30 的 AV 产品检测到。那 1,951 个被检测到的已知恶意软件威胁在 Top 30 AV 产品中的平均检测率为 58%,最低和最高检测率分别为 10% 和 100%。这清楚地表明了 Top 30 AV 产品目前在用户空间恶意软件检测方面的显著缺失。正是出于这个原因,LMD 被创造出来以填补这一空白,特别是针对共享托管环境。
.: 2 [ 功能 ]
- MD5 文件哈希检测,用于快速识别威胁
- 基于 HEX 的模式匹配,用于识别威胁变种
- 统计分析组件,用于检测混淆的威胁(例如:base64)
- 集成 ClamAV 检测以作为扫描引擎,提高性能
- 通过 -u|--update 集成特征码更新功能
- 通过 -d|--update-ver 集成版本更新功能
- scan-recent 选项,仅扫描在 X 天内添加/更改的文件
- scan-all 选项,用于基于完整路径的扫描
- checkout 选项,将可疑恶意软件上传到 rfxn.com 进行审查/哈希处理
- 完整的报告系统,用于查看当前和以前的扫描结果
- 隔离队列,以无权限的安全方式存储威胁
- 隔离批处理选项,用于隔离当前或过去扫描的结果
- 隔离恢复选项,将文件恢复到原始路径、所有者和权限
- 隔离暂停账号选项,用于 Cpanel 暂停用户或撤销 shell 权限
- 清除规则,尝试移除恶意软件注入的字符串
- 清除批处理选项,尝试清除以前的扫描报告
- 清除规则,用于移除 base64 和 gzinflate(base64 注入的恶意软件)
- 每日基于 Cron 的扫描,针对用户主目录中过去 24 小时内的所有更改
- 每日 Cron 脚本兼容原生 RH 风格系统、Cpanel 和 Ensim
- 基于内核 inotify 的实时文件扫描,监控创建/修改/移动的文件
- 内核 inotify 监控器,可以从 STDIN 或 FILE 获取路径数据
- 内核 inotify 监控器的便利功能,用于监控系统用户
- 内核 inotify 监控器可以限制在可配置的用户 html 根目录
- 内核 inotify 监控器带有动态 sysctl 限制,以实现最佳性能
- 内核 inotify 通过每日和/或可选的每周报告进行警报
- 通过 mod_security2 inspectFile 钩子进行 HTTP 上传扫描
- 每次扫描执行后(手动和每日)的电子邮件警报报告
- 基于路径、扩展名和特征码的忽略选项
- 后台扫描器选项,用于无人值守的扫描操作
- 详细记录所有操作的日志和输出
.: 3 [ 威胁源数据 ]
LMD 的决定性区别在于,它不仅仅根据他人生成的特征码/哈希来检测恶意软件,而是一个全面的项目,主动跟踪实际环境中的威胁,并根据当前流通的真实威胁生成特征码。
有四个主要的恶意软件数据来源用于生成 LMD 特征码:
- 网络边缘 IPS:通过作为我日常工作一部分管理的网络(主要是 Web 托管相关),我们的 Web 服务器每天接收到大量的滥用事件,所有这些都由我们的网络边缘 IPS 记录。IPS 事件经过处理以提取恶意软件 URL,解码 POST 负载和 base64/gzip 编码的滥用数据,最终检索、审查、分类该恶意软件,并生成相应的特征码。LMD 的绝大多数特征码源自 IPS 提取的数据。
我管理的网络托管了超过 35,000 个网站,因此每天收到大量的滥用信息,所有这些都由我们的网络边缘 IPS 记录。IPS 事件经过处理以提取恶意软件 URL,解码 POST 负载和 base64/gzip 编码的滥用数据,最终检索、审查、分类该恶意软件,并生成相应的特征码。LMD 的绝大多数特征码源自 IPS 提取的数据。
- 社区数据:数据从多个社区恶意软件网站(如 clean-mx 和 malwaredomainlist)聚合,然后进行处理以检索新的恶意软件、审查、分类并生成特征码。
- ClamAV:监控来自 ClamAV 的 HEX 和 MD5 检测特征码,寻找适用于 LMD 目标用户群的相关更新,并适当地添加到项目中。迄今为止,大约有 400 个特征码从 ClamAV 移植过来,而 LMD 项目通过提交超过 1,100 个特征码回馈给 ClamAV,并且持续这样做。
- 用户提交:LMD 有一个 checkout 功能,允许用户提交可疑恶意软件以供审查,这已成为一个非常受欢迎的功能,平均每周产生约 30-50 个提交。
.: 4 [ 版本更新 ]
LMD 发布版本的更新不会自动安装,但可以使用 --update-ver 选项进行安装。这样做有充分的理由不自动进行,我真的不想一一列举,所以稍微思考一下就明白了。
发布版本的最新更改始终可以在以下位置查看:
http://www.rfxn.com/appdocs/CHANGELOG.maldetect
.: 4.1 [ 特征库更新 ]
LMD 特征码通常每天更新一次,或根据来自 LMD checkout 功能、IPS 恶意软件提取和其他来源的传入威胁数据更频繁地更新。LMD 安装中的特征码更新是通过默认的 cron.daily 脚本配合 --update 选项每天执行的,该选项也可以随时手动运行。
提供 RSS 和 XML 数据源用于跟踪恶意软件威胁更新:
RSS 最近特征码: http://www.rfxn.com/api/lmd
XML 最近特征码: http://www.rfxn.com/api/lmd?id=recent
XML 所有特征码: http://www.rfxn.com/api/lmd?id=all
.: 5 [ 已检测威胁 ]
LMD 1.6 总共有 11,061 个(9,121 个 MD5 / 1940 个 HEX)特征码(更新前),下面列出了 LMD 检测到的按流行程度排名的前 60 个威胁。
base64.inject.unclassed bin.dccserv.irsexxy bin.fakeproc.Xnuxer
bin.ircbot.nbot bin.ircbot.php3 bin.ircbot.unclassed
bin.pktflood.ABC123 bin.pktflood.osf bin.trojan.linuxsmalli
c.ircbot.tsunami exp.linux.rstb exp.linux.unclassed
exp.setuid0.unclassed gzbase64.inject html.phishing.auc61
html.phishing.hsbc perl.connback.DataCha0s perl.connback.N2
perl.cpanel.cpwrap perl.mailer.yellsoft perl.ircbot.atrixteam
perl.ircbot.bRuNo perl.ircbot.Clx perl.ircbot.devil
perl.ircbot.fx29 perl.ircbot.magnum perl.ircbot.oldwolf
perl.ircbot.putr4XtReme perl.ircbot.rafflesia perl.ircbot.UberCracker
perl.ircbot.xdh perl.ircbot.xscan perl.shell.cbLorD
perl.shell.cgitelnet php.cmdshell.c100 php.cmdshell.c99
php.cmdshell.cih php.cmdshell.egyspider php.cmdshell.fx29
php.cmdshell.ItsmYarD php.cmdshell.Ketemu php.cmdshell.N3tshell
php.cmdshell.r57 php.cmdshell.unclassed php.defash.buno
php.exe.globals php.include.remote php.ircbot.InsideTeam
php.ircbot.lolwut php.ircbot.sniper php.ircbot.vj_denie
php.mailer.10hack php.mailer.bombam php.mailer.PostMan
php.phishing.AliKay php.phishing.mrbrain php.phishing.ReZulT
php.pktflood.oey php.shell.rc99 php.shell.shellcomm
.: 6 [ 威胁共享 ]
我坚信,为了我自己或他人的理智,不要重复造轮子。因此,所有独特的威胁数据都会提交给 CYMRU 和 ClamAV,以便开源和反恶意软件社区整体能够从这个项目中受益。
.: 7 [ 配置 ]
LMD 的配置通过 /usr/local/maldetect/conf.maldet 处理,所有选项都有详细的注释,以便于配置。
默认情况下,LMD 禁用了文件的自动隔离,这意味着您需要对检测到的任何威胁采取行动,或者将 SCANID 传递给 '-q' 选项以批量隔离结果。要更改此设置,请在 conf.maldet 中设置 quarantine_hits=1。
.: 8 [ 忽略选项 ]
有四个可用的忽略文件,它们细分如下:
/usr/local/maldetect/ignore_paths
一个以行分隔的文件,用于存放要从搜索结果中排除的路径
示例忽略条目:
/home/user/public_html/cgi-bin
/usr/local/maldetect/ignore_file_ext
一个以行分隔的文件,用于存放要从搜索结果中排除的文件扩展名
示例忽略条目:
.js
.css
/usr/local/maldetect/ignore_sigs
一个以行分隔的文件,用于存放应从文件扫描中移除的特征码
示例忽略条目:
base64.inject.unclassed
/usr/local/maldetect/ignore_inotify
一个以行分隔的文件,用于存放从 inotify 监控中排除的正则表达式路径
示例忽略条目:
^/home/user$
^/var/tmp/#sql_.*\.MYD$
.: 9 [ CLI 使用 ]
安装 LMD 后,可以通过 'maldet' 命令运行它,'--help' 选项提供了使用选项的详细摘要:
```
-b, --background
Execute operations in the background, ideal for large scans
e.g: maldet -b -r /home/?/public_html 7
-u, --update [--force]
Update malware detection signatures from rfxn.com
-d, --update-ver [--force]
Update the installed version from rfxn.com
-m, --monitor USERS|PATHS|FILE
Run maldet with inotify kernel level file create/modify monitoring
If USERS is specified, monitor user homedirs for UID's > 500
If FILE is specified, paths will be extracted from file, line spaced
If PATHS are specified, must be comma spaced list, NO WILDCARDS!
e.g: maldet --monitor users
e.g: maldet --monitor /root/monitor_paths
e.g: maldet --monitor /home/mike,/home/ashton
-k, --kill
Terminate inotify monitoring service
-r, --scan-recent PATH DAYS
Scan files created/modified in the last X days (default: 7d, wildcard: ?)
e.g: maldet -r /home/?/public_html 2
-a, --scan-all PATH
Scan all files in path (default: /home, wildcard: ?)
e.g: maldet -a /home/?/public_html
-c, --checkout FILE
Upload suspected malware to rfxn.com for review & hashing into signatures
-l, --log
View maldet log file events
-e, --report SCANID email
View scan report of most recent scan or of a specific SCANID and optionally
e-mail the report to a supplied e-mail address
e.g: maldet --report
e.g: maldet --report list
e.g: maldet --report 050910-1534.21135
e.g: maldet --report SCANID user@domain.com
-E, --dump-report SCANID
Similar to -e/--report except dumps the report to stdout instead.
e.g: maldet --dump-report
e.g: maldet --dump-report 050910-1534.21135
-s, --restore FILE|SCANID
Restore file from quarantine queue to orginal path or restore all items from
a specific SCANID
e.g: maldet --restore /usr/local/maldetect/quarantine/config.php.23754
e.g: maldet --restore 050910-1534.21135
-q, --quarantine SCANID
Quarantine all malware from report SCANID
e.g: maldet --quarantine 050910-1534.21135
-n, --clean SCANID
Try to clean & restore malware hits from report SCANID
e.g: maldet --clean 050910-1534.21135
-U, --user USER
Set execution under specified user, ideal for restoring from user quarantine or
to view user reports.
e.g: maldet --user nobody --report
e.g: maldet --user nobody --restore 050910-1534.21135
-co, --config-option VAR1=VALUE,VAR2=VALUE,VAR3=VALUE
Set or redefine the value of conf.maldet config options
e.g: maldet --config-option email_addr=you@domain.com,quarantine_hits=1
-p, --purge
Clear logs, quarantine queue, session and temporary data.
```
.: 10 [ 每日 Cron 任务 ]
由 LMD 安装的 cronjob 位于 /etc/cron.daily/maldet,用于执行每日特征码更新,将会话、临时和隔离数据保留不超过 14 天,并对最近的文件系统更改运行每日扫描。
每日扫描支持各种控制面板系统或标准的 Linux /home*/user 路径。
如果您正在运行监控模式,每日扫描将被跳过,取而代之的是发出包含所有监控事件的每日报告。
如果您需要扫描额外的路径,您应该查看 cronjob 并使用其中一个自定义钩子文件,例如 '/usr/local/maldetect/cron/custom.cron',来编写自定义扫描执行。对于基于配置的 cron 更改,您可以在 '/etc/sysconfig/maldet' 或 '/usr/local/maldetect/cron/conf.maldet.cron' 中重新定义任何 conf.maldet 变量。
.: 11 [ INOTIFY 监控 ]
inotify 监控功能实时监控用户的文件创建/修改/移动操作。此选项需要支持 inotify_watch (CONFIG_INOTIFY) 的内核,该功能存在于 2.6.13+ 的内核中,并且 CentOS/RHEL 5 默认包含。如果您运行的是 CentOS 4,您应该考虑使用以下链接进行收件箱升级:http://www.rfxn.com/upgrade-centos-4-8-to-5-3/
监控器可以在三种模式下执行,它们与监控的内容有关,即 USERS|PATHS|FILES。
例如:maldet --monitor users
例如:maldet --monitor /root/monitor_paths
例如:maldet --monitor /home/mike,/home/ashton
选项细分如下:
USERS - users 选项将获取所有系统用户中 UID 大于 inotify_minuid 的用户主目录并进行监控。如果设置了 inotify_webdir,则仅监控用户的 webdir(如果存在)。
PATHS - 以逗号分隔的监控路径列表
FILE - 以行分隔的监控路径文件列表
一旦您在监控模式下启动 maldet,它将根据指定的选项预处理路径,随后启动 inotify 进程。启动 inotify 进程可能是一项耗时的任务,因为它需要为监控路径下的每个文件设置监控钩子。虽然启动过程可能会暂时影响负载,但一旦进程启动,它会将其所有资源保持在内核内存中,并且在内存或 CPU 使用率方面的用户空间占用非常小。
监控器的扫描组件监视来自 inotify 进程的通知,并默认每 30 秒批量处理要扫描的项目。如果您需要更严格地控制扫描计时器,可以在 conf.maldet 中编辑 inotify_stime。
监控模式下文件命中的警报是通过每日报告处理的,而不是每次命中都发送电子邮件。LMD 安装的 cron.daily 作业将调用 --alert-daily 标志,并发送过去一天命中的警报。还有一个 --alert-weekly 选项可以使用,只需编辑 /etc/cron.daily/maldet 处的 cron,并将 --alert-daily 更改为 --alert-weekly。
终止 inotify 监控是通过向 maldet 传递 '-k|--kill-monitor' 选项来完成的,它会触摸一个由 maldet 监控的文件句柄,在监控服务的下一个唤醒周期,它将终止自身及所有 inotify 进程。
.: 12 [ MODSECURITY2 上传扫描 ]
对 HTTP 上传扫描的支持是通过 mod_security2 的 inspectFile 钩子提供的。此功能允许使用验证脚本来允许或拒绝上传。
为此提供的便利脚本名为 hookscan.sh,位于 /usr/local/maldetect 安装路径中。默认设置是运行标准的 maldet 扫描,不支持 clamav,不执行清除规则,并启用隔离;这些选项的设置是出于性能与准确性的权衡,这是一个公平的折衷方案。
如果需要,可以在 hookscan.sh 文件中修改扫描选项,默认扫描选项如下:
--config-option quarantine_hits=1,quarantine_clean=0,clamav_scan=0 --modsec -a "$file"
在此使用场景中禁用 clamav 扫描存在明显的性能差异。原生 LMD 扫描引擎在单文件扫描方面比 clamav 扫描引擎快得多,差距很大。使用 clamav 进行单文件扫描平均大约需要 3 秒,而 LMD 扫描引擎需要 0.5 秒或更短时间。
要使用 mod_security2 启用上传扫描,必须在 conf.maldet 中设置启用 scan_user_access 选项(scan_user_access=1),然后将以下规则添加到您的 mod_security2 配置中。这些规则最好放在 cpanel 服务器的 modsec2.user.conf 文件中,或者放在您设置适用的规则文件的顶部。
/usr/local/apache/conf/modsec2.user.conf (或类似的 mod_security2 规则文件):
SecRequestBodyAccess On
SecRule FILES_TMPNAMES "@inspectFile /usr/local/maldetect/hookscan.sh" \
"id:'999999',log,auditlog,deny,severity:2,phase:2,t:none"
如果使用 ModSecurity >=2.9,您应该在 'SecRule FILES_TMPNAMES' 行之前设置 'SecTmpSaveUploadedFiles On'。
进行这些更改后需要重启 Apache 服务。
当发生被判定为恶意软件的上传时,它将被拒绝,并且 mod_security2 SecAuditLog 文件中会出现一个条目。在 cpanel 服务器和大多数配置中,这是位于 /usr/local/apache/logs 或 /var/log/httpd 下的 modsec_audit.log。
日志条目将类似于以下内容:
Message: Access denied with code 406 (phase 2). File "/tmp/20121120-....-file" rejected by
the approver script "/usr/local/maldetect/hookscan.sh": 0 maldet: {HEX}php.cmdshell.r57.317
/tmp/20121120-....-file [file "/usr/local/apache/conf/modsec2.user.conf"] [line "3"]
[severity "CRITICAL"]
将应用默认警报选项,并在发现命中时发送电子邮件。这可以通过编辑 --config-option 值在 hookscan.sh 脚本中进行更改。
要禁用警报,请将 email_alert=0 附加到 --config-option 值:
--config-option quarantine_hits=1,quarantine_clean=0,clamav_scan=0,email_alert=0
要更改上传命中警报的电子邮件地址,请将 email_addr=you@domain.com 附加到 --config-option 值:
--config-option quarantine_hits=1,quarantine_clean=0,clamav_scan=0,email_addr=you@domain.com
上传的性质决定了它们是由 HTTP 服务运行的用户执行的,或者是在 suexec 样式设置(即:phpsuexec)下的系统用户执行的。这需要更改 LMD 存储会话、临时和隔离数据的方式,以允许非 root 用户执行扫描。
鉴于 maldetect 安装路径归用户 root 所有,我们需要设置一个全局可写(777)的 pub 路径,或者在 pub 路径中填充用户拥有的路径。设置任何路径为全局可写是不可取的,因此创建了一个填充路径数据的功能。此功能由 --mkpubpaths 标志控制,每 10 分钟从 cron 执行一次,只有当 conf.maldet 中启用了 scan_user_access 变量时它才会执行。因此,确保在 conf.maldet 中将 scan_user_access 变量设置为启用(1)很重要,并且建议手动运行 'maldet --mkpubpaths' 以预填充用户路径。此后,cron 将确保新用户在创建后不超过 10 分钟内创建路径。
所有非 root 扫描,例如在 mod_security2 下执行的扫描,将存储在 /usr/local/maldetect/pub/username 目录树下。隔离路径相对于执行扫描的用户,因此用户 nobody 将位于 pub/nobody/quar/ 下。可以在上传命中的电子邮件报告中验证文件被隔离的实际路径以及执行扫描的用户。
要恢复在非 root 用户下隔离的文件,您必须向 LMD 传递 -U|--user 选项,例如,如果用户 nobody 隔离了您想要恢复的文件,可以按如下方式恢复:
maldet --user nobody /usr/local/maldetect/pub/nobody/quar/20121120-file-SFwTeu.22408
或者,一如既往,可以使用扫描 ID 进行恢复
maldet --user nobody 112012-0032.13771
.: 13 [ 清除规则 ]
清除功能在 clean/ 路径下查找以特征码命名的规则,这些规则可以由任何旨在清除文件中恶意软件的命令组成。清除规则必须使文件能够通过扫描而不触发 HIT,否则它会将清除操作归类为 FAILED。
假设我们一会儿有一种想要清除的恶意软件,它触发了特征码 "{HEX}php.cmdshell.r57.89"。其中的实际特征码字符串是 "php.cmdshell.r57","{HEX}" 只是定义格式,而 ".89" 是变体编号。因此,要为 php.cmdshell.r57 创建清除规则,我们需要添加一个文件 'clean/php.cmdshell.r57',它将对任何命中同名特征码的文件执行。
规则的实际内容应该是单行命令,将对命中的文件执行,例如执行看起来像这样:
YOUR_COMMAND MALWARE_FILE
因此,对于基于字符串的恶意软件注入,您可以轻松地在规则文件中加入带有适当模式的 'sed -i',以从文件中剥离字符串。一旦清除命令运行,将对文件重新扫描,如果它导致命中,清除将被标记为 FAILED。成功的清除总是导致文件在可能的情况下恢复到其原始路径、所有者和模式。
重要的一点是,清除功能是隔离的子功能,因此如果禁用了隔离,默认情况下,恶意软件命中将不会尝试清除。有两种解决方法,除了显而易见的打开隔离并重新扫描(这是浪费时间)。
最好的方法是启用隔离,然后使用 -q|--quarantine 标志批量处理扫描结果,这将隔离并清除文件。第二种是使用 -n|--clean 标志,它将尝试就地清除文件,无论是在隔离区还是文件的原始路径,只要能找到。
例如:maldet -q SCANID
例如:maldet --clean SCANID
标签:ClamAV, Cutter, GraphQL安全矩阵, HEX模式匹配, inotify, Linux Malware Detect, LMD, MD5校验, R-fx Networks, rootkit检测, TLS, Webshell检测, Web 安全测试, Web服务器安全, YARA, 云资产可视化, 入侵检测系统, 共享主机安全, 多引擎查杀, 威胁情报, 安全扫描器, 安全数据湖, 应用安全, 开发者工具, 开源安全工具, 文件隔离, 木马查杀, 结构化查询, 统计检测, 自动化安全, 逆向工程平台, 邮件告警, 防御工具