2021年每个软件开发人员都面临的安全编码挑战

软件漏洞已经成为几乎每个行业的人们的难题,这导致许多专家建议必须从头开始确保代码的安全性。由于现在几乎每种类型的企业和政府组织在其日常运营中都至少使用某种形式的软件,因此,即使是联系最少的机构也可能最终面临网络威胁。悲剧是,对某些流行软件包的底层结构进行更改可能至少可以在一定程度上缓解此问题。

平均每个生产软件中的漏洞总数正在继续增长。根据一份报告,仅在2019年就发现了22,000多个新的潜在漏洞。这些漏洞中大约有三分之一已经发布了概念证明,这有助于说明问题已变得多么严重。每天转换为大约20个新漏洞。

如果在项目刚出现时就要求程序员编写安全的代码,那么他们以后就不必再处理这些问题了。尽管这听起来似乎是不言自明的,但是这个问题比起初看起来要复杂得多。

设计具有安全性的应用程序

当软件开发人员首次开始从事项目工作时,必须考虑各种问题。应用程序的设计要求通常是任何工程师最关心的问题,但是考虑如何最佳地优化为接口供电的算法也很重要。在处理所有这些问题时,很容易忘记安全性。

但是,这样做是一个重大错误,因为不安全的做法很容易渗入设计的每个部分。一旦这些实践首次开始将其纳入程序中,它们便会嵌入其代码中,并且很难摆脱。计算机科学家已经确定了编码人员需要采取整体安全软件开发方法的几个区域,以防止发生这种蠕变。

系统必须基于每个人在任何给定时间使用必要的最小特权的思想。将所有访问限制在本质上是需要了解的基础上,将防止恶意执行任何种类的任意代码。对于将软件开发外包给另一个组织的公司而言,这可能很棘手,但对于那些进行内部设计的公司而言,这应该是最简单的步骤之一。

诸如代码审查和笔测试之类的标准程序始终是一个好主意,尽管任何想要定期部署软件的公司都需要确保它们实际上遵守所采用的协议。不安全因素蔓延到扩展代码库的最大原因之一是缺乏常规测试。分层防御策略也是一种不错的策略,尤其是当代码被编译并提升到生产环境中时。不幸的是,很难确保运行时位置的安全。

工程团队可以采用一些技巧来确保即使执行环境非常不可预测,他们的代码也可以保持尽可能安全。

保护本质上不安全的环境

实施某种形式的数据输入验证是一项繁琐的工作,应由技术人员正在使用的编程语言来处理,但这并非总是如此。例如,Java使用静态强类型框架,该框架不应允许在JVM实例内部执行的代码逃逸其沙箱。但是,其他语言会在金属上运行其所有本机代码,因此存在行为不当的应用程序可以控制机器的系统软件的风险。

在移动领域这尤其成问题,在这种情况下,用户可能完全不知道自己的设备已经受到威胁,直到为时已晚。数据验证检查可以帮助确保程序的所有输入实际上都有意义。尽管此方法已广泛用于保护Web应用程序免受外部网络攻击的侵害,但没有理由不能将其用于保护为缺乏类型安全性验证的平台编写的本机应用程序。

身份验证协议,例如使用密码或生物特征检查的协议,可能是任何人执行的最常见的安全验证类型。在开发这些例程时,请务必记住,凭据的存储与获取它们同样重要。所有输入和输出都必须进行清理,以减少有人在进入系统时使用数据包嗅探器捕获凭据的风险。

还需要对凭证进行适当的哈希处理,以确保不良行为者不能简单地组成虚假信息,而这些虚假信息本来就无法进入计算机时可以用作密码。两要素授权和面部识别技术已被提升为代替密码的更强大替代方法,但即使如此,它们也仅与基础代码中存在的哈希算法一样安全。

建立本质上安全的加密实践

无论使用哪种加密算法来保护密码和其他凭据,都绝不能以纯文本格式存储。尽管它们在物理RAID阵列上可能是安全的,但必须对其进行解密才能访问,并且此时它们将暴露于外界。结果,大多数计算机科学家建议使用哈希技术来检查数字指纹,而不是未加盐的密码。

不幸的是,编码人员仍然仅基于优化来选择哈希算法。例如,虽然md5sum命令很快,但是它生成的128位哈希不能被认为是安全的。量子计算技术的不断发展使这个问题更加恼火,部分原因是这些机器每秒可以简单地生成大量潜在的冲突哈希数。

由开放Web应用程序安全性项目发布的指南建议,所使用的所有加密模块均基于FIPS 140-2或超出其中规定的标准。但是,即使这还不够。数据泄漏可能通过简单的HTTP GET请求或与TLS连接有关的问题发生。充满过时记录的错误数据库甚至可能带来安全风险,尽管通常将这些问题视为性能问题,而不是安全问题。

这些问题大多数都只会在运行时变得明显,因此至关重要的是,构建尽可能安全的基础架构以限制任何应用程序的潜在攻击面。幸运的是,有一种相对简单的方法可以做到这一点。

爬依赖性兔子洞

程序员每次在项目中包含一个库时,便会为其引入至少一个依赖项。一些库也将带来许多其他依赖关系,有时也称为下降兔子洞。对这些依赖项中的任何一项进行更改都会使应用程序容易受到攻击,尤其是在不清楚是否进行了哪种更改时。自学成才的编码人员倾向于比其他人员包含更多的外部库,但是这个问题在企业中同样普遍。

代码重用是非常有用的,当然不应该阻止代码重用。但是,重要的是减少每个项目所具有的依赖关系数量,以便大幅削减其攻击面并使其更加坚固。并非总是可以减少编译应用程序所需的库数量,但是大多数工程师应该发现,项目中包含的至少某些功能并不是真正必需的。

尽管这可能会导致一些痛苦的决定,但是以这种方式删除不必要的功能可以大大有助于构建更安全的应用程序。

SO资源郑重声明:
1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!3187589@qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!

SO资源 » 2021年每个软件开发人员都面临的安全编码挑战