漏洞挖掘的定义是什么?

1、 可以说,漏洞挖掘就像玩迷宫游戏,但这个迷宫不同于平常游戏中的迷宫,它有独特之处。
2、 一开始无法看清它的全貌。随着漏洞挖掘的深入,这个迷宫结构不断扩大,同时会出现多个起点与终点,但难以确定具体位置。尽管最终可能无法实现100%完整,但仍可以找到从A点到B点的一条明确路径。这是一个持续探索的过程。
3、 可以用这张图来描述:

4、 更具体地,漏洞挖掘可归纳为三个步骤:一是枚举程序入口,如交互接口;二是分析可能存在的不安全状态,即潜在漏洞;三是尝试通过已识别的入口触发这些不安全状态,从而验证漏洞的存在。
5、 在这个过程中,迷宫比喻为研究的应用程序,地图代表对程序的理解,起点是入口点(交互接口),终点是程序的不安全状态。
6、 所谓入口点,既可以是UI界面中显而易见的交互位置,也可以是较为隐晦和透明的交互形式(例如IPC)。以下是一些安全研究人员较为关注的重点方面:
7、 1. 应用程序中年代较久、长期未经历显著改动的代码片段。这些代码可能因历史原因存在潜在漏洞。
8、 2. 连接不同开发团队或开发者所编写模块的接口部分。由于开发背景和标准差异,这类接口可能存在兼容性或安全性问题。
9、 3. 调试与测试阶段遗留的代码。这些代码本应在发布正式版本时被移除,但由于疏忽而残留在最终程序中,可能成为安全隐患。
10、 4. 在C-S架构的应用中,客户端和服务端调用API时存在的差异部分,例如网页表单中的隐藏字段(hide属性),这些差异可能暴露额外的信息或逻辑漏洞。
11、 5. 不受终端用户直接操作影响的内部请求,如进程间通信(IPC)。这些隐藏交互可能成为攻击者的目标,需特别关注其安全性设计。
12、 在挖掘漏洞时,我会依据经验,重点研究可能对应用构成重大威胁的部分。借助轻量级威胁模型(如STRIDE),可帮助我们做出有效决策,明确优先级,提升测试效率。
13、 先看一个Web应用程序的漏洞示例,后续将介绍桌面程序。
14、 假设我们要分析的目标是一个单页面应用(SPA),我们已获得合法授权访问该应用,但对服务端一无所知,既没有源代码,也没有二进制文件。在这种前提下,枚举入口点可以通过探索应用的功能来理解其业务逻辑和功能模块。具体方法包括:抓取并分析HTTP请求以查看交互内容,或者检查客户端网页代码,找到表单提交等操作的相关信息。尽管如此,由于缺乏服务端细节,我们无法明确区分客户端与服务端API的具体差异。即便如此,上述手段仍能帮助我们定位一些潜在的入口点,为进一步研究提供基础。
15、 接下来,我们需要操作这些入口点,尝试让系统进入预期的不安全状态。由于漏洞种类繁多,通常要为测试的应用程序构建一套针对性的业务功能漏洞测试集合,以实现高效发现漏洞的目标。否则,可能会浪费大量时间在无效的测试上却毫无收获。例如,当后台数据库是 Postgres 时,用适用于 SQL Server 的 xp_cmdshell 进行测试,无论尝试多少次都不会有效果。因此,在设计测试集合时,必须深入理解应用程序的逻辑。下图直观地展示了低效测试集带来的问题。

16、 桌面应用的漏洞挖掘思路与Web程序大致相似,但存在差异。主要区别在于两者的执行方式和流程不同。下图展示了桌面应用漏洞挖掘的部分内容,供参考学习。

