ZDI-23-1527和ZDI-23-1528:过度宽松的SAS令牌对PC Manager供应链的潜在影响
本文探讨了两种可能的情景,攻击者可能通过WinGet存储库、“aka.ms” URL和Microsoft官方子域名,利用过度宽松的共享访问签名(SAS)令牌劫持PC Manager的发布过程。如果攻击成功,网络犯罪分子可能破坏软件供应链以分发恶意软件,替换软件发布版本,并修改分发的PC Manager可执行文件。
文中详述的问题已报告给Microsoft并得到解决。本文还提供了避免类似潜在泄露的建议。
ZDI-23-1527:通过WinGet包劫持PC Manager
WinGet是Windows操作系统的包管理器,允许用户使用WinGet CLI安装包。包定义在Windows清单中明确,YAML文件可在GitHub存储库microsoft/winget-pkgs中找到。
在PC Manager的WinGet清单中,InstallerUrl的值包含一个SAS令牌。SAS令牌是签名URL,用于委托访问Azure存储账户,并可指定支持的IP地址范围、协议或可选的访问策略标识符。SAS令牌有三种类型:
- 用户委托SAS:使用Microsoft Entra ID凭据保护,最长有效期为7天
- 服务SAS:使用账户密钥保护,最长有效期为9,999年
- 账户SAS:使用账户密钥保护,最长有效期为9,999年
在发现的SAS令牌中,权限包括读取、写入、删除和列表操作(rwdl),有效期至2024年3月16日。通过该令牌,攻击者可以访问名为distributestorage的存储账户(位于Azure中国区域),并可能修改所有Microsoft PC Manager的发布版本。
尽管WinGet CLI会提示用户SHA256哈希不匹配,但用户可能因隐式信任而继续执行攻击者控制的恶意可执行文件。
此问题已报告给Microsoft,编号为ZDI-23-1527。
ZDI-23-1528:通过pcmanager.microsoft.com劫持PC Manager
进一步分析发现,用户还可以从pcmanager.microsoft.com安装PC Manager。当用户点击下载按钮时,会重定向到aka.ms/PCManager500000,最终下载URL包含另一个SAS令牌。
该SAS令牌同样具有rwdl权限,有效期至2024年3月6日。通过该令牌,攻击者可以访问名为pcmdistributestorage的存储账户(位于Azure全球区域),并可能修改所有通过pcmanager.microsoft.com分发的PC Manager发布版本。
与WinGet劫持相比,这种方法更具影响力,因为某些PC Manager版本默认启用自动更新,攻击者的恶意可执行文件可能传播到所有安装中。尽管MSI安装程序未数字签名,但攻击者仍可能滥用隐式信任,使用ZIP文件包含恶意脚本或使用泄露证书签名的二进制文件。
此问题已报告给Microsoft,编号为ZDI-23-1528。
解决方案
Microsoft在收到报告后,最初将过度宽松的SAS令牌更改为只读SAS令牌,随后将链接替换为Microsoft应用商店URL,防止直接下载二进制文件。对于WinGet清单,Microsoft在GitHub拉取请求中移除了SAS令牌。
挑战
SAS令牌在客户端创建,没有Azure日志生成。账户和服务SAS令牌从共享访问密钥生成,如果存储账户的访问密钥泄露,攻击者可以创建多个过度宽松的SAS令牌并保持对公开可访问存储账户的持久访问。要撤销SAS令牌,用户必须使用存储访问策略或轮换存储账户的访问密钥。
检测机会
要检测SAS令牌的使用,用户可以启用Azure存储分析日志,但可能产生额外成本。虽然无法直接推断SAS令牌,但可以利用AuthenticationHash查找使用的SAS令牌。日志还可用于收集以下信息:
- 数据外泄:检测异常大量数据被外泄到已知恶意或可疑IP地址
- 过度宽松的SAS令牌:检查存储账户是否被过度宽松的SAS令牌请求
- 匿名访问:确定存储账户是否可匿名访问
- 文件名启发式:检测敏感文件是否被已知不良IP地址访问
- 恶意IP:检测已知恶意IP地址是否成功访问存储账户
- 匿名或SAS令牌请求:检测是否有匿名或SAS令牌请求
- 可疑用户代理:检测可疑用户代理
要搜索代码库中的过度宽松SAS令牌,可以使用以下逻辑:
对于服务SAS令牌,检查URL参数:
- sp(SAS令牌权限):值以rw开头
- se(SAS令牌过期时间):值晚于当前时间
- 必须存在sig(HMAC-256编码签名)和sv(SAS版本)
对于账户SAS令牌,检查URL参数:
- sp(SAS令牌权限):值以rw开头
- se(SAS令牌过期时间):值晚于当前时间
- 必须存在sv(存储版本)、ss(可访问服务)、srt(签名资源类型)和sig(HMAC-256编码签名)
Trend解决方案
Trend Vision One™云风险管理是一个持续保障工具,提供750多个自动化最佳实践检查。用户可以利用以下Azure存储账户规则:
- 仅允许通过HTTPS使用共享访问签名令牌
- 检查过度宽松的存储访问策略
- 检查公开可访问的Web容器
- 禁用对Blob容器的匿名访问
- 禁用对具有Blob容器的存储账户的公共访问
- 启用不可变Blob存储
- 启用Azure存储Blob服务日志记录
- 启用Azure存储队列服务日志记录
- 启用Azure存储表服务日志记录
- 在Azure存储中启用安全传输
- 使共享访问签名令牌在一小时内过期
- 通过IP地址限制存储账户访问
结论
URL参数中的凭据是一个已知问题(如CWE-598),DevSecOps团队使用许多工具(如GitLeaks和Trufflehog)来扫描CI/CD管道中的凭据并提供警报。即使来自云提供商本身,也可能发生包含较少已知凭据的错误配置。
滥用泄露的SAS令牌并不新鲜;NotSoSecure的研究人员在2019年就探讨了相关风险。2023年6月,Microsoft修复了一个38 TB数据暴露事件,该事件由于过度宽松的SAS令牌导致员工备份和AI研究工件泄露。
我们强烈建议遵循Microsoft概述的以下最佳实践:
- 应用最小权限原则:将SAS URL范围限定为客户端所需的最小资源集(如单个Blob),并将权限限制为应用程序所需的权限(如只读、只写)
- 使用短期SAS令牌:创建SAS时始终使用近期过期时间,并在需要时让客户端请求新的SAS URL。Azure存储建议所有SAS URL的有效期为1小时或更短
- 谨慎处理SAS令牌:SAS URL授予数据访问权限,应视为应用程序机密。仅向需要访问存储账户的客户端公开SAS URL
- 确保有撤销计划:将SAS令牌与存储访问策略关联,以便精细撤销容器内的SAS。如果SAS或共享密钥泄露,准备好删除存储访问策略或轮换存储账户密钥
- 监控和审计应用程序:通过启用Azure Monitor和Azure存储日志跟踪如何授权对存储账户的请求。使用SAS过期策略检测使用长期SAS URL的客户端