打造安全无忧软件应用的十大最佳实践

news/2024/4/24 23:17:35/

安全无忧的软件开发最佳实践实在是很有必要,因为安全风险无处不在。在网络攻击盛行的时代,它们可能影响到每个人,包括个人、公司和政府。因此,确保软件开发的安全性至关重要。

本篇文章将解释了什么是安全的软件,如何确保安全性,以及为您提供安全软件开发的最佳实践。

不安全的软件开发会发生什么?

网络攻击占据了新闻的头条位置。恶意软件Duqu和Stuxnet在2010年和2011年引起了广泛关注。从那个时候开始,网络攻击变得越来越严重。WannaCry在2017年攻击了包括英国国家医疗服务体系在内的重要系统。GitHub在2018年初遭受了一次拒绝服务攻击。而2021年的Log4j漏洞至今仍在被利用(我们在2021年也发布了Log4j 漏洞解读文章,点此阅读)……

嵌入式系统也无法幸免于难

嵌入式系统越来越容易受到风险的威胁。这已经导致了医疗设备和汽车行业的召回事件。而且,汽车行业尤其容易受到网络威胁。

这是一个超大的问题。

针对嵌入式系统的网络攻击可能会造成对以下方面的大规模损害:

  • 关键基础设施,包括发电、石油和天然气精炼;
  • 电信;
  • 交通运输;
  • 水务和废物控制系统。

安全软件开发的五大关键风险因素

  1. 相互依赖的系统使软件成为最薄弱的环节;
  2. 软件规模和复杂性使测试变得复杂;
  3. 外包软件供应链增加了风险暴露;
  4. 复杂的攻击能够找到更多风险;
  5. 重复使用旧版软件。

当今应用程序安全(AppSec)领域的常见问题

如今,各种类型的软件应用程序被开发用于嵌入式系统、移动设备、电动汽车、银行和交易服务。然而,人们常常忽略的是,许多应用程序和数字体验的设计和运行都没有安全措施,如果安全不是首要考虑的话,可能会带来风险。

即使优先考虑安全性并实施了安全的软件开发实践,公司仍然可能被攻击搞得措手不及。当今应用程序安全环境中的常见问题包括:

  • 第三方库和框架的漏洞:许多应用程序依赖于第三方库和框架,如果不定期更新,就会在应用程序中引入漏洞;
  • 注入攻击:注入攻击包括攻击者向应用程序的输入字段(如登录表单或搜索框)中注入恶意代码或命令,以获得对应用程序或其基础数据库的未经授权的访问;
  • 跨站脚本攻击(XSS):XSS攻击包括攻击者向网站或Web应用程序中注入恶意代码,然后在用户的浏览器中执行,可能窃取敏感数据或代表用户执行未经授权的操作;
  • 不安全的认证和授权:设计不良或实施不当的身份验证和授权机制可以让攻击者绕过安全控制,访问敏感数据或功能;
  • 日志记录和监控不足:如果没有足够的日志和监控,就很难发现和应对安全事件或确定安全问题的根本原因;
  • 移动应用程序安全:随着移动设备的普及,确保移动应用程序的安全变得越来越重要。移动应用可能会受到各种攻击的影响,包括针对设备本身或应用程序后台服务器的攻击;
  • 云安全:随着云计算的广泛应用,确保基于云应用程序的安全已变得至关重要。基于云的应用程序可能会受到各种攻击的影响,包括针对云基础设施、应用程序本身或存储在云中的数据的攻击。

可以利用一种或多种安全编码合规措施,如OWASP Top 10、CWE Top 25和CERT规则集,来检测上述列表中的项目,以实现安全软件开发。

SAST工具如何帮助确保安全软件工程的最佳实践?

越来越多的企业开始投资软件安全开发和网络安全技术,其中包括像Klocwork这样的SAST工具。尽管企业在网络安全覆盖范围方面已经有了很大的进展,但大部分工作还是集中在事后加强安全性和改进威胁检测上。

现在已经有越来越多人认识到SAST的重要性,并在实施安全的开发过程中加以强制执行。

