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. 生态环境层面

【代码实现】

一、输入处理不严格

  1. 未验证用户输入

  2. 典型漏洞:SQL注入、命令注入、XSS攻击

  3. 原因:无脑信任用户输入,没有做“存在恶意行为”的合理假设。

  4. 数据类型溢出

  5. 典型缺陷:整数溢出、浮点溢出等数据类型溢出是新手程序员常犯错误。
    CWE-190(整数溢出)常导致逻辑错误,如果用于指针则可能导致内存访问越界。

  6. 原因:对数据类型的表示范围没有概念,未执行检查或者未捕捉并处理异常,单方面依赖调用方“正确调用”,缺乏安全隔离。

  7. 案例:CVE-2002-0639 OpenSSH (2.9.9 ~ 3.3) 允许远程攻击者执行任意代码。

二、内存管理缺陷

  1. 内存分配/释放问题

  2. 使用缓冲区之前未初始化(
    CWE-416)

  3. 重复释放缓冲区(double-free)

  4. 分配内存失败后,未经检查就释放(
    CWE-476)

  5. 完成任务后未释放申请的内存,导致内存泄漏

  6. 指针使用不当

  7. 引用已释放内存的指针——悬垂指针(Dangling pointer)微软安全响应中心(MSRC)数据显示,2022年15%的内存漏洞源于悬垂指针。其危害包括:数据损坏(如:CWE-457)、任意代码执行、系统崩溃等(如:CWE-476)。

  8. 越界访问(数组越界、栈溢出、堆溢出等)指针越界访问是严重内存安全漏洞。MITRE统计显示,
    2021 CWE Top 25中,约25%与越界访问(
    CWE-125
    Out-of-bounds Read,CWE-787 
    Out-of-bounds Write)相关。数组越界导致数据泄露(CWE-200),栈溢出
    (CWE-121)可能导致控制流被攻击者劫持,堆溢出
    (CWE-122)可能导致任意代码执行。

三、错误处理不完善

  1. 异常处理缺失

  2. 未捕获异常导致程序崩溃

  3. 错误代码忽略(如:未检查系统调用返回值)

  4. 错误信息泄露

  5. 暴露堆栈跟踪(生产环境开启调试模式)

  6. 返回过于详细的错误描述(如:SQL语句)

【开发实践】

四、安全实践不足
1. 密码技术使用不当

  • 使用强度不足的算法(如MD5、DES)

  • 硬编码加密密钥

  • 未使用安全随机数生成器导致随机数碰撞概率明显增加

  • 身份验证缺陷

  • 会话管理不当(会话固定、超时缺失)

  • 权限检查缺失(横向越权、垂直越权)

五、代码维护问题

  1. 复制代码和复用代码

  2. 复制粘贴(相同漏洞多位置存在)

  3. 集成未经审核的第三方代码

  4. 使用已废弃、不安全的功能

  5. 继续使用已废弃
    函数(通常不安全,如:C语言的gets())

  6. 使用不安全的版本(如:SSLv3)

【生态环境】

六、第三方依赖风险

  1. 组件更新滞后

  2. 未及时替换存在已知漏洞的库版本

  3. 对组件依赖关系的管理缺乏安全考量

  4. 易受供应链投毒攻击的行为

  5. 未验证第三方组件完整性

  6. 使用来源不明的代码包

七、配置管理忽视安全

  1. 敏感信息暴露

  2. 配置文件包含明文密码

  3. 日志中记录敏感数据

  4. 权限配置不当

  5. 权限过高(如:以root权限运行应用)

  6. 文件权限设置宽松(如:全局可写)

总结与改进

这些编程习惯问题可通过以下方式改进:
1. 遵循安全编码规范

  1. 执行代码安全检查(如:使用SAST/DAST工具)

  2. 代码审核

  3. 持续学习安全开发技术、方法与工具

  4. 在CI/CD流水线中内置安全检查(依赖扫描、代码检测等)

编程习惯的改进需要长期持续的努力。希望通过本文开启更多探讨,唤起更多开发者对安全编码的重视,共同推动软件安全实践的进步。

使用大模型做基础开发正在形成一种趋势,而让大模型遵循上述方式改进代码安全可能具有突出的成本优势。笔者认为这点值得开发人员深思。

  • End –

下期分享

04 漏洞从哪里来?——认知局限

基于认识局限的软件安全漏洞来源分析:角色认知盲区与技术领域盲点的MECE框架

推荐阅读

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

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