热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

但它安全吗?

\主要结论\很少有工程师被问及自己的软件是否安全,但几乎每个系统都有某些潜在的安全隐患。\物联网设备的激增将潜在的攻击面和可能造成的损失类型无限放大。\安全的,和不安全的软件之间的

\


主要结论

\



  • 很少有工程师被问及自己的软件是否安全,但几乎每个系统都有某些潜在的安全隐患。 \

  • 物联网设备的激增将潜在的攻击面和可能造成的损失类型无限放大。 \

  • 安全的,和不安全的软件之间的差异可能很不容易察觉。 \

  • 包括FTA、STAMP,以及UML状态机等多种分析技术可以帮助我们找出系统中可能存在的失效路径。 \

  • 无需等待最完美的解决方案,任何可以改善系统安全性的技术都是有价值的。


\

在我的职业生涯中,我只从一位员工和咨询的客户处听到过这个至关重要的问题:这个软件安全吗?\

在我们的方法论大战中,我们在特性、规模、特点、技术需求、测试方法等方面付诸了太多精力,以至于很少有人关注我们的成果是否足够“安全”。\

安全的软件产品,应当:\



  1. 不会导致财产、经济,或数据损失。 \

  2. 不会对人员或其他生物造成身体、情绪,或声誉方面的伤害。 \

  3. 能够抵御可能导致上述第1和第2条所诉情况变为现实的恶意行为所造成的安全威胁。


当前状态

\

2015年7月,白帽黑客Charlie Miller和Chris Valasek入侵了记者Andy Greenberg所驾驶的一辆2014年款吉普切诺基。当时Greenberg正以每小时70英里的速度驾驶着这辆车,Miller和Valasek坐在距离车辆10英里远的地方成功操作了这辆车的空调、广播、仪表盘显示器,**并恢复了车辆的制动系统,最终让这辆车彻底停了下来。Greenberg的报道受到广泛关注后,菲亚特·克莱斯勒召回了140万辆切诺基,令人尴尬的是,仅仅两个月后,他们又一次因为安全性欠佳的Uconnect组件再次召回了8000辆SUV。\

Security Affairs网站收集整理了有关汽车被入侵事件的所有新闻报道。很多业内专家认为,机动车制造商的软件安全意识远远落后于整个软件行业,作为一名软件工程师,我对于这种观点倍感担忧。负责机动车安全性测试的Security Innovation公司研究员Ed Adams曾说:“机动车制造商已经远远落后于时代。车载软件的开发并不像,例如银行用软件,甚至微软开发的软件那样使用相同程度的安全标准。”\

随着物联网技术突飞猛进,我们开始面临全新的,同样令人恐慌的弱点,以至于事后可能会问:“为什么没人预计到会出现这种情况?”Kaspersky Lab的Sergey Lozhkin曾介绍过针对医疗设备进行的一些令人印象深刻的入侵。以医疗设备为工作重点的Lozhkin主要研究医疗设备到底有多脆弱。他曾经选择了一家目标医院,然后说:“我测试了医院的WiFi网络,最后成功连接到一台MRI设备,从中获得了个人信息和软件架构中包含的[缺陷]。这一切让我感觉惊恐,因为整个过程太顺利,太容易了。初始攻击是通过WiFi网络进行的,对于一个存储了各种医疗数据的网络,他们的网络安全性实在不堪一击。”\

在以悲观的展望作为结尾的报告中,Lozhkin说到:“白帽安全研究人员和有恶意的黑客都在积极探索这些领域:汽车劫持、车联网、医疗设备,以及其他一切。对于网络罪犯来说,这是一片足够大的市场。”\


安不安全并不容易察觉

\

希波克拉底誓言(Hippocratic Oath)里说过:“首先,不要造成伤害(Above all, do no harm)。”但安全问题并不容易察觉。由于网络延迟消息需要发送两次,向数据库执行了单阶段提交(One-phase commit):这些情况通常被我们视作技术问题,直到我们发现这些消息是在为一些对剂量控制极为严格的药物下单,或者数据库已经在未被察觉到的错误状态下持续运行了很长时间。将对象与状态变量一起存储在数据库中已经成为一种普遍的情况,如果数据库中的这些变量有变化,所还原的对象也可能会处于未定义的状态之下。\

