微软开源在自家程序代码中侦测SolarWinds恶意程序的工具

SolarWinds供应链攻击事件爆发以来,受害组织名单逐渐增长。微软上周宣布将其检查软件程序代码有无问题的CodeQL查询方法开源出来,让所有企业也能用来检查自家产品或系统的安全性。

CodeQL是一个开源的程序代码语义分析引擎,可供开发商以QL语言撰写查询,以检查程序代码中是否有漏洞及变种,也期望开发商将查询分享给其他人。CodeQL项目现在托管在GitHub上。

微软指出,这次开源出来的CodeQL C#查询是该公司大规模分析其程序代码,最后排除和SolarWinds(微软称之为Solorigate)有关的程序代码层级的入侵指标(Indicators of Compromise,IoC)及程序代码编码模式,让别的单位也能执行类似分析。

SolarWinds事件爆发之初,微软就披露在内部服务器发现恶意二进制档,之后也坦承黑客曾访问其程序代码、并下载了Azure、Intune与Exchange组件程序代码。但微软强调这些并没有影响该公司提供给客户的产品或服务。

微软指出,SolarWinds/Solorigate攻击的重要特征,是让攻击者得以修改SolarWinds公司的Orion产品的二进制档,这些二进制档再以合法更新途径传播到SolarWinds客户端,使攻击者可远程执行恶意活动,像是窃取登录凭证、升级权限、横向移动以窃取敏感信息。SolarWinds攻击规模之大,微软认为至少有1000名以上的工程师涉及其中。

微软指出,和其他许多分析工具不同,CodeQL的分析分成两部分。第一步,它将原始程序代码汇编成二进制档的模型创建起数据库。针对直译语言(interpreted languages),它会分析来源,并创建一个自有的抽象语法树(abstract syntax tree)模型的数据库。第二步,数据库建好后,就能像其他数据库一样提供反复查询。CodeQL语言是为了从数据库中轻易挑选出复杂的程序条件而设计。微软说,CodeQL特别好用是因为这两阶段分析法有许多用途,包括可在开发阶段以及开发完成后的程序代码检查中都使用静态分析。

微软安全团队把全微软产生的多套build系统或pipeline的CodeQL数据库,集结起来成为单一、中央化架构,以便扩大CodeQL数据库的查询广度。集结CodeQL数据库让他们得以对多套codebase进行语义搜索,根据build的部分特定程序代码搜索跨多个程序集(assembly)、函数库(libraries)或模块(module)的程序条件(code condition)。微软通过这个方法分析几千个存储库(repositories),并在漏洞变种披露几个小时内找到它们,也因此快速调查出Solorigate恶意嵌入程序的样态。

现在微软的CodeQL C#查询已经在Github上线,其中的Solorigate-Readme.md包含每种查询及程序代码层级IoC的详细描述,也为其他查询作者提供设置或调整查询提供指引。

但微软也提醒这些查询有其限制。首先,这批查询方法仅适用于和SolarWinds/Solorigate嵌入程序在语义元素(如名称、字符或字符串等)或功能相近的程序代码。这偶尔也会出现在良性程序代码中,因此所有查询结果都必须进一步检查。此外,攻击者也可能采用其他功能或程序代码编写形态的程序代码进行攻击,如果嵌入程序和Solorigate中的嵌入程序差太多,微软的查询方法就帮不上忙了。微软提醒,这次公开的查询只能作为安全审核的一部分措施。

GitHub不久后也会公布如何为现有CodeQL客户部署这些查询的指引说明。

美国政府表示,SolarWinds的恶意程序已黑入9个联邦政府单位及100家民营企业,包括微软、FireEye、Malwarebytes等。