01 漏洞从哪里来?——综述

01 漏洞从哪里来?——综述

原创 Richard 方桥安全漏洞防治中心 2025-02-07 00:00

漏洞从哪里来?

漏洞从每一个你想得到和想不到的地方来。

本系列文章拟从
“设计缺陷、编程习惯、认知局限、体系痼疾(制度化)、视而不见(风险偏好)、引狼入室(供应链)、乌合之众(你没错,我没错,咱俩在一起就是错)、技术进步”等8个方面浅析各种导致安全漏洞的直接原因。姑且称为“八方来洞”。

咱们先约定一个概念:
所有的漏洞,都是软件的安全缺陷。

这样把安全漏洞问题纳入软件质量问题考虑,方便后续分析。

下面用大家熟知的两种软件工程模型(瀑布模型、敏捷开发)来看看软件安全漏洞都在哪里产生。

图:瀑布模型

左侧每个环节和底部的编码环节都有可能成为安全漏洞的来源。相信这一点也和大家的认知基本相符。

图:敏捷开发模型

在敏捷开发模型下,安全漏洞则可能来自每一轮冲刺(Sprint)。虽然根据敏捷开发”持续交付可工作软件”的核心原则,每一轮冲刺都应确认发现并排除漏洞,但实际上能够做到这点的团队少之又少。

为了看得更清楚,我们需要抽身出来,看看软件开发的
“环境”因素
人:
开发人员、程序员、软件工程师、系统分析人员、项目管理人员、产品管理人员、需求方、用户、监管方、甲方领导……

  • 组织:
    所有的人都属于或大或小的组织,即使是所谓的“独立开发人员”也不例外。

  • 管理制度与流程:
    每个组织都有成文或者不成文的管理制度与流程。包括为保障软件质量而设计的管理制度和流程。这些制度与流程一方面确实能够起到保障软件质量的作用;另一方面,制度与流程的副作用也会导致安全漏洞不能及时发现和纠正。特别是组织中的人员普遍倾向于僵化地执行流程,而非总是站在“质量”这个更大的目标,遵守更普适的质量原则去积极发现并解决问题。

  • 技术与工具:
    技术与工具既起到了支撑管理、强化技能的作用,确实能够有效地提升软件质量;另一方面,技术与工具也会削弱使用者的思考动力,遏制了发现问题的原动力。

在开发软件时,我们还需要考虑两种常见的安全漏洞来源:一是
静态组合缺陷;二是
动态运行时错

1. 静态组合缺陷导致软件出现安全漏洞

假设你正在使用两个流行的开源库
开发一个Web应用程序——一个是用于处理文件上传的库(Apache Commons FileUpload),另一个是用于生成PDF报告的库(iText)。虽然这两个库应用广泛而且相对安全,但两者搭配使用时,可能会导致一种特定场景下的安全漏洞。由于文件上传库对上传文件类型的验证不够严格,而PDF生成功能没有
充分检查潜在恶意内容,攻击者有机会通过上传特制的恶意文件执行跨站脚本(XSS)或远程代码(RCE)。这就是不同组件搭配使用时存在的
空隙”导致的安全漏洞。

2. 动态运行时错误导致软件出现安全漏洞

CVE-2022-22965: Spring Framework RCE via Data Binding on JDK 9+就是一个比较典型的例子。
使用Spring Framework开发的应用,运行环境是JDK 8,就不受这个漏洞影响;运行环境是JDK 9或者更高的版本,就受这个漏洞影响。

正是这种“八方来洞”的现实导致一个又一个安全漏洞经常以一种“意料之外、情理之中”的姿态蛮横地盘踞在软件中,让数字空间充斥着陷阱、沼泽、悬崖、深渊等危地,也不乏浅坑、沙眼、裂缝等安全隐患。

  • End –

下期分享

02 漏洞从哪里来?——设计缺陷

“设计缺陷”可能是安全漏洞最主要的来源。