进行更完善的测试,这只是塑造更安全的软件过程中的方法之一。对安全问题采取积极主动的验证,这样的心态更重要,但我们又该如何决定软件中是否存在弱点?\

方法并非总是显而易见的,而我们的看法会受到“脑洞不够大”的蒙蔽。例如,一个文字处理软件能造成什么损害?\

假设你在文字处理软件中创建了下面这样的一份文档,其中的“\u0026lt;\\t\u0026gt;”符号代表制表符(Tab)。\


\

保存该文档,稍后再次用这个字处理软件打开,发现文档的内容变了:\


\

有一个制表符消失了。嗯,这能造成多大危险?答案取决于原始内容最开头的一行内容。表头内容对应的不同列是通过制表符分隔的,加上表头后,“实际的”文档内容是这样:


\

译注:表头三个字段的内容分别为:囚犯姓名;绞刑;释放\

对不住啊Chester!这个问题我们准备在下一版中修复!(这个例子来源于美国海军有关文档保真度的测试规划,出于简化的角度考虑,我把这个场景进行了略微的修改。)\


现实世界中的解决方案

\

为确定安全性,我们不能只依赖对产品代码本身进行的测试。缺陷的数量和安全性之间并没有直接联系。零缺陷并不意味着软件绝对安全,因为“缺陷”是通过与所规定行为之间的关系界定的,而我们的规定本身可能并不正确。也正是因此,很多缺陷才会让人吃惊,“这到底是怎么回事?”,“这种问题不应该出现啊!”,或者“我从没想到竟然会这样!”\

我们可以在自己的产品开发过程中使用一种名为故障树分析法(FTA,Fault Tree Analysis)的分析技术。FTA可以对系统中能够导致组件出现可预见但不希望出现的损失或失败的事件或路径创建可视化模型。从概念上来讲,故障树分析法可以帮助我们发现不安全或不希望出现的最终状态,并可通过建模器反向指定用于生成最终状态的条件。\

FTA使用标准的布尔逻辑(AND、OR、XOR)等概念作为“门户”。传入这些门户的路径和事件将用于生成不希望出现的状态所造成的结果。下面的例子展示了“剧烈头痛”的目标状态以及可能导致这种情况的原因。\


\

FTA是一种强大的技术,很适合用于最终状态已知情况下的整个设计流程,这种技术基于一种失败始终源自硬件或软件组件故障的哲学体系。任何技术人员均可以相当容易地创建故障树示意图,Microsoft Visio还提供了一个FTA模板插件。我发现将故障树示意图与UML状态机示意图配合使用,可以帮助我们更好地理解我为客户开发的产品中可能遇到哪些问题。\

软件安全专家Nancy Leveson创建了一种用来补充和取代FTA的技术:STAMP(系统-理论事故模型和流程,System-Theoretic Accident Model and Processes),这种技术主要专注于系统整体以及不同组件之间的交互,而非只专注于特定组件本身。Leveson认为,失败总是出现在系统处于危险状态时,而系统处于危险状态通常是因为未能对系统行为强制实施必要的安全约束。\

由于对系统采取了整体化系统视角,STAMP并不像只须绘制示意图的故障树那么简单。STAMP针对不同程度的诱因提供了丰富的语义和多角度支持,包括事件链、因果条件,及造成故障条件的系统级原因等。由于STAMP还可包含约束、不同层次程度的控制,以及流程模型,因此不仅可用于软件开发领域,还可用于产品开发和交付过程。\


这和我的Web应用有什么关系?

\

软件产品的开发已不可避免地从单机应用程序发展为需要交付由多个相互交互的功能单位组成的,使用多种语言开发,同时运行在不同公司或组织提供的多个平台上的所谓的“软件”。我们身处于一种“多层架构系统(Systems of systems)”的世界中。通过接口进行交互的做法极为普遍,但都有可能造成失败。我们应当拥抱各种能帮助自己更清楚认识到自己所开发软件的安全性的工具。\

有关安全的顾虑使得我们在发布过程中必须满足各种规范的需求,为了缓解这些顾虑,我们不应等待有朝一日才会出现的完美答案:在致力于实现更高安全性的过程中,就算“零敲碎打”的方法也值得考虑。\

