跳至主要内容
全部往期

291 Intercept: 针对暴露 Git 仓库的探测在我们的基础设施上增加了一倍多

10 月 19 日当周,探测我们面向互联网的基础设施、搜寻遗留源代码仓库的来源数量比前两周的周均值增长了 137%。我们还发现,搜寻子目录中 .env 文件、云密钥文件和备份的扫描器也有所增多。

291 Intercept 简介

291 Intercept 是 291 Group 推出的全新每周系列。和所有联网的组织一样,我们面向互联网的基础设施每天都会被自动化扫描器探测,它们专找没关好的门:暴露的密码文件、被遗忘的备份、未打补丁的管理页面。每一期都会报告这些扫描器在一周内针对我们自有基础设施探测了什么,方便其他系统管理员和企业对照检查自己的系统。

每周内容包括:我们基础设施上值得关注的模式及其与上周相比的变化、流量的来源,以及一份供你检查自家服务器的简短清单。所有数据均为汇总数据。我们从不点名任何单个地址或系统,只纳入来自多个独立来源的模式。每一期所覆盖的统计周,至少在发布前 7 天就已结束。

10 月 19 日至 25 日,约 240 个来源探测了我们面向互联网的基础设施,搜寻遗留在 Web 服务器上的源代码仓库,比前两周的周均值高出 137%。它们请求的文件包括 /.git/config、/.git/index 和 /.svn/entries。在我们的基础设施上,本周吸引扫描器数量超过源代码的只有 WordPress。

与此同时,针对我们站点的相关搜寻也在增加。搜寻云密钥文件的来源增长了 51%,请求备份和数据库转储的来源增长了 75%。我们还发现扫描器集中探测了一批位于子目录中的 .env 文件,而此前它们受到的关注要少得多。这些目标都不是软件漏洞,而是有人忘记从公开服务器上删除的文件。

本周概览

我们共观察到约 660 个不同来源,较同一基准增长 28%。WordPress 登录、XML-RPC 和插件路径吸引的来源最多,占 56%。机密与配置文件占 32%。寻找 /info.php 等诊断页面的来源增长了 33%,探测 /actuator/env 等应用内部接口的来源增长了 37%。

在访问我们的来源中,88% 使用伪装成普通浏览器的 User-Agent 字符串,64% 来自租用的服务器。最常见的来源国家依次为美国、德国、荷兰、新加坡和印度。

暴露的 .git 目录如何让网站露底

大多数软件团队使用 Git 跟踪代码变更,每个 Git 项目都会把历史记录保存在隐藏的 .git 目录中。如果网站上线时是把整个项目目录复制到 Web 服务器上,这个隐藏目录也可能被一并复制,任何人只要请求其中的文件就能读取。

/.git/config 是针对我们面向互联网的基础设施请求最多的源代码路径之一。该文件记录了代码来自哪个仓库,有时还包含用于部署的凭据。扫描器还向我们请求了 /.git/head、/.git/logs/head 和 /.git/index,借此判断该目录是否有足够多的内容可读,值得进一步下手。一旦该目录暴露,攻击者有时能够还原完整的源代码和提交历史。

这种失误相当普遍。2026 年 2 月报道的一项研究发现,约有 4.96 百万台公开 Web 服务器暴露了 Git 元数据。其中 252,733 台的 config 文件包含部署凭据;同一份报告警告,这可能导致仓库被接管,进而引发供应链攻击。

藏在意外目录中的机密

扫描器会请求我们站点根目录下的 /.env,但本周也有许多扫描器转向了子目录。/mailer/.env 吸引了 40 个来源,是其此前均值的 7.8 倍。/live/.env、/mail/.env、/v3/.env、/sitemaps/.env、/releases/.env 和 /exapi/.env 各吸引了 40 个来源,约为各自此前均值的 6 至 7 倍。有 4 个路径首次出现在我们的流量中,每个约来自 10 个来源:/core/database/.env、/.changeset/config.json、/secrets 和 /settings/credentials。