17、 与黑盒测试不同,白盒测试在拥有源代码的情况下,寻找代码入口和程序执行路径时的猜测性工作显著减少。此时,从入口点将数据载荷执行到不安全位置的效率,不如从不安全位置回溯至入口点高效。然而,在白盒测试中,由于个人知识的局限性,可能会对代码测试的覆盖率造成一定影响。
18、 掌握漏洞挖掘所需的相关知识
19、 漏洞挖掘所需知识极为广泛,且随时间而变,具体还取决于研究目标(如Web程序、桌面程序或嵌入式系统等)。然而,核心知识领域始终明确,可归纳为以下四个方面:
20、 程序正向开发技术是开发者必备的能力,涵盖编程语言、系统设计、设计模式、协议和框架等。具备丰富编程与开发经验的人,在漏洞挖掘时,通常比仅了解安全领域的人员,对目标应用有更深的理解,产出也更高。
21、 (2)攻防结合的理念。掌握从基础安全原则到不断演变的漏洞形态及其缓解措施,需要树立攻防一体的思想。这种理念不仅能够帮助研究者发现潜在漏洞,还能迅速提供有效的缓解和规避方法,从而全面提升安全能力。
22、 (3)工具的高效运用。熟练使用工具是将理论转化为实践的关键。这需要投入时间学习如何配置与操作工具,并将其灵活应用于具体任务中,逐步构建适合自己的工作流程以积累经验。更进一步,深入理解工具的工作原理并进行二次开发,可以显著提升其在实际工作中的效率。实际上,我认为基于过程的学习往往比单纯依赖工具的学习更有价值。当遇到工具瓶颈时,不要轻易放弃,而是尝试优化或改造它,甚至亲手开发适合当前需求的新工具。这一过程不仅能快速积累大量实践经验,还能为未来的漏洞挖掘工作奠定更坚实的基础。
23、 (4)对目标应用的深刻理解。最后也是最重要的一点,作为一名漏洞挖掘人员,必须对所研究的应用程序的安全性有超越开发者或维护者的理解。只有这样,才能全面分析程序中的潜在漏洞,并及时修复问题,从而确保系统的安全性。这种深入的理解是发现和解决漏洞的核心所在。
24、 下表总结了我认为挖掘Web和桌面应用漏洞所需的知识。由于个人水平有限,内容可能不够全面。
25、 这是我历经无数个不眠之夜、数千小时的钻研以及无数次试错所总结的经验。它能帮你提升挖掘漏洞的能力。前文介绍了所需的知识,而接下来将讲述具体的操作方法。
26、 在进行漏洞挖掘时,分析应用程序需要采取有效方法。我通常使用四个分析模型,所示。当遇到困难阻碍思路时,我会灵活转换到下一个模型。这种切换并非线性过程,虽然不确定此方法是否适合所有人,但对我而言非常有帮助。
27、 理解漏洞模型,假设场景尝试破坏程序,分析其安全性。
28、 (一) 使用案例分析
29、 程序用途分析旨在理解应用的功能与服务。每当我接触一个新的应用程序,首先进行的就是用途分析。同时,查阅与该程序相关的文档资料,能够帮助深入掌握其功能(如上图所示)。我始终遵循这一方法,力求全面了解程序的运作机制。
30、 也许,与直接构建测试用例进行检测相比,这项任务没那么吸引人。但它确实让我节省了大量时间。以我的一次经历为例,之前我在分析Oracle Opera(一款常用的酒店管理软件)时,发现了它的远程代码执行漏洞。当时,我借助用户手册定位了可能存在风险的数据表,从而高效地找到了该漏洞。
31、 对执行条件进行分析,明确实施所需的资源、环境及约束因素,评估可行性与挑战。
32、 执行条件分析旨在掌握应用运行所需的环境要素,如网络配置、端口使用等情况。可借助端口扫描、漏洞扫描等手段进行检测。配置不当往往可能成为安全隐患的根源所在。
33、 例如,一个系统级别的程序如果因配置错误,可能让低权限用户获得访问和修改的权限,从而引发权限提升漏洞。再如,某个网络程序本身没有问题,但由于服务器启用了匿名FTP服务,导致任何人都能访问该机器,进而使Web应用的源代码或敏感文件被暴露。这些问题从理论上讲并非程序本身的缺陷,但因执行环境的影响,最终形成了安全漏洞。这类情况表明,除了关注代码质量,还必须重视运行环境的安全配置。
34、 三、通信分析:研究信息传递过程,探讨沟通模式与网络结构特性。
35、 通信分析是对目标程序与进程或系统间的信息交互方式进行深度剖析。在此基础上,可通过发送特制请求等手段,诱导出不安全状态。这种方式广泛应用于挖掘Web应用程序漏洞,许多已知漏洞正是借此方法被发现的。
36、 在该模式下,我们必须对数据通信协议有清晰理解。若对协议格式不够了解,可采用黑盒测试技术来解决。具体方法是发送请求后,依据返回值判断系统是否出现异常情况。
37、 以下举个实例说明:假设有一个金融网站,其功能允许用户用不同货币购买预付信用卡。假设实现该业务的请求(Request)如下所示:
38、 fromAccount:购买预付卡所用的账户。
39、 fromAmount:从fromAccount转入预付卡的金额,例如100美元。
40、 cardType:需购买的预付卡种类(如USD、GBP等)。
41、 currencyPair:付款账户fromAccount与预付信用卡cardType的货币对,用于计算汇率,格式为货币代码组合(如CADUSD、CADGBP)。
42、 测试这类应用程序时,我们通常会先发送一条正常的请求数据,以便了解应用标准响应的格式。比如,使用CAD购买82美元预付卡的请求与响应表现所示的样子。
43、 我们可能不清楚程序在后台如何处理数据,但通过观察 status 字段的值,可以确认请求是否成功。如果将 fromAmount 参数设为负数,或者把 fromAccount 修改为其他人的账户,这个 Web 应用可能会返回错误结果,例如验证失败。此外,若保持 cardType 不变,仅将 currencyPair 从 CADUSD(加元对美元)改为 CADJPY(加元对日元),我们会发现返回值中 toAmount 字段从 82.20 变成了 8863.68。假如程序缺乏充分的校验机制,就可能存在漏洞,让我们以相同的成本获取更多资金。这种情况下,系统安全性将受到威胁,因此全面的参数验证至关重要。
44、 另一方面,若能获取后台代码或程序,事情将变得更有意思。我们可以轻易掌握后台运行逻辑,比如请求处理方式、可能的错误响应等。这有助于我们设计更具针对性的数据,从而对应用进行更有效的测试。
45、 四、代码与二进制分析:对软件代码和二进制文件进行深入检测,识别潜在安全问题。
46、 代码与二进制分析旨在掌握目标程序处理用户输入数据的方式及其执行逻辑。当前,动态和静态分析程序有多种方法,以下仅介绍部分相关技术。
47、 数据流分析在定位入口点以及追踪数据如何进入潜在风险状态方面非常有效。如果在通信分析中难以构造合适的请求,我会转而通过其他方式寻找不安全状态。在数据流分析中,可以先判断系统是否存在不安全状态,若存在,则继续追溯数据到达该状态的路径。这种方法的优势在于,一旦发现不安全状态,其对应的入口点也会随之明确,这为漏洞挖掘提供了重要线索和极大便利。
48、 在这个过程中,动态分析与静态分析必须紧密结合。比如,从A点到B点的路径规划中,静态分析如同查看地图以了解整体路线,而动态分析则像是实际行走在路上,需实时关注天气和交通状况。IDA与WinDbg的协作正是这种关系的体现。静态分析能够帮助我们掌握程序的大致框架,但不够深入;动态分析虽聚焦于局部细节,却能提供精确的信息。两者相辅相成,缺一不可。
49、 字符串分析和外部引用分析类似,通过解析程序中的字符串,可以加深我们对程序功能的理解。特别是调试信息、关键字、令牌,或是某些奇特的字符串,它们往往是重要的线索。跟踪和分析这些关键字符串,有助于发现更多程序入口点,从而更全面地挖掘程序潜在的漏洞与问题。
50、 应用程序通常依赖于外部组件,例如开源模块。这些模块自身的漏洞可能会被引入到应用中,形成隐藏的安全隐患。值得注意的是,现代程序普遍集成了大量第三方扩展模块,而这些模块中的漏洞极易影响主程序的安全性。例如,许多浏览器都使用 SQLite 进行数据缓存。如果 SQLite 存在漏洞,那么包括谷歌和火狐在内的浏览器都可能受到影响。因此,第三方模块的安全性对整体应用至关重要。
51、 代码分析往往比其他方法耗时更多,也更具挑战性。这是因为研究者需要对程序功能和技术运用的理解达到与开发者相当的水平。如果程序由团队维护,研究者要全面掌握相关知识就更加困难。然而,任何难题都可以通过钻研克服。正所谓只要功夫深,铁杵磨成针。
52、 我必须再次强调掌握编程能力的关键意义。若研究者对其研究领域中所用的编程语言和技术有深厚扎实的理解,就一定能创造出诸多有价值成果。从攻击角度看,这能使他发现更简单直观的漏洞,编写利用程序也更加熟练;从防御角度看,则能提供代码层面上极具针对性的修复建议,而非泛泛而谈的通用方案。
53、 四. 其他关于漏洞挖掘的思考(一) 漏洞复杂性分析
54、 漏洞的复杂性分布范围很广。有些漏洞极为简单直观,利用代码清晰明了,例如经典的SQL注入;而另一些漏洞则隐藏得更深,单个因素看似无害甚至安全,但当它们以特定方式组合时,就可能引发严重问题,比如竞争条件或复杂的逻辑漏洞。我试着根据复杂程度将漏洞分为一级漏洞和二级漏洞,当然也有其他分类方法。这里引用Project Zero的Ben Hawkes的一句话:
55、 如今,仅靠单一漏洞难以实现完整利用。通常需要一系列漏洞配合,才能达成系统妥协的完整攻击链。
56、 团队协作完成任务
57、 在团队合作中,我们可以更好地发现自身知识的盲区,并深化对已有知识的理解。但需要注意的是,在团队里要保持真诚的态度,知道就是知道,不知道就是不知道,切勿装作自己精通某些不熟悉的领域,因为真正懂的人很容易就能看出破绽。如果一个团队缺乏坦诚相待的氛围,那它并不能算作一个优秀的团队,这时候你可以考虑离开。在一个高质量的团队中,不要幻想别人会主动把所有经验都教给你,关键是要培养高效学习的能力,并通过交流与协作持续提升自我。
58、 最后的思考与总结
59、 谢谢您抽出时间读完我的文章,希望能帮您解开一些关于漏洞挖掘的疑惑。在学习漏洞挖掘时,遇到困难和迷茫是很常见的现象。学习就是不断尝试、逐步进步的过程。愿您在漏洞挖掘之路上越走越远,取得更多成果。