四种常见的软件安全开发问题及解决方法
随着软件成为现代业务的支柱,网络攻击已成为一种无时不在的威胁,这使得应用安全成为确保业务连续性的必要条件。这篇文章研究了四种常见的软件安全开发问题及其解决方法。
管理和维护安全软件的过程可能会给寻求尽快交付功能的开发人员带来意想不到的障碍。研究表明,59%的公司现在每天多次、每天一次或每隔几天部署一次代码。然而,随着软件成为现代企业的支柱,网络攻击成为一种无时不在的威胁,这使得应用安全成为确保业务连续性的必要条件。
左移运动——在开发过程的早期进行安全测试和修复缺陷——增加了开发人员在应用程序安全方面发挥作用的需求,但受过安全培训的开发人员仍然存在很大的技能差距。有兴趣提高安全知识的开发人员可以从了解一些常见的DevSec问题开始。
四种常见的软件安全开发问题及解决方法
- 挑战一:漏洞修复时间缓慢
对于开发人员和安全团队来说,最常见的挑战之一是安全债务——代码中存在很长时间的安全漏洞,如旧的信用卡余额,现在解决起来比引入时要昂贵得多。为避免增加安全债务,开发人员可以实施自动化扫描和测试。
自动化程度越高越好:在一次年度软件安全状况(SoSS)报告中,我们发现将动态分析(DAST)与静态分析(SAST)结合使用的组织修复50%的安全漏洞平均快24.5天。
更快地查找和修复新缺陷的另一种方法是更频繁地扫描。更频繁的扫描使组织能够以22.5天的速度到达中间点,并且通过API运行SAST扫描将修复50%的缺陷的时间缩短了17.5天。
研究还表明,稳定的扫描节奏可以帮助您的团队看到缺陷类型比例的有意义的变化,并随着时间的推移减少安全债务。将安全测试视为马拉松,而不是短跑:在赛事前一周只跑50英里并不能为马拉松做好准备。
- 挑战二:常见代码安全漏洞的引入
了解哪些缺陷对您的应用程序构成最大风险以及它们是如何引入的,对于防止这些常见缺陷导致的破坏性网络攻击至关重要。我们的SoSS报告发现,信息泄露(65.9%)、CRLF注入(65.4%)、密码问题(63.7%)和代码质量(60.4%)是应用程序中最常见的缺陷。为了解决这些常见的缺陷,开发人员应该考虑以下几点:
对于信息泄露,在编写代码时依靠安全编码最佳实践并实施安全测试程序。
为防止CRLF注入,不要相信用户输入,使用正确的验证和编码清理用户提供的数据,并确保在HTTP标头中正确编码输出。
可以通过良好的安全编码实践来防止加密漏洞。此外,大多数主要语言本质上都支持良好的加密实践,并且对不正确实现的担忧通常只会在个案的基础上出现。
通过使用一致的编码模式、在您的SDLC中自动进行安全测试并通过有效的培训保持最新状态,来防止代码质量不佳问题。
值得注意的是,这四个缺陷年复一年地一直排在报告的前10名,表明开发人员在意识和培训方面存在差距。事实上,对开发人员的安全培训可能是最大的挑战。大学不仅没有定期教授安全编码,而且在职培训也同样难以获得,因为大多数应用程序安全都由安全团队负责。为了使开发人员能够预防、查找和修复代码中的缺陷,组织需要提供可操作的、真实的培训,开发人员可以立即应用这些培训来加强他们所学的知识,并使其成为日常工作的一部分。
- 挑战三:依赖开源库,但只扫描内部编写的应用程序代码
开源代码几乎无处不在。当您考虑到许多开源库不是由开发人员直接选择时——应用程序中46.6%的不安全开源库是可传递的,由另一个正在使用的库引入应用程序——很容易理解开源代码如何扩展攻击面在应用程序中。事实上,我们的研究发现,71%的应用程序在初始扫描时在开源库中存在缺陷。
集成软件组合分析(SCA)等扫描工具可以帮助更准确地检测开源漏洞。由于74%的开源缺陷可以通过补丁、修订或主要/次要版本更新来修复,因此该过程可以有效缓解。
使用正确的工具来掌握代码是降低风险和确保您可以自信地使用开源库的关键。
- 挑战四:代码中高危和非常高严重性缺陷的过剩
无论您喜欢哪种软件语言,了解对它们影响最大的缺陷都将帮助您在错误成为更大问题之前防止错误。我们的数据显示,某些语言比其他语言具有更多的高风险缺陷,这意味着应该仔细设计和测试用特定语言编写的代码。一些例子包括:
C++应用程序:近60%的应用程序存在高度和非常高的严重性缺陷;常见缺陷包括错误处理、缓冲区管理错误、数字错误和目录遍历缺陷。
PHP应用程序:52.6%的PHP应用程序存在高度和非常高的严重性缺陷;最常见的缺陷包括跨站点脚本(XSS)、加密问题、目录遍历错误和信息泄漏漏洞。
Java应用:Java以CRLF注入缺陷、代码质量问题、信息泄漏和密码问题领先;Java应用程序97%是第三方代码,并带有更大的看不见的风险。
通过检查各种常见语言的缺陷频率趋势,开发人员可以更好地了解他们在编码时面临的日常风险,并可以使用这些知识在这些缺陷成为问题之前提前解决。
执行安全编码实践,并使用实践培训来增加专业知识,将帮助确保应用程序的安全性与现代开发需求保持同步。如果开发者不仅能够发现并且能够修正他们代码中的缺陷,那么他们就会顺利地成为一个更加熟悉安全的开发者。