仅仅应用新的安全技术是不够的。软件本身需要填补风险漏洞。因为如果窗户是开着的,那么在门上装再坚固的锁也没用。

为什么保障软件开发的安全很困难?

安全软件的优先级不够

对于大多数开发人员来说,软件开发中的安全性并不是一个足够重要的优先事项。

有一个老生常谈的观点,即您需要的是:

  • 快速进入市场;
  • 包括计划的所有功能;
  • 保持高水平的质量。

但是,您只能在这三者中选择两者。虽然质量也常常被拿出来讨论是否可以抛弃,但通常被抛弃的是安全性。

功能和截止日期推动着开发的检查清单。而软件的安全性通常不是一个特性或要求,因此很少被关注到。

质量并不一定能保证安全

提高软件质量和完整性可以减少缺陷导致的安全漏洞。但是,质量保证(QA)通常不会考虑黑客攻击。

嵌入式开发中的活动部件太多

嵌入式系统庞大而复杂。

包括新代码、遗留代码以及连接组件。而且,嵌入式系统在各种操作系统上运行。

有多个开发团队共同参与软件开发,并且分布在世界各地。

更不用说确保软件正常运行已经足够困难了,确保软件安全只会更困难。

缺乏足够的安全培训

遗憾的是,许多参与软件开发的人不知道如何辨别安全问题。他们可能没有意识到软件需求对安全性的影响,或者他们意识不到缺乏安全需求会带来什么影响。

而且,他们不知道安全性是如何从以下方面影响软件的:

  • 建模
  • 架构
  • 设计
  • 实现
  • 测试
  • 准备发布和部署

因此,开发人员可能无法设计安全的软件,安全的需求可能缺失,他们可能不了解错误如何演变成了安全漏洞。

没有专门负责安全的团队

大多数的嵌入式开发团队都没有专门负责软件安全的岗位。相反,他们依靠各种角色(从产品管理到开发再到QA)来确保软件安全,然而不一定有用。

安全软件开发的十个最佳实践

在了解到有可能存在上述一个或多个常见的AppSec问题的情况下,您不妨问问自己:“在代码开发、实践、流程或方法学中,有哪些有效的方法可以确保安全?”

现代的观念认为,在软件开发过程中要有意识地考虑和实施安全措施,以确保软件的安全性。

即使您可以使用最佳的测试工具链来扫描和分析软件,在软件开发过程中也应该采用各种实践和方法,才能在软件开发生命周期的每个阶段识别和减少潜在的安全威胁和弱点。

以下是安全软件开发的十个最佳实践:

1.威胁建模

威胁建模包括分析软件体系结构,并识别潜在的安全威胁和漏洞。这有助于在设计时就考虑到软件的安全性,并实施必要的安全控制。

2. 安全编码

开发人员必须遵守安全编码实践,例如输入验证、安全数据存储和安全通信协议。安全编码实践有助于防止常见的安全漏洞,例如SQL注入、跨站点脚本和缓冲区溢出攻击等。

3. 代码审查

代码审查包括审查开发人员编写的代码,识别潜在的安全问题。这有助于在开发过程的早期检测和纠正安全漏洞。

4. 测试

定期进行安全测试,包括渗透测试和漏洞扫描,可以帮助识别软件中潜在的安全漏洞,有助于在部署软件之前修复安全问题。

5. 安全配置管理

配置管理能确保软件系统以安全的配置部署。这包括了配置访问控制、网络设置和其他与安全相关的设置,降低未经授权的访问风险。

6. 访问控制

访问控制确保只有授权的人员才能访问软件系统。这包括实施用户身份验证和授权机制,以及基于角色的访问控制。

7. 定期更新和补丁

定期更新软件和补丁可以帮助解决安全漏洞,并降低安全漏洞的风险。保持系统中使用的所有软件组件的安全补丁和更新非常重要。

8. 安全培训

参与软件开发过程的开发人员和其他人员都应该定期的接受安全培训,确保他们了解安全的重要性和安全软件开发的最佳实践。

9. 事件响应

企业应制定明确定义的事件响应计划,来应对安全事件。这包括识别潜在的安全事件、控制安全事件的影响,以及从安全事件中恢复。

