03 漏洞从哪里来?——编程习惯

admin 2025年2月15日20:56:01评论19 views字数 1769阅读5分53秒阅读模式

‍‍

03 漏洞从哪里来?——编程习惯

代码质量直接决定系统安全性。编程习惯,或者“规范”,作为关键因素,直接影响漏洞产生的概率。

注入(OWASP A03:2021,SQL注入、XSS等)、缓冲区溢出(如:CWE-120)等安全漏洞均来源于非常基础的编码缺陷(NIST IR 8397)。

硬编码凭证(CWE-259)、内存泄漏(CWE-401)等典型风险均可通过代码检查(如:使用SAST工具)和遵循安全编码规范来防范。

本文从编程习惯的角度出发,系统分析软件安全漏洞的来源。主要有 7 个来源:输入处理内存管理错误处理安全实践代码维护第三方依赖配置管理

这 7 个来源可归入以下 3 个依次递进的层次:

1. 代码实现层面

2. 开发实践层面

3. 生态环境层面

03 漏洞从哪里来?——编程习惯

【代码实现】

一、输入处理不严格

  1. 未验证用户输入
  • 典型漏洞:SQL注入、命令注入、XSS攻击
  • 原因:无脑信任用户输入,没有做“存在恶意行为”的合理假设。
  1. 数据类型溢出
  • 典型缺陷:整数溢出、浮点溢出等
    数据类型溢出是新手程序员常犯错误。
    CWE-190(整数溢出)常导致逻辑错误,如果用于指针则可能导致内存访问越界
  • 原因:对数据类型的表示范围没有概念,未执行检查或者未捕捉并处理异常,单方面依赖调用方“正确调用”,缺乏安全隔离。
  • 案例:CVE-2002-0639 OpenSSH (2.9.9 ~ 3.3) 允许远程攻击者执行任意代码。

二、内存管理缺陷

  1. 内存分配/释放问题
  • 使用缓冲区之前未初始化(CWE-416)
  • 重复释放缓冲区(double-free)
  • 分配内存失败后,未经检查就释放(CWE-476)
  • 完成任务后未释放申请的内存,导致内存泄漏
  1. 指针使用不当
  • 引用已释放内存的指针——悬垂指针(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)可能导致任意代码执行。

三、错误处理不完善

  1. 异常处理缺失
  • 未捕获异常导致程序崩溃
  • 错误代码忽略(如:未检查系统调用返回值)
  1. 错误信息泄露
  • 暴露堆栈跟踪(生产环境开启调试模式)
  • 返回过于详细的错误描述(如:SQL语句)

【开发实践】

四、安全实践不足

  1. 密码技术使用不当
  • 使用强度不足的算法(如MD5、DES)
  • 硬编码加密密钥
  • 未使用安全随机数生成器导致随机数碰撞概率明显增加
  1. 身份验证缺陷
  • 会话管理不当(会话固定、超时缺失)
  • 权限检查缺失(横向越权、垂直越权)

五、代码维护问题

  1. 复制代码和复用代码
  • 复制粘贴(相同漏洞多位置存在)
  • 集成未经审核的第三方代码
  1. 使用已废弃、不安全的功能
  • 继续使用已废弃函数(通常不安全,如:C语言的gets())
  • 使用不安全的版本(如:SSLv3)

【生态环境】

六、第三方依赖风险

  1. 组件更新滞后
  • 未及时替换存在已知漏洞的库版本
  • 对组件依赖关系的管理缺乏安全考量
  1. 易受供应链投毒攻击的行为
  • 未验证第三方组件完整性
  • 使用来源不明的代码包

七、配置管理忽视安全

  1. 敏感信息暴露
  • 配置文件包含明文密码
  • 日志中记录敏感数据
  1. 权限配置不当
  • 权限过高(如:以root权限运行应用)
  • 文件权限设置宽松(如:全局可写)

总结与改进

这些编程习惯问题可通过以下方式改进:

  1. 遵循安全编码规范
  2. 执行代码安全检查(如:使用SAST/DAST工具)
  3. 代码审核
  4. 持续学习安全开发技术、方法与工具
  5. 在CI/CD流水线中内置安全检查(依赖扫描、代码检测等)

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

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

- End -

下期分享

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

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

 

原文始发于微信公众号(方桥安全漏洞防治中心):03 漏洞从哪里来?——编程习惯

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月15日20:56:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   03 漏洞从哪里来?——编程习惯https://cn-sec.com/archives/3745314.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息