近日,知名软件供应链安全公司Snyk发布安全研究报告,指出GitLab平台上存在一种容易被忽视的配置误区——大量开源项目仓库虽然被标记为“公开”,但因所属用户账户或群组被设为“私有”,导致这些仓库在GitLab的搜索、列表等界面中显示为“不可见”,容易让开发者误以为代码已完全私有化,进而无意中向全网暴露敏感信息。Snyk警告称,这一“宣称公开、表现私有”的错觉正在成为开源社区新的安全盲区。
配置层级的“隐形裂缝”
GitLab的可见性控制分为三个层级:实例、群组(Group)和项目(Project)。正常情况下,若项目可见性设为“公开”,则任何人都可通过直接链接访问;然而,如果项目所属的账户或群组被设为“私有”,GitLab会默认不在公开搜索结果或群组列表中展示该项目,同时仓库主页的左上角也会显示“私有”标签。换句话说,尽管项目本身代码完全对外开放,但UI(用户界面)表现却与私有仓库无异。
Snyk的安全研究员在报告中指出:“很多开发者依赖UI上的私有标识来判断代码可见性,却忽略了底层访问控制的实际状态。他们可能将包含API密钥、数据库凭证甚至内部文档的代码放入这类‘显式私有’的公开仓库中,认为只有团队成员才能看到,实则任何拥有链接的人都可以拉取。” 研究人员通过扫描GitLab上数万个开源项目发现,大约有2.3%的公开仓库存在此类配置不一致问题,其中相当一部分仓库确实包含了硬编码的密钥或敏感配置。
风险链:从误解到泄露
这种配置歧义带来的安全风险链条十分清晰。首先,开发者在创建或迁移项目时,很可能因不熟悉GitLab的层级继承规则而错误设置。例如,一个开源贡献者新建了一个公开项目,却忘记检查自己账户的默认群组是否为私有,导致项目创建后自动继承了群组的私有属性。由于GitLab默认不强制要求可见性一致性,这种“矛盾状态”得以长期存在。
其次,攻击者可以利用这一盲区进行精准打击。由于“显式私有”的项目不会出现在公开列表里,普通搜索难以发现,但攻击者可以通过GitLab的公共API接口或历史缓存数据,结合暴力枚举项目ID的方式,批量探测这类“隐形仓库”。一旦发现其中包含未脱敏的凭证,就可能发起供应链攻击或定向渗透。
Snyk在报告中还引用了一个典型案例:某知名开源库的维护者将包含预发布版本密钥的配置文件提交到了其个人账户下的公开仓库,但由于该账户群组设置为私有,仓库在GitLab首页显示为“私有”,维护者一直以为只有合作者可查看。直到第三方安全团队扫描到该仓库并发出警告,问题才得以暴露。
官方响应与修复建议
针对Snyk的发现,GitLab官方回应称,这一行为符合平台设计逻辑——群组私有意味着该群组下的项目不会在群组外部展示,但项目本身的公开权限仍然有效。GitLab建议开发者在创建项目后,务必同时检查项目设置和群组设置中的可见性标签是否一致,并开启“锁定可见性”功能以防止继承混乱。
Snyk则发布了开源检测脚本gitlab-visibility-checker,可自动扫描指定GitLab实例上所有用户账户和群组的可见性配置,标记出存在矛盾的仓库。该工具已在GitHub上获得数百个星标,并被多家企业的安全运维团队采用。
安全专家进一步建议,开源维护者应建立统一的账户管理规范:将个人账户下的所有群组默认设为“公开”,或为开源项目单独创建专用群组并明确设置可见性。同时,任何包含敏感信息的文件在提交前都应通过git-secrets等工具进行扫描,不能依赖UI标签作为安全屏障。
透明与安全的平衡
此次事件再次凸显了软件供应链中“可见性”与“安全性”之间的微妙平衡。开源项目追求透明,但细微的配置失误就可能让透明变成风险敞口。Snyk的首席安全官在报告中总结道:“开发者应当认识到,UI上的‘锁头’图标并不总意味着代码是锁住的。真正的安全需要理解平台规则背后的逻辑,而非仅凭直觉。”
目前,GitLab已计划在未来的版本更新中增加“可见性冲突警告”,当项目可见性与群组可见性不一致时,在项目首页主动弹窗提示。对于数百万依赖GitLab托管开源代码的开发者而言,这无疑是一道及时的安全补丁。