前言
到了验证阶段(安全测试),软件架构与设计已经定型,第三方开源组件的引用已基本不太可能改变,前面各环节的漏网安全bug已迎来最后一次发布前的检测。在这个阶段,测试人员会利用各种工具和技术对软件进行深入的安全测试,确保其满足预定的安全标准和要求。
这个环节的存在是由于软件开发过程中可能出现的各种安全风险。例如,开发的应用程序可能存在高危漏洞,网站可能被入侵等。这些问题不仅可能导致数据泄露,影响服务器的完整性和可用性,而且可能对公司的声誉和用户对产品的信心产生负面影响。
目标
安全测试环节是全生命周期中的关键部分,其核心目标是发现并修复软件中的安全漏洞,以提升软件的安全性和可靠性。
SDL的发展是一个动态的过程,它从最初的安全测试逐渐发展,逐步将安全前置,并在系统发布上线前设置检查点。这种模式不仅在理论上将安全融入到软件开发的每一个阶段,而且在实际操作中也得到了验证和优化。
在最初的实践中,很多公司都是从简单的安全测试开始,然后逐步扩大到需求分析、设计、编码等各个阶段,以确保软件在整个开发过程中都能达到预定的安全标准。例如,京东在实施SDL后,他们的安全体验指数从实施前的55分提高到了实施后的90分,这说明SDL全生命周期在实践中确实能够有效提升软件的安全性。
安全活动
在SDL测试阶段,安全活动主要围绕安全报告验收、人工安全测试和漏洞验证进行。首先,安全报告验收是评估测试结果的重要环节,它涉及到对发现的安全问题进行分类、记录和分析,并根据预定的安全标准进行验收。其次,人工安全测试是一个关键环节,通过专业人员利用各种工具和技术对软件进行深入的安全测试,发现并修复软件中的安全漏洞。最后,漏洞验证是对前面所有阶段工作的最终确认,确保所有发现的安全问题都已被有效解决。
一、安全报告验收
在验证阶段,需要收集并检查这些报告,包括安全设计的自检报告和静态代码扫描报告。
- 安全设计自检报告:这份报告应该包含在设计阶段进行的所有安全检查的结果。需要仔细阅读这份报告,确保所有的安全问题都已经得到了妥善的处理。如果报告中提到了任何未解决的问题,可能需要与设计团队进行进一步的讨论,以确定最佳的解决策略。
- 静态代码扫描报告:这份报告提供了关于代码中可能存在的安全漏洞的信息。需要仔细阅读这份报告,并对报告中提到的每一个问题进行深入的调查。如果可能的话,应该尝试修复这些问题,或者至少确保它们不会对系统造成任何威胁。
设置抽查和复测机制是确保报告准确性的重要步骤。以下是一些可能的做法:
- 随机抽查:从提交的报告中随机选择一部分进行详细的检查。这可以确保不仅仅依赖于业务方的报告,而是亲自验证其内容。
- 定期复测:即使业务方已经提供了报告,也应该定期进行复测,以确保系统的安全性始终得到维护。这可以发现任何新出现的问题,或者确认之前的问题是否已经被妥善处理。
- 第三方审计:如果可能的话,可以考虑聘请第三方机构进行安全审计。他们可以提供独立、客观的观点,帮助你更好地了解系统的安全状况。
- 建立反馈机制:如果发现报告存在问题,应该及时与业务方沟通,让他们知道问题所在,并要求他们进行修正。同时,也应该建立一个反馈机制,让业务方可以向你报告他们在实施安全活动时遇到的问题。
二、人工安全测试
人工安全测试是确保系统安全性的关键步骤,但也是整个流程中压力最大和最易造成阻塞的点。以下是一些可能的原因:
- 资源限制:人工安全测试需要大量的时间和人力。如果没有足够的资源,这个过程可能会变得非常缓慢,从而影响整个项目的进度。
- 技术复杂性:安全测试需要深入理解系统的工作原理,以及各种可能的攻击方式。这可能需要具有高级技能和丰富经验的专业人员。
- 不可预见的问题:即使经过了详尽的测试,也可能会发现一些未预见到的问题。这些问题可能需要额外的时间来解决,从而进一步延迟项目进度。
为了应对这些挑战,你可以采取以下策略:
- 提前规划:在项目开始时,就应该考虑到安全测试的需求,并为其预留足够的时间和资源。
- 自动化测试:尽可能地利用自动化工具进行安全测试,以提高效率并减轻人力压力。
- 持续学习:定期更新你的知识和技能,以便能够应对新的安全威胁和挑战。
- 与业务方紧密合作:确保业务方理解安全测试的重要性,并与他们紧密合作,以确保整个过程的顺利进行。
选择性进行人工安全测试可以节省时间和资源,但可能会遗漏一些重要的安全问题。专项安全测试可以针对性地解决特定的问题,但如果只关注一种类型的漏洞,可能会忽视其他类型的风险。通过堆人进行全面的人工安全测试可以确保系统的安全性,但可能会增加成本和复杂性。
三、漏洞验证验收
人工安全测试,特别是手动渗透测试,往往可以更有效地发现和修复安全问题。它可以针对各种复杂的场景,包括但不限于越权类漏洞、安全配置错误类漏洞、API返回过多敏感信息类漏洞、重要场景重放攻击以及常见的较为隐蔽的web漏洞。
手动渗透测试的一个显著优点是其灵活性。训练有素的专业人员能够分析应用程序对各种攻击的响应,捕捉到自动测试软件可能遗漏的问题。此外,专家可以随时审查报告,并对发现的许多问题进行修复。这种深度和细致的测试过程能够确保软件的安全性和稳定性。
然而,手动渗透测试也有其缺点。它通常比自动化测试更耗时和成本高昂。渗透测试的彻底程度可能会需要数周时间才能得出结果。尽管人工测试可以发现更多的缺陷,但据统计,大约80%的缺陷是由人工测试发现的,而自动化测试发现的缺陷仅占20%。这可能意味着,尽管人工测试能够发现更狡猾和复杂的漏洞,但仍有可能遗漏一些简单或常见的问题。
在发现安全漏洞后,推动其修复并再次验证的过程同样重要。以下是一些可能的步骤:
- 报告问题:需要将发现的安全问题详细记录并报告给相关的团队或个人。这通常包括问题的严重性、影响范围以及可能的解决方案。
- 修复问题:一旦问题被确认,就需要尽快进行修复。这可能需要修改代码、更新配置或采取其他措施。
- 验证修复:修复问题后,需要进行验证以确保问题已经被解决。这可以通过再次运行测试或手动检查来完成。
- 闭环反馈:需要将整个修复过程的反馈记录下来,以便于未来的参考和改进。这可以包括问题的原因、解决方案的效果以及任何可以防止类似问题再次发生的建议。
这个过程可能会比较耗时,但是它对于确保软件的安全性至关重要。只有通过持续的努力和改进,才能有效地防止安全问题的发生。
实践思路
一、安全提测
确保测试环境与生产环境一致是进行安全测试的基础,但确实存在一些挑战。以下是一些常见的问题和解决方法:
- 硬件配置:生产环境的硬件配置可能比测试环境更复杂,包括不同的服务器、网络设备等。解决方法可以是尽量使用与生产环境相似的硬件配置,或者在测试环境中使用虚拟机来模拟不同的硬件环境。
- 软件版本:生产环境中的软件版本可能比测试环境更新,包括操作系统、数据库、中间件等。解决方法可以是尽量使用与生产环境相同的软件版本,或者及时跟进生产环境的更新并在测试环境中进行验证。
- 数据差异:生产环境中的数据可能是真实的用户数据,而测试环境中的数据可能是伪造的或部分真实的。解决方法可以是尽量使用与生产环境相似的数据,或者对测试数据进行脱敏处理以保护用户隐私。
- 网络拓扑:生产环境中的网络拓扑结构可能比测试环境更复杂,包括不同的子网、防火墙规则等。解决方法可以是尽量模拟生产环境的网络拓扑,或者在测试环境中使用虚拟网络来模拟不同的网络环境。
- 权限设置:生产环境中的权限设置可能比测试环境更严格,包括不同角色的用户权限、访问控制等。解决方法可以是尽量模拟生产环境的权限设置,或者在测试环境中使用有限的权限进行测试。
在保证安全测试质量的同时,尽量避免因网络ACL限制导致的测试延迟。当面临由于网络ACL限制导致的安全测试人员无法访问测试环境的问题时,可以考虑以下解决方案:
- 联系网络管理员:首先,可以尝试联系网络管理员或IT团队,解释安全测试的重要性,并请求他们临时调整ACL规则以允许安全测试人员的访问。
- 使用代理服务器或VPN:如果无法直接修改ACL规则,可以考虑使用代理服务器或VPN进行连接。这些工具可以帮助隐藏原始IP地址,从而绕过ACL限制。
- 使用云服务的虚拟私有网络(VPC):如果测试环境是基于云的服务,可以利用VPC的功能。网络ACL与安全组类似,都是安全防护策略,当您想增加额外的安全防护层时,就可以启用网络ACL。此外,使用网络ACL不会产生任何额外的费用。
- 制定详细的测试计划:提前与网络管理员沟通,制定详细的测试计划,包括测试的时间、范围和目的,以便他们可以提前做好准备。
在待测系统中,通常会存在不同权限的账号。如果业务方不能完整提供,可能会导致越权、SQL注入、信息泄露等常见安全bug的漏测。可以进行如下的权限测试:
- 一次只给用户单独设置一个权限,设置之后检查该权限是否生效。
- 给用户不设置任何权限,设置之后检查该用户能否使用系统。
- 给用户设置全部权限,设置之后检查所有权限是否生效。
- 给用户设置部分权限,设置之后检查所设部分权限是否生效。
- 分别使用不同权限登录(一般至少会有管理员和普通用户两种级别的权限),测试各自权限规定内的功能是否能够实现。
- 在不同的浏览器或操作系统中同时分别登录不同权限等级和相同权限等级,测试各自权限定内的功能是否能够实现。
我们需要根据需求评审过程中提出的安全测试要求,对待测系统进行全面的测试。这包括代码评审过程中针对权限类、敏感数据类检查是否有权限校验或数据加密。同时,我们还需要