Author: 弗为@ASRC
软件供应链安全态势,以及『功守道』比赛整体的目标和愿景,请参考系列前篇。一言以蔽之,就是针对构成互联网全链路的软件系统中,以往被无条件信任、但实则仅仅因为曾被集体忽视的薄弱环节,尝试挖掘各种非传统的攻击面、攻击姿势,激发应对威胁的规模化前摄性缓解方案研究。
每个赛季,我们关注软件供应链中的一个关键环节。在之前结束的赛季中,我们探讨了针对互联网最基础软件设施——Linux操作系统、基础开源软件组件的可能风险。而在刚刚结束的第二赛季中,我们关注的场景放在了与“人”更贴近的方面。
个人电脑在企业的环境之下,有两种角色。作为个人使用的办公、计算、处理设备,对其进行控制权窃取、个人信息窃取,可完成浅层次的攻击;作为企业办公文档编辑的终端、代码资源的开发平台、接入企业生产环境和代码仓库的节点,以其作为跳板可以完成对企业资产安全的威胁。
Windows上软件的分发一般采用PE二进制程序文件的形式,这决定了从本质上讲,相比于海量开源软件代码,这一赛季中载体内攻击载荷的隐蔽性、开放性更强,威胁场景也更为泛化:
IT企业员工工作电脑环境复杂且无法收口:安装软件来源往往跳出白名单,而鱼龙混杂的下载服务往往包藏祸心;遑论即便是开放软件的开发者,也可能存在被入侵并在源代码或二进制文件层面植入恶意代码的情形,导致潜在的官方不可信,亟需二进制审查,或源码-二进制等价证明。
对于给定的二进制文件,你将采用静态还是动态的方法去扫描或测试?针对有可参考源代码的二进制分发包,是否有能力通过同源性判断察觉异样?这是道开放题目。
PE二进制赛季共两轮分站赛。相比于C源代码赛季按照难度递进方式划分的三轮分站赛,PE赛季则针对不同的场景进行设计,两轮比赛分别针对“软件供应链上游(生产者)”和“软件供应链下游(消费者)”场景设计。而受制于比赛对抗形式和二进制特殊性限制,我们在这两个子场景上都不强调覆盖问题的全面性,而聚焦在一个特定的问题上。
企业作为软件和服务供给侧,软件开发者是上游源头角色,而使用工作电脑进行开发的的工具链(如各类IDE软件、开发库),就是处于软件供应链最上游的存在。
针对个人开发环境,如果能够污染到开发集成工具链,那么对于企业最核心的资产——代码,就能够最直接地获取甚至篡改。因此在这个场景下,我们将聚焦在一个特定的开发工具上,对开发工具链安全进行反思。
企业员工办公电脑上当然有很多的高价值资产,如各种文档文件;但最重要的资产永远是企业线上环境的稳定和安全,从这角度说,员工直接无条件信赖使用、但潜在风险最高的软件,就先要说到远程连接客户端软件。如果能够污染到企业运维人员的远程连接终端程序,那么不止能够有机会掌控本应加密渠道内传送的信息,甚至可以将隔离的线上生产环境撕开一个入侵的口子。
此外,考虑从一个看似无害的客户端软件,从其大量正常操作中区分辨识出可疑的行为,那么最高级的隐藏性就体现为对载体程序原有功能、逻辑的复用。沿此思路,在一个网络客户端软件中潜藏的信息获取和网络外传泄漏最难发现,因此也是我们重点考察的一个赛点。
每一轮分站赛,我们都将把目标设定到一到两个代表性软件,以及围绕该软件的若干支撑或扩展程序、组件上。比赛目标设置为Windows 32位。
软件本身可能由一个或多个可执行文件、动态链接库文件组成,相关程序、组件或扩展也为PE文件。所有相关PE文件都可能搭载有恶意代码。作为题目的软件不保证在直接执行时就会直接触发任意形式的恶意行为,所以解题队需要自行保证环境安全;而软件也不会进行无关的、极大提升解题难度的加壳保护;但可能会做贴近真实场景,对二进制程序进行一定程度上的置乱和混淆,以确保解题队通过简单的比对方法就能够进行问题定位。
Windows上二进制程序向来是恶意程序的主要战场,各式各样的恶意行为不胜枚举;本次比赛不排斥使用典型已知恶意代码,但是均紧扣“软件供应链安全”主题以及上述场景。
类似的,业界与学术界针对PE程序进行分析的方法和研究,也非常丰富,涵盖了静态、动态,人工、自动。各种方法往往有其专长的适用问题域,也可以进行整合,这些都将是我们欢迎的思路。
因此,我们针对本赛季,从题目设计和解题预期两方面,都将不设严格的限制,不给出条例清晰的“考题范围”;但是为了有效引导出题脑洞方向,以及解题队知识积累、方法选用,我们做如下一些形式化要求:
在先需要特别强调的概念是,类似于C源代码赛季我们看到的,在一个软件系统中,针对特定软件目标发起攻击,不一定来源于相关软件或组件的污染;一旦攻击者可以污染任意的程序,那么从这个程序中,被触发的恶意行为能够实现的行为是同样具有威胁的。从这个角度考虑,例如为了实现对开发环境上源代码文件的篡改污染,不一定需要在IDE软件上动手脚,在任意程序中植入遍历本地文件的恶意代码片段都可以达成;但是,如果是在IDE中插入恶意代码,那么这个代码片段具有访问代码内容的先天上下文,可以更具有针对性,相关行为也可以更隐蔽。所以,在本赛季我们选定的赛题的载体工程(污染目标),都是与当轮场景直接相关的软件。
在本轮比赛中,我们唯一选定一款开源IDE软件:Code::Blocks,作为目标载体。该软件有扩展机制,并有一定数量的官方、第三方插件,软件本体、插件均为C++语言开发。软件本身工程模块化,若干功能模块为开源项目纳入,因此该软件本身功能代码基本自包含。
同时,围绕该软件展开,比赛指定若干开发工具链通用工具,也是该软件中污染代码可能针对的攻击目标、数据窃取渠道,包括开发库,代码版本控制终端软件等;除此以外,任何在终端电脑上可能存在的开发资源和工具,如各种语言的代码文件、工程文件,都是本轮比赛赛题可能针对的目标。
在本轮比赛中,我们选定了两款开源客户端软件为目标载体。
其中一款是一个本地客户端软件ConEmu,它是很多第三方Windows系统上cmd替代软件的底层实现。作为一款终端,其中本身出现文件操作、网络行为都是貌似合理的。同时,该外壳类软件结合、集成有多类远程连接和shell工具,因此作为一个出口,可能在这个层面对多种基础客户端软件进行信息窃取或攻击。另外,该软件自身的实现,依赖于对其中执行进程的hook等不常见操作,攻击者可以借用、仿照这样的行为和逻辑,而解题方则面临从中进行恶意行为判别的更高难度。
另外一款是一个网络客户端软件eMule,它是一个老牌开源p2p下载管理软件。作为p2p软件,其自然地以磁盘文件访问甚至遍历、下载与本地资源上传、网络端口探测等行为作为基本常规操作,因此很多预想中的软件供应链攻击行为,例如搜索本地特定数据文件、代码资产文件并进行网络传出泄漏的模式,在这个软件中更难以区分,是一个具备很强欺骗性的对象。
考虑到本次比赛赛题不是传统恶意软件,由主流杀毒软件引擎无法检出,为防止流失到社会上造成真实风险,组织方尽量保证题目不传播、不外泄、可判别。
软件在启动过程中增加了弹框进行“软件特殊场景拷贝、存在恶意代码”的警示,并对启动过程相关函数进行加壳混淆,初步保证无法直接将二进制程序文件被直接流失到外部扩散使用。除此以外,我们将三款被修改软件中存在恶意代码片段的文件SHA256公开,用以引导业界相关检测方对这些文件的发现和响应:
# Code::Blocks
f8f59f4a417a1cc6006a0826ae8863e64f565df8478657a8635a9d321c908539 *autorevision.exe
22808cb74a5e038958813d999ae214b06d08321f597ee436a1e8c53716c2dccc *cb_console_runner.exe
6eeca307be321870c6a0a0c91f0665649e2470334e7372dd9701d91545fd6660 *codeblocks.dll
8bceffd76ddfab3861c657695765bc1bdc092617cd677cd63a1cf5f7e7fec146 *codeblocks.exe
1339b2de06cf83b2f7c6f83b48f1bc8a3d64f696788293e86c4a0dea4a62274c *abbreviations.dll
f9ab0deb5c87aefec6c32589c640de1a06838d5cdcc5cac7ca251623053bf2d4 *autosave.dll
4517a8bdd5993d2b438cefafe2c06e2dc3baba6b6194bb3a9dd2bf36f764d636 *classwizard.dll
9f1a28d998343a6395c3bb07cc92d893e076f0ba89f50e4f7fc7b622910a7b7f *defaultmimehandler.dll
5cfcb7f143f11e7b152d546da36031a7464e112e0fa056e99a8af9fb563bd01e *debugger.dll
1bc7cc00b2325c358c018e64e5aa8de4cb3db962ccd529929544a33ca262977e *compiler.dll
06e0a16353d50e03e9f7026b58f5317e27c1925aa0465551a4b091dfe87583d3 *EditorConfig.dll
b92b5be5da0fa1b01d823a8dab1b73f45e984c274a0b17b3938495dcd485f976 *FileManager.dll
249ed7e1c91f7289487f28b2dcc759e6eea2615a63a255b906a9f543f0690c23 *openfileslist.dll
f90c8fd13af6347a408ddb968ebc7560240ef053bb9f52f461a25ee33f1b9153 *xpmanifest.dll
# ConEmu
887f4627e0da26a50851634ecef7106bbcc5b1db3a510450cad2757edf4d333d *ConEmu.exe
4f71dbf6f95a3702d81de7eb7f1f7470821bad58d944f922033900b3a58e63ea *ConEmuC.exe
37e66ee0b610e2070bb3eca935805e96a9dc12a49ddf03eca550777d184d05e3 *ConEmuCD.dll
# eMule
09e6a93b6cc560f3d50482415cd95d0dabe993a3a8c8f2912ffb6d73b95d4f66 *emule.exe
以上进行了本赛季的考量与详细设计陈述。在已经发布的下篇中,对我们本赛季中最能代表场景意图、代表出题脑洞、代表迫切风险的精选题目进行讲解,同时还对头部解题队的解题思路进行公开,欢迎参阅。