10. 持续监控

持续监控有助于实时检测和应对安全事件。这包括监控系统日志、网络流量和用户行为,以寻找任何安全漏洞的踪迹。

通过遵循这些最佳实践,企业可以开发安全可靠的软件应用程序,抵御潜在的安全威胁和漏洞。在软件开发的每个阶段都应该优先考虑安全,以防止未经授权的访问并保护敏感数据。

使用静态代码分析工具来确保安全的软件开发

静态代码分析能够为安全的开发过程提供支持,因为半数以上的安全缺陷是在源代码级别引入的。因此,在编写代码后尽早找到并修复错误非常关键。

然而,许多开发人员缺乏安全培训。而且,在代码审查期间识别安全问题可能很困难,甚至是不可能的事。安全错误可能是很微妙的,即使是训练有素的开发人员也很容易忽视它。

静态代码分析工具可以帮助您弥补这些差距,因为它们会标记出安全漏洞并加速代码审查。

使用静态分析,开发人员可以识别以下错误:

  • 内存泄漏
  • 违规访问
  • 算数错误
  • 数组和字符串溢出

这可以最大限度地提高代码质量,并最小化错误对最终产品和项目进度的影响。

此外,静态代码分析工具,例如Helix QAC(用于C / C++)和Klocwork(用于C,C++,C#,Java,JavaScript,Python和Kotlin),可以用于遵守CERT C或MISRA编码规则。它们还能更快识别CWE编码错误。

作者简介:
在这里插入图片描述
Dzuy Tran
Klocwork和Helix QAC高级解决方案架构师,Perforce公司

DzuyTran在硬件和软件嵌入式系统,RTOS,移动应用程序和企业系统的设计和开发方面有超过30年的经验。当客户遇到技术问题时,他会帮助他们,协助进行概念验证,并演示静态代码分析工具,并帮助指导客户进行 DevOps 实施流程和持续集成部署。Dzuy拥有国立理工大学计算机科学和计算机工程硕士学位。

文章来源:http://bit.ly/41rdMPn


http://www.ppmy.cn/news/46860.html

相关文章

[SSD核心技术:FTL 17] 固态硬盘掉电保护也是一门艺术 | 掉电保护原理与抉择 | 掉电保护测试

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 全文4800字, 阅读大约 24 分钟 前言 1 系统掉电的灾难

一起学 WebGL:三角形加上渐变色

大家好,我是前端西瓜哥。之前教大家绘制一个红色的三角形,这次我们来画个有渐变的三角形。 本文为系列文章,请先阅读如何绘制红色三角形的文章: 《一起学 WebGL:绘制三角形》 原来的写法,颜色是在片元着色器…

恢复误删文件

误删恢复 用losf恢复进程存在的文件 注意此处要后台进程存在 创建一个文件,用tail命令,模拟文件一直被监听 打开另外一个终端,删除这个文件 用lsof命令查看被删除的文件,可以发现文件虽然被删除,但是进程依然在 然后…

16 个优秀的 Vue 开源项目

为什么我们要关注Vue Vue是一个用于构建用户界面的JavaScript框架。值得关注的是,它在没有谷歌和Facebook的支持下获得了大量的人气。 Vue是结合react和angular的最好的方法,并且拥有一个有凝聚力的,活跃的,能够应对开发问题的大型…

2023/4/13总结

最小生成树 一、Prim算法 1.prim算法也被称为“加点法”,因为该算法是先从任意一顶点出发不断的选择目前距离最近且未被选择的点加入到已选的集合中,直到所有的点都被选到。(和最短路径中的Dijkstra算法很像) 2.prim算法的实现…

文件操作【下篇】

文章目录 🗃️5.文件的随机读写📁5.1. fseek📁5.2. ftell📁5.3. rewind 🗃️6.文本文件和二进制文件🗃️7.文件读取结束的判定📁7.1. 被错误使用的 feof 🗃️8.文件缓冲区 &#x1f…

折叠屏市场起风,华为、OPPO“你追我赶”

配图来自Canva可画 现如今,智能手机已经成为了人们生活中不可或缺的重要工具,无论是出行,还是社交,亦或是支付,只需要一部智能手机就可以通通搞定。因此,在消费者多样化需求的助推下,智能手机行…

研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型)

