CVE-2026-4020攻击者中99%来自同一客户端:Google云舰队伪装扫描
1. 同一客户端主导攻击
几乎每一个我们记录的利用Gravity SMTP凭证漏洞的IP都共享同一个HTTP指纹。其背后是一个由数千个短生命周期实例组成的Google Cloud舰队,通过3,299个轮换的用户代理(User-Agent)进行伪装,扫描超过36,000个端口以寻找.env文件、Git配置、凭证和数据库转储。CVE-2026-4020看起来像是一场常见的争夺战。WordPress的Gravity SMTP插件提供了一个REST端点(/wp-json/gravitysmtp/v1/tests/mock-data),其权限检查仅返回true。添加参数?page=gravitysmtp-settings后,任何未经身份验证的访客都能获得一份365 KB的系统报告,其中包含插件的SMTP凭证、SendGrid和Mailgun API密钥以及DKIM令牌。CrowdSec将其标记为正在被积极利用,在5月27日至6月1日期间记录了412个不同的IP访问该端点。我们的传感器记录了566个IP尝试访问该端点。其中561个(占99.1%)发送了相同的HTTP客户端指纹。看似数百个独立攻击者在争夺一个新凭证漏洞,但几乎每个地址都属于同一个操作。
2. 一个客户端,3,299种伪装
该指纹是一个JA4H哈希值:ge11nn0500_9af7e0472034。JA4H基于HTTP请求的结构构建,包括方法、版本以及请求头的顺序和集合,而非客户端为融入环境而设置的任何每请求参数。在我们的数据中,这一个哈希值覆盖了来自92个网络、43个国家的3,158个源IP的480,973个请求,时间可追溯至2月19日。操作者知道IP和用户代理是防御者过滤的两个字段,因此他们同时混淆了这两者。这3,158个IP分布在92个不同的网络中,因此地址黑名单从未生效。这些请求携带了3,299个不同的用户代理字符串:包括2010年的BlackBerry 9800、Android 1.5的T-Mobile G1、Knoppix、SeaMonkey 2.0.12,以及过去十年中已淘汰的浏览器,每个请求随机选择。没有真实的设备舰队会呈现这种特征。在所有这些伪装之下,都是同一个JA4H。用户代理是他们轮换的部分;而握手(Handshake)是他们无法改变的部分。
3. 收集目标
这不是一个漏洞扫描器。对其请求的904个路径进行排序后,发现最前面没有漏洞利用、shell命令或登录暴力破解。大约四分之三的请求指定了特定的秘密、密钥或配置文件:.env及其变体(.env.local、.env.production、.env.backup、backend/.env)约占所有流量的四分之一;.git/config在31个目录前缀下被请求(如/app/.git/config、/laravel/.git/config、/wordpress/.git/config、/api/.git/config),以捕获所有可能检出仓库的位置;凭证和云密钥文件:/api/credentials.json、/private/credentials.json、aws.json、gcp.json、service-account.json、firebase-adminsdk.json;基础设施状态和配置:terraform.tfstate、terraform.tfvars、settings.py、Dockerfile、config.yaml、config.js;框架泄露:Spring Boot的/actuator/configprops、/actuator/threaddump和/actuator/logfile,Symfony的/_profiler/phpinfo,普通的phpinfo.php,docker-compose.prod.yaml;shell和数据库遗留文件:.bash_history、/data.sql。CVE-2026-4020是该列表中的最新条目。该操作并未将其视为一个CVE;而是将其视为另一个返回凭证的文件。当下一个未经身份验证的信息泄露漏洞出现时,它会被追加到列表中,并在下一轮扫描中被利用。这就是为什么一个发布仅一周的CVE就已经有数百个源IP在利用它:收集器在漏洞出现之前就已经在运行了。
4. 在他人云上按日租用
百分之八十七的流量(来自2,776个IP的419,931个请求)来自一个网络:Google Cloud,AS396982。这些地址解析为至少十个国家的通用*.bc.googleusercontent.com实例,其中美国最多(1,001个IP),但也包括德国、加拿大、比利时、印度、荷兰、英国、澳大利亚、香港和巴西。这不是一个由被入侵的家用路由器组成的僵尸网络。这是一个在超大规模云平台上启动的舰队,使用付费或被盗账户。从2月到6月初,它每天通常只使用几十个源IP,偶尔有小幅增长,然后突然激增。仅在6月14日,该指纹就来自1,799个IP,其中1,779个在Google Cloud上,每个IP处理多达590个相同的路径。在6月14日和15日两天内,它从2,443个不同的实例运行,产生了该指纹48.1万个生命周期请求中的约37.4万个。到6月16日,它就消失了。启动舰队,扫描两天,然后关闭。它也不仅限于Web端口。同一个指纹触及了超过36,000个目标端口,针对任何可能响应HTTP的服务尝试其秘密文件字典。端口列表涵盖了开发者基础设施:Docker(2375、2376)、etcd(2379、2380)、Kubernetes(6443)、MongoDB(27017)、Postgres(5432)、Elasticsearch(9200)、Kibana(5601)、CouchDB(5984)、RabbitMQ(15672)、Neo4j(7687),以及4,128次对Ollama API(端口11434)的访问。任何暴露的服务,它都想要其背后的环境块。
5. 为何一个漏洞看起来像多个攻击者
不同的IP计数(包括我们的)衡量的是一个操作租用了多少主机,而非有多少个操作。以我们记录的566个IP为例:通过指纹去除伪装后,它归结为一个操作,该操作至少从2月起就维护着一个最新的秘密字典,并将每个新的信息泄露漏洞添加到其中。CrowdSec从另一个传感器网络观察,在更窄的时间窗口内记录了412个这些IP。两个观察点,两个计数,同一个活动。指纹是显示背后只有一只手的关键部分。这是其他团队从各自观察点看到的批量收集端。DFIR报告记录了Bissa扫描器在4月的11天内收集了30,000个不同的.env文件,并将其上传到云存储。Google的2026年上半年威胁视野报告指出,83%的云入侵涉及身份泄露,其中很大一部分是由此类暴露的秘密引发的。这个指纹就是该供应链前端的近距离视图:一个一次性的、云租用的收割机。
6. 应对措施
如果你是目标运行者,持久的修复措施是不提供这些文件。确保.env、.git、actuator端点、分析器和数据库转储不暴露在互联网上,并轮换任何可能被365 KB的Gravity SMTP报告泄露的秘密,因为如果你在6月那个窗口期暴露了,这些秘密几乎肯定已被读取。更新到Gravity SMTP 2.1.5可以关闭一扇门,但字典中的其余部分仍然存在。如果你是防御者,IP黑名单在这里永远无法奏效,用户代理规则也不行,因为操作者将两者都视为可丢弃的。唯一无法廉价改变的是其客户端本身的结构。一个单一的JA4H哈希将566个匿名地址转化为一个你可以命名和追踪的操作。这才是真正区分噪音的地方。
🔗 原文链接:https://honeylabs.net/blog/the-cloud-fleet-behind-cve-2026-4020