(识别二维码,快速完成认证)
一、
概述
二、
工作性质
三、
一些常识
1、
软件开发生命周期
软件开发生命周期(SDLC)通常包括以下六个主要阶段:
向下滑动查看
1
需求分析
这个阶段是软件开发过程中的需求分析阶段。在这个阶段,团队会与客户进行沟通,以了解他们的需求和期望。然后,团队会将这些需求转化为详细的规格说明书,这些规格说明书将作为后续开发工作的基础。
2
设计文档
团队会设计软件项目的架构和模块,并制定详细的设计文档。设计阶段的关键是确保软件项目的可扩展性、可维护性和安全性。
3
编码开发
开发人员会根据设计文档编写软件代码。这个阶段的关键是确保代码质量,包括可读性、可维护性和可测试性等。
4
测试验证
团队会对软件项目进行各种测试,包括单元测试、集成测试和系统测试等。这个阶段的目的是确保软件项目的质量和稳定性。
5
部署上线
团队会将软件项目部署到生产环境中。关键是确保软件项目的部署流程是可靠和自动化的。
6
维护相应
团队会对软件项目进行维护和支持。关键是及时发现和解决问题,确保软件项目始终保持高质量和可用性。
软件开发生命周期 (SDLC) 最常见的六个模型
向下滑动查看
1
瀑布模型
最经典的模型在进入下一阶段之前,团队需要完成项目的每个阶段。
2
敏捷模型
主流的软件开发方法。每次迭代最有价值的部分,这有助于开发人员更快地完成工作,更轻松地进行更改。
3
迭代模型
每个cycle产生一个不完整的产品。每个cycle都会产生更多的需求,直到产品成型。
4
螺旋模型
侧重于产品的特定风险模式,因为开发团队决定采用哪种其他流程模式。
5
V模型
开发人员同时运行验证和确认流程。每个开发阶段配套有独特的测试阶段。
6
精益模型
精益模型与敏捷模型类似,但它侧重于减少重复劳动提高效率。
源代码审计对应SDLC中的开发编程&测试验证阶段,但在传统SDLC(软件开发生命周期)模型中,如瀑布模型等并不包括安全测试,安全团队只在构建软件后才介入。正因为传统SDLC模型存在许多不合理的地方,许多公司正在过渡到S-SDLC(安全软件开发生命周期)甚至是DevSecOps模型。
2、
安全生命周期
对公司而言,SDL 可以:
减少总开发成本🔵
确定安全优先事项🔵
3、
工作原则
为了提高软件安全性,应该集中为开发人员提供检查工具,以便他们在开发过程中可以轻松地检查代码的安全性。这比通过工单流程逐个处理安全问题更高效。
在软件开发过程中,审计人员和开发人员之间的互动非常重要。应该鼓励审计人员与开发人员就安全问题进行交流,而不只是出具报告。这样可以确保安全问题得到及时解决,互动沟通也可以提高开发人员的安全意识。
在软件开发过程中,提供一则正确的简单编程示范比详细的教程更有助于提高开发人员的安全能力。示范应该简洁明了,易于理解,以便开发人员可以快速掌握安全编程技巧。
四、
审计准备
1、
源代码
源代码是不是包含相关的导入模块的源码;当审计工程师在本地debug想要逐步调试某些 API 时,拥有依赖组件的源代码会有助于审查;如果没有完整的源代码,对于这样一个黑盒子可能需要进行逆向工程来理解内部输入与输出的转换关系。
2、
应用配置文档
3、
自动静态代码分析
4、
架构和设计文档
阅读这类文档,需要先浏览目录再重点看与结构相关的章节(4.2 总体结构)
软件结构图又叫软件架构图、模块结构图,确定软件系统中每个过程是由哪些模块组成的,以及这些模块之间的连接,明确和相对细致地描述组件之间的通讯关系。
层次图帮助团队人员更好地理解软件系统在某个特定层次上的功能和结构,有助于相同层级的知识迁移。
5、
API接口和通信端口
6、
威胁建模报告
威胁建模通常从新增业务、高危业务、重要业务开展,也可以根据典型业务情景复用一些威胁模型。
威胁模型预先识别了高风险模块和接口,这些风险信息可以为源代码审计提供很好的参考,对于海量的业务代码来说,通过已识别的威胁模型可以降低人工源代码审计覆盖面不足的问题。
威协ID |
风险等级 |
威胁描述 |
威协分类 |
影响的资产 |
策略 |
修复方案 |
状态 |
负责人 |
排期 |
1 |
高 |
服务器同客户端通信采用http模式,可被中间人攻击窃取,破坏了保密性、完整性和抗重放性。 |
信息泄露 |
客户端所有动作行为、系统数据、用户数据 |
解决 |
互联网暴露面系统使用全站HTTPS功能 |
TO DO |
张三 |
20240601 |
2 |
|
|
欺骗 |
系统数据、用户数据 |
缓解 |
使用非对称加密算法随机生成key值 |
DO NE |
李四 |
20240201 |
3 |
低 |
服务器和客户端采用RESTful API访问,服务器岩机会导致服务离线 |
拒绝服务 |
服务 |
解决 |
通过统一容灾方式,多机方式部署。 |
TO DO |
王五 |
20241201 |
4 |
高 |
在供应链流转阶段源码被逆向或不慎泄露 |
信息泄露、拒绝服务 |
应用本身 |
接受 |
NA |
赵六 |
在开发阶段,研发人员需要参考威胁建模报告,将这些安全需求实现,包括安全细节的实现,具体的认证方式、密码使用哪种安全算法存储,使用什么方法生成安全随机数等。
在验证阶段使用威胁建模报告也可以指导安全人员开展安全测试,对研发人员的安全需求实现情况进行正向和逆向测试。
五、
第三方组件安全
1、
Cuckoo Sandbox
2、
微步在线云沙箱
3、
腾讯哈勃分析系统
六、
放眼整个项目
1、
Doxygen
2、
GraphViz
3、
三种方案
-
使用 Visual Studio 的map插件,但前提是必须是专业版或企业版,社区版无法安装此插件。 https://docs.microsoft.com/en-us/visualstudio/modeling/map-dependencies-across-your-solutions?view=vs-2017 -
使用 CodeViz 和 Graphviz 结合的方案。 -
使用 Doxygen 和 GraphViz 结合自动生成。(主流)
七、
checklist检查单
1、
高风险模块
高风险模块 |
业务功能 |
验证 |
账户注册、 登录、验证码、找回密码、更改密码等;身份和密码存储以及访问控制;多次失败后的帐户锁定控制。 |
授权 |
敏感资源访问接口、 系统管理员接口 |
管理员配置 |
有web、数据库、服务配置需要注意;审核配置有两种:一种是默认配置值,另一种是应用程序如何更新配置值。 |
金融 |
支付功能、优惠券、订单和购物车 |
文件操作 |
上传、下载、重命名 |
数据库 |
涉及数据库查询操作、 数据库创建、添加、更新和删除选项。 |
API接口 |
Restful API接口、其他通信接口、第三方集成接口、越权使用危险的API |
过时的接口 |
不支持安全的模块仍坚持使用、使用被禁止的API |
加密 |
使用被禁止的加密算法、开发过程中在源代码中硬编码敏感信息或注释带敏感信息;注释带敏感信息有如:IP、电子邮件、密码。 |
2、
通用缺陷列表
3、
热点问题实例
热点问题示例 |
针对主要安全问题的缓解方法 |
CWE-89 SQL注入 |
使用参数化查询可以有效防止 SQL注入。使用sqlmap快速检测注入漏洞是否存在。重点关注那些未使用参数化查询的语句或在 iBATIS 框架中使用$作为 SQL 参数的 SQL 语句。 |
CWE-78 OS命令注入 |
使用自动化代码审计工具可以检测到系统命令注入问题,重点关注getRuntime()这类函数调用。 |
CWE‑79 XSS |
通常XSS漏洞与前端框架漏洞有关。 |
CWE-306 缺少关键功能的身份验证 |
远程调试filter来发现特定 URL 缺少身份验证的情况,或使用DAST路径扫描来发现此类问题,这类安全问题很难借助自动化代码审计工具检测到。 |
4、
Nday治理
八、
关键字查找
1、
字典示范
安全问题类别 |
Java 代码匹配 / 关键字查找 |
命令注入 |
Runtime.exec、 ProcessBuilder |
缓冲区溢出 风险 |
strcpy、strcat、sprint、sscanf、vscanf、gets |
XML注入 |
SAXParser、DocumentBuilderFactory、BeanReader、XmlReader、DOMParser、SAXReader、XMLinputFactory |
敏感信息 |
Backdoor, password, admin, root Cipher, getInstance MessageDigest.getInstance Encode, ciphers, shareKey, token URL, Email, IP address |
HTTPS 中间人(MITM) |
ALLOW_ALL_HOSTNAME_VERIFIER X509Certificate, X509TrustManager getAcceptedIssuers |
不安全的加密 |
RC4, SSL, AES, DEC, ECB, MD5, SHA1 Java.util.Random Cipher.newInstance("DES Cipher.getInstance("ECB |
跨站脚本 |
document.location, document.URL document.referrer, document.write, document.print document.body.innerHTML window.location, window.execScript window.setTimeout, window.open request.getParameter |
反序列化问题 |
XMLDecoder XStream readObject, readResolve, readExternal |
用户数据输入 |
getParameter, getQueryString, getRequest getCookies, getInputStream, getReader getInputSteam, getMethod, getReader getRemoteUser, getServerName |
2、
优点
3、
不足
4、
语言差异
九、
总结
原文始发于微信公众号(i春秋):揭秘代码安全:甲方审计高手的心得与技巧大公开!
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论