研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型) 变量|常量与可变性变量声明案例为什么不可变变量可变(mut关键字)变量可变(覆盖) 常量声明 数据类型标量类型整型整型字面值整型溢出问…

Go分布式爬虫笔记(二十二)

文章目录 22 辅助任务管理:任务优先级、去重与失败处理设置爬虫最大深度避免请求重复设置优先队列设置随机User-Agent失败处理 22 辅助任务管理:任务优先级、去重与失败处理 设置爬虫最大深度 目的: 防止访问陷入到死循环控制爬取的有效链接的数量 最…

ChatGPT实战100例 - (09) Python工具类库终结者

文章目录 ChatGPT实战100例 - (09) Python工具类库终结者一、需求与思路二、时间工具三、扩充工具四、编写测试五、 总结 ChatGPT实战100例 - (09) Python工具类库终结者 一、需求与思路 自从用了ChatGPT,再也不用满大街找工具类了。 需要啥工具,咱用C…

数据结构入门(C语言版)二叉树概念及结构(入门)

二叉树概念及结构(入门) 树的概念及结构1.树的概念及结构1.1 树的概念1.2 树的相关知识1.3 树的结构体表示1.4 树的实际运用 2.二叉树概念及结构2.1 二叉树的概念2.2 现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质2.5 二叉树的存储结构 结语 树的概念…

根据 cadence 设计图学习硬件知识 day01了解腾锐 D2000芯片

1. 首先了解 腾锐 D2000 1.介绍 腾锐D2000 芯片 D2000芯片集成8个飞腾自主研发的新一代高性能处理器内核FTC663,采用乱序四发射超标量流水线,兼容64位ARMV8指令集并支持ARM64和ARM32两种执行模式,支持单精度、双精度浮点运算指令和ASIMD处…

设计模式 -- 门面模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

100种思维模型之非共识思维模型-48

某一件事或者某一个环境当中,绝大多数人往右走,而你 发现真正的路是左边 的时候,该怎么选择? 往左边走,做非共识但正确的事,因为一旦你的真的是对的,你将会得到一切。 非共识思维模型是一个提…

集群和分布式

本文以即时通讯软件(IM)为例,介绍单机、集群、分布式的区别,以及它们各自的优缺点。 假设现在开发一款IM,刚开始业务比较简单,用户量也较少,我们将服务部署在一台单机服务器上足矣。软件开发过程…

std::regex正则表达式

std::match_results (匹配的结果存入其中) result[0]是完整的文本,result[1]是第一个分组匹配的数据。如果正则表达式有n个分组,match_results的size也就是n1个 This is a specialized allocator-aware container. It can only …

【FPGA实验4】举重比赛机制

举重比赛有三名裁判,当运动员将杠铃举起后,须有两名或两名以上裁判认可,方可判定试举成功,若用A、B、C分别代表三名裁判的意见输入,同意为1,否定为0;F为裁判结果输出,试举成功时F1,试…

逍遥自在学C语言 | 位运算符~的高级用法

前言 在上一篇文章中,我们介绍了^运算符的高级用法,本篇文章,我们将介绍~ 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 ——…

Direct3D 12——计算着色器——计算着色器概念

计算着色器虽然是一种可编程的着色器,但Direct3D并没有将它直接归为渲染流水线中的一部分。虽然如此,但位于流水线之外的计算着色器却可以读写GPU资源。从本质上来说,计算着 色器能够使我们访问GPU来实现数据并行算法,而不必渲染出…

5.Spring Cloud (Hoxton.SR8) 实战笔记—项目中细节实现 约束 注意事项、模块难点总结

本文目录如下: 二、项目中细节实现 & 约束 & 注意事项判断字符串是否为空?入参 Num 字段转换为 num 的问题?通过 Java 获取时间 (Date类型) 并插入数据库?神坑: baseMapper.selectById(String str)之坑?AES 实现加密函数…