03 漏洞从哪里来?——编程习惯
03 漏洞从哪里来?——编程习惯
原创 Richard 方桥安全漏洞防治中心 2025-02-15 06:19
代码质量直接决定系统安全性。编程习惯,或者“规范”,作为关键因素,直接影响漏洞产生的概率。
注入(OWASP A03:2021,
SQL注入、XSS等)、缓冲区溢出(如:CWE-120)等安全漏洞均来源于非常基础的编码缺陷(NIST IR 8397)。
硬编码凭证(CWE-259)、内存泄漏(CWE-401)等典型风险均可通过代码检查(如:使用SAST工具)和遵循安全编码规范来防范。
本文从编程习惯的角度出发,系统分析软件安全漏洞的来源。主要有 7 个来源:
输入处理、内存管理、错误处理、安全实践、代码维护、第三方依赖
和
配置管理
。
这 7 个来源可归入以下 3 个依次递进的层次:
1. 代码实现层面
2. 开发实践层面
3. 生态环境层面
【代码实现】
一、输入处理不严格
-
未验证用户输入
-
典型漏洞:SQL注入、命令注入、XSS攻击
-
原因:无脑信任用户输入,没有做“存在恶意行为”的合理假设。
-
数据类型溢出
-
典型缺陷:整数溢出、浮点溢出等数据类型溢出是新手程序员常犯错误。
CWE-190(整数溢出)常导致逻辑错误,如果用于指针则可能导致内存访问越界。 -
原因:对数据类型的表示范围没有概念,未执行检查或者未捕捉并处理异常,单方面依赖调用方“正确调用”,缺乏安全隔离。
-
案例:CVE-2002-0639 OpenSSH (2.9.9 ~ 3.3) 允许远程攻击者执行任意代码。
二、内存管理缺陷
-
内存分配/释放问题
-
使用缓冲区之前未初始化(
CWE-416) -
重复释放缓冲区(double-free)
-
分配内存失败后,未经检查就释放(
CWE-476) -
完成任务后未释放申请的内存,导致内存泄漏
-
指针使用不当
-
引用已释放内存的指针——悬垂指针(Dangling pointer)微软安全响应中心(MSRC)数据显示,2022年15%的内存漏洞源于悬垂指针。其危害包括:数据损坏(如:CWE-457)、任意代码执行、系统崩溃等(如:CWE-476)。
-
越界访问(数组越界、栈溢出、堆溢出等)指针越界访问是严重内存安全漏洞。MITRE统计显示,
2021 CWE Top 25中,约25%与越界访问(
CWE-125
Out-of-bounds Read,CWE-787
Out-of-bounds Write)相关。数组越界导致数据泄露(CWE-200),栈溢出
(CWE-121)可能导致控制流被攻击者劫持,堆溢出
(CWE-122)可能导致任意代码执行。
三、错误处理不完善
-
异常处理缺失
-
未捕获异常导致程序崩溃
-
错误代码忽略(如:未检查系统调用返回值)
-
错误信息泄露
-
暴露堆栈跟踪(生产环境开启调试模式)
-
返回过于详细的错误描述(如:SQL语句)
【开发实践】
四、安全实践不足
1. 密码技术使用不当
-
使用强度不足的算法(如MD5、DES)
-
硬编码加密密钥
-
未使用安全随机数生成器导致随机数碰撞概率明显增加
-
身份验证缺陷
-
会话管理不当(会话固定、超时缺失)
-
权限检查缺失(横向越权、垂直越权)
五、代码维护问题
-
复制代码和复用代码
-
复制粘贴(相同漏洞多位置存在)
-
集成未经审核的第三方代码
-
使用已废弃、不安全的功能
-
继续使用已废弃
函数(通常不安全,如:C语言的gets()) -
使用不安全的版本(如:SSLv3)
【生态环境】
六、第三方依赖风险
-
组件更新滞后
-
未及时替换存在已知漏洞的库版本
-
对组件依赖关系的管理缺乏安全考量
-
易受供应链投毒攻击的行为
-
未验证第三方组件完整性
-
使用来源不明的代码包
七、配置管理忽视安全
-
敏感信息暴露
-
配置文件包含明文密码
-
日志中记录敏感数据
-
权限配置不当
-
权限过高(如:以root权限运行应用)
-
文件权限设置宽松(如:全局可写)
总结与改进
这些编程习惯问题可通过以下方式改进:
1. 遵循安全编码规范
-
执行代码安全检查(如:使用SAST/DAST工具)
-
代码审核
-
持续学习安全开发技术、方法与工具
-
在CI/CD流水线中内置安全检查(依赖扫描、代码检测等)
编程习惯的改进需要长期持续的努力。希望通过本文开启更多探讨,唤起更多开发者对安全编码的重视,共同推动软件安全实践的进步。
使用大模型做基础开发正在形成一种趋势,而让大模型遵循上述方式改进代码安全可能具有突出的成本优势。笔者认为这点值得开发人员深思。
- End –
下期分享
04 漏洞从哪里来?——认知局限
基于认识局限的软件安全漏洞来源分析:角色认知盲区与技术领域盲点的MECE框架
推荐阅读
01 漏洞从哪里来?——综述
02 漏洞从哪里来?——设计缺陷