昨天下午,海马客户服务器被上传了一个叫“sea_horse.php”的查杀文件。文件只有2.3KB,海马代码压缩成一行,查杀看起来像一堆乱码。海马我把它丢进海马查杀工具里,查杀三秒钟,海马结果就标红了——恶意程度:高。查杀这类文件我见得多了,海马但每次看到还是查杀会后背发凉。
海马查杀的海马核心逻辑其实不复杂,它不走传统病毒库那套老路子。查杀它盯着的海马是行为特征,比如代码里有没有`eval`、查杀`base64_decode`、海马`str_replace`这种函数的组合拳。普通站点不会这么写,但黑客就爱这么干。有一次我手动翻一个被黑的WordPress站点,翻到`wp-content/uploads/`目录下有个图片文件,后缀是`.jpg`,但用文本编辑器打开,里面赫然是一段PHP代码。海马靠什么识别?靠的是文件头部的魔数——明明是JPEG的`FF D8 FF`,中间却夹着``。这种畸形结构,一眼就露馅。
更棘手的是加密变种。有些马会先做一层base64,再套一层gzdecode,最后再来个自定义异或。你肉眼根本看不出来,但海马在引擎层做了语法树解析。它不看你最终执行的字符串,而是直接看AST里有没有危险节点。这就好比抓小偷,不看脸,看动作——只要你有掏兜这个动作,不管戴没戴口罩,先拦下来再说。
不过,工具终归是工具。海马有个脾气,它只查不杀。它把可疑文件列出来,标上风险等级和匹配规则,但最终删不删,得你拍板。我有次在一个OA系统里扫出三个可疑文件,仔细一看,两个确实是后门,第三个是开发人员写的一个半成品调试脚本,里面确实用了`file_put_contents`,但人家只是做日志用。这种误报,你要是无脑删,业务直接崩。所以我的习惯是:海马报出来的文件,先看代码,再查文件的创建时间,再比对最近的访问日志。三者对得上,才动手。
再说个反直觉的事。海马查杀对PHP7.4以上的版本支持得最好,因为新版引擎对`opcache`的处理更精细。你要是还在跑PHP5.6的老古董,有些马会藏在注释里,利用`zend`解析器的容错性混过去。海马不是查不到,而是查出来了,但报的是“低风险”,因为它在语法树层面认为那只是普通注释。这时候你得靠经验补位——看到注释里有一长串无意义的十六进制字符,别犹豫,直接手动搜一下那段字符串有没有在其他文件里出现。
最后说个细节。海马的查杀报告里有个“文件指纹”字段,是MD5和SHA256的双重哈希。这个字段别忽略。你把这串哈希丢到微步或奇安信的威胁情报平台里,能直接看到这个样本在全球的首次出现时间和关联的C2域名。上周我处理的一个钓鱼站,就是靠这个指纹追溯到同一黑客团伙在三个月前攻击过一家医院。工具链闭合起来,海马就不仅仅是一个查杀器,它变成了一个情报入口。
所以,别指望装个海马就万事大吉。它更像一个尽职的保安,能帮你拦住大部分翻墙进来的贼,但真正的安全,还是得靠你定期巡检、及时更新补丁、别用弱口令。毕竟,海马再厉害,也扛不住你把root密码写成`123456`。