对攻击者来说,这些文件值得花力气去找。Web 应用通常把 API 密钥、数据库密码和云访问密钥存放在 .env 文件中。2026 年 4 月针对某个大规模扫描器的一项调查发现,它从 900 多家被攻陷的公司窃取了 .env 文件,在 2026 年 4 月 10 日至 21 日期间共收集了超过 30,000 个不同的 .env 文件名。被盗的机密涉及 AI、云、支付和消息服务。

云凭据方面也呈现同样的模式。/application_default_credentials.json 吸引了 40 个来源,是其此前均值的 6.2 倍。扫描器还请求了 /service-account.json 和 /.config/gcloud/application_default_credentials.json。使用云命令行工具登录时会写入这个文件,而云服务商自己的指南指出,该文件以未加密形式存储,持有者可以无限期地申请访问令牌。如果它的副本落入 Web 根目录,发现它的攻击者在其被吊销之前将一直拥有访问权限。

一轮扫描,多个目标

有几组协同行动的来源对我们面向互联网的基础设施运行了相同的路径列表。其中一组有 20 个来源,分布在 7 个国家,请求了相同的 8 个路径,包括 /.git/config、/.env、/info.php、/config.json、/actuator/env 和 /server-status。它们大多在 60 小时内相继开始。另外两个较小的组各约 10 个来源,使用的列表要长得多,分别包含 210 个和 158 个路径。两个列表都包含 /.git/config、/.env.old 和 /.env.development 等 .env 变体,以及云密钥文件。

/actuator/env 路径也属于同一类。当 Java 应用的 Spring Boot Actuator 端点无需登录即可访问时,它会返回应用的环境变量和配置,其中可能包含数据库凭据和云密钥。遗留的 phpinfo 页面同样可能泄露环境变量;在我们的基础设施上,/admin/phpinfo.php 的来源数升至此前均值的 5.9 倍。在一个真实案例中,某个 WordPress 插件自带了一个任何人都能打开的 phpinfo.php。

WordPress 也遭遇了针对我们站点的专门攻势:来自 7 个国家的 20 个来源请求了 /xmlrpc.php,并在猜测出的目录下请求 wlwmanifest.xml 的副本,例如 /blog/wp-includes/wlwmanifest.xml 和 /wordpress/wp-includes/wlwmanifest.xml。在多个目录名下请求同一个文件,可以快速判断一个站点是否运行 WordPress,以及装在哪个目录。借助 XML-RPC,攻击者可以在单个请求中尝试成百上千个密码。

本周行动建议

  • 从外部检查。从不属于你的网络,对你的每个站点请求 /.git/config 和 /.env。如果任一请求返回了真实内容,就应假定它已经被人读取。
  • 部署构建产物,而不是工作目录。只发布站点所需的文件,并禁止通过 Web 访问 .git、.env 及其他隐藏文件。
  • 轮换所有已泄露的凭据。如果 .git 或 .env 文件曾可被读取,请更换其中包含的凭据和密钥。删除文件并不能撤销别人已经复制走的副本。
  • 不要把机密放在 Web 根目录中。将 .env 和云凭据文件存放在任何发布目录之外。如果某个凭据文件曾经暴露,请将其吊销。
  • 清理遗留文件。删除 /wp-config.php.bak 和 /database.sql 之类的备份,并移除 phpinfo 和调试页面。
  • 关闭管理端点。为 Actuator 端点加上身份验证,并在不使用 XML-RPC 的 WordPress 站点上将其禁用。

关于这些观察数据

本报告由 291 Group 的安全监控系统 291 Heat Seeker One 生成,该系统运行在我们自研的安全运营平台 291 Crossband 上。报告仅涵盖访问 291 Group 自有的面向互联网的基础设施的流量。

数据均经过四舍五入,占比和变化按独立来源数量而非请求数量计算,且仅纳入来自至少 20 个独立来源的模式。