UML状态机示意图可以帮助我们发现危险的,或可能造成错误的状态或状态变化。例如当程序员不知道具体需要执行哪个逻辑时,就会进入一种“Catch all”的状态。当组件处于这种预设的状态后,会产生导致进行错误处理的事件或消息。\

多线程的枚举总是会遇到问题。我们需要尽量通过全面的分析确定关键区域,产生竟态条件的可能性,以及出现死锁或其他多线程异常的可能性。\

当代码检测到错误后,是否需要关闭线程、进程,或应用程序?还是以降级模式继续运行?我们应当从安全性的角度总结出每种可行决定的对应收益和风险。\

现代化应用程序的复杂性可能会让人难以置信,虽然整个行业最近才开始面对可联网汽车和医疗设备的劫持等负面报道,但一些软件产品早就被“杀死”了。\

二十世纪八十年代,软件行业首次遭遇臭名远扬的致命软件故障:Therac-25。这款医疗诊断仪器将六位病人暴露在过量的X射线辐射之下。\

Therac-25的悲剧是很多因素共同作用造成的,包括:\



  • 重复使用上一代产品Therac-20中的软件。 \

  • 用户界面输入字段的相关改动未能注册至控制子系统。 \

  • 竟态条件。 \

  • 纯软件形式的控制方式,未包含硬件锁定装置。

六位遭受过量辐射的病人中,三人由于该仪器的过量辐射而死亡。\

这种悲剧是缺乏测试导致的吗?根据Leveson的介绍,制造商已经进行了非常全面的测试,但也许他们的测试本身是错误的。软件测试主要会通过硬件模拟器进行。人们通常趋向于假设如果软件中不包含Bug,那么软件就是安全的,但这种结论本身就有问题。在她的报告中,Leveson对于在Therac-25中使用PDP-11汇编码的说法就算在今天依然适用:\


\

最基本的错误包括贫乏的软件工程实践,以及所生产的仪器仅能通过软件实现必要的安全控制。此外比具体的代码错误更严重的是软件整体所采用的不安全的设计方针。


\

上述陈述中最令人不安的部分在于,对于当今一款典型的软件产品,其软件整体设计早已超越了我们精确理解的能力。我们正在面临一种悖论。在敏捷开发中,为了更好地理解需求、设计,以及代码的正确执行过程,我们会交付多个小规模的功能块。但在将每个功能块加入上一代产品后,多层架构系统的交互将会以指数形式增长,进而削弱我们对所交付内容的理解和信任。\


“成熟”不能一蹴而就

\

FTA、STAMP,以及UML等模型是可以帮助我们创建更可靠系统的工具。业内的各种故障报告建议我们除了功能的正确性,还应当对产品的安全性进行更为积极主动的尽职调查。存在弱点的可无线联网机动车,暴露到医院开放网络中的医疗设备,会广播父母交谈内容的婴儿监视器,可访问互联网并让黑客听到你说了什么的智能电视… 为了让数字化世界变得安全哪怕一点点,我们都要付出艰巨的努力。\


关于本文作者

\

Gary K Evans是一位敏捷转型顾问,18年来已帮助很多团队和组织顺利采用了敏捷方法。他已获得Scrum Master认证、SAFe 4 Program Consultant认证,以及Design Patterns专家认证,为数十个使用Scrum和极限编程(Extreme Programming)的项目提供了指导。他曾在数十个软件大会上发表讲话,在一本软件开发杂志担任了6年的特约编辑,并担任Jolt Awards for Software Productivity活动裁判14年。他是UML、面向对象的分析和设计、用例、等领域公认的专家,曾是Alistair Cockburn的合伙人。他曾编写过数十套培训课程,涵盖务实业务分析、敏捷项目管理、Scrum敏捷开发、务实用例撰写、面向服务的分析,以及面向对象的分析和设计等领域。\

作者:Gary K. Evans,阅读英文原文:But is it Safe?



推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 深入理解线程、进程、多线程、线程池
    本文以QT的方式来走进线程池的应用、线程、进程、线程池、线程锁、互斥量、信号量、线程同步等的详解,一文让你小白变大神!为什么要使用多线程、线程锁、互斥量、信号量?为什么需要线程 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • 本文摘自JavaGuide。1、简单易学;2、面向对象(封装,继承,多态);3、平台无关性(Java虚拟机实现平台无关性);4、可靠性;5、安全性;6、支持多线程(C++语言没有内 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有