令黑客一筹莫展的编程方法

2014年4月7日,世界首次知道心脏滴血漏洞。OpenSSL中TLS/DTLS(传输层安全协议)心跳扩展实现上的一个小漏洞,却能使攻击者解开受脆弱OpenSSL软件保护系统中的加密措施。在当时,这些加密措施占据了公网大约2/3的江山。攻击者可以窃听那些看起来加密了的通信,盗取隐私数据,冒充服务和用户。

漏洞一见诸报道,OpenSSL便发布了针对心脏滴血的补丁。即便如此,1年半之后,仍有20多万台设备没有打上补丁。

心脏滴血只是冰山一角

围绕心脏滴血的所有关注(当然还有不必要的心理恐惧),表明了小小编程失误在当下互联时代会造成多大的破坏。

计算机技术早期,漏洞不过意味着一点点的不便。那个时候,计算机间互不联通,一个编程缺陷最多就是某个软件时不时地故障一下。或许你需要不时重启一下机器,但最多也就是如此了。

但互联网世界中,一切都不一样了。全球连接性让黑客可以瞄准更多的用户。考虑到人们银行凭证和其他敏感数据的激增,在今天,一个漏洞不仅仅意味着不方便这么简单。通常,编程漏洞就是安全漏洞,攻击者可利用来盗取或披露成千上万用户的个人信息。这也就是为什么心脏滴血之类的漏洞会演变成大事件的原因所在。

但也别会错意。我们的软件也不是全部都被攻破了的。OpenSSL的大多数用例仍然运作良好。心脏滴血仅仅构成了少数黑客入侵场景之一,这些场景中,攻击者可以操纵编程缺陷产生软件功能上的非预期结果。

这就是编程的现实。漏洞司空见惯,因为要把自然语言能描述的想法,转换成机器能理解的指令,可不是件容易的事儿。

除此之外,编程的目标,是使计算机程序能够只实现一套既定的操作,不做多余的事。正派程序员都不会希望有人在自己的软件里找到能让他们窃听加密通信或盗取个人信息的漏洞。因此,程序员有责任让自己的代码无懈可击。

但知易行难。稍微学过一点编程的人都会告诉你,编程出错简直太容易了。要是有什么方法,能让程序员确保自己的代码只做应该做的事就好了……

事实证明,还真有这么一种资源。

代码验证好处多

形式化验证是自70年代以来就在用的一种编程风格,通过确保程序符合每个用例,达到甚至超出程序应在某些可能用例情况下可用的最低要求。

程序员为达到这种包容性,往往将自己的代码展开得像是数学证明,每条语句都延续前面语句的逻辑。程序员们写下的,是描述程序行为的数学公式,并用某种形式的验证程序检查语句的正确性。

你正在写下一个数学公式来描述程序的行为,并使用几种验证机制去校验程序运行后所达到状态的正确性。

想进行形式化验证,程序员首先需要写出形式化规约,或者对计算机程序应怎样工作作出解释说明。然后,用这一规约来验证软件是否到达既定目标。

这可不总是毫不费力的过程。在规约和验证规约所需的语句之间,采用形式化验证的程序,最终可能会比不采用验证却在大多数用例中工作良好的程序代码长度的好几倍。

幸运的是,码农们现在可以用编程语言和证明辅助程序之类的工具来验证自己的程序。事实上,正是几十年前此类资源的缺乏,才导致了直到互联网出现的现代,形式化验证才真正可行。

普林斯顿大学计算机科学教授安德鲁·阿佩尔将之阐述为:

科学技术的很多部分,仅仅是不够成熟到能应用的阶段,因此,1980年前后,计算机科学领域很多部分兴趣渐失。

走向应用

安全研究人员一刻也等不及补回失去的时间了。例如,美国国防部高级研究计划局(DARPA)设立的高可靠性网络军事系统(HACMS)计划中,工程师们就着手制作黑不掉的休闲四轴飞行器。他们通过先将飞行器的代码分区,再通过使用“高可靠的构件”重写其软件架构,做到了这一点。其中一个构件就包含了入侵者不能升级权限以访问其他分区的验证。

在其代号“小鸟”的实验中,黑客组成的红队,收到了四轴飞行器摄像头控制分区之一的访问权。他们的任务,就是获取该飞行器基本功能的控制权。但在努力6周之后,他们依然无法进入另一个代码分区。

这一成果吸引了国防部研究人员的注意。HACMS项目经理,塔夫斯大学计算机科学教授卡斯灵·费舍尔说:

他们无论如何也突破不进去,破坏不了其运行。该结果让DARPA瞩目,纷纷惊讶捧脸:“上帝啊,我们可以在担心的系统里实际使用这种技术了!”

发展前景

自“小鸟”开始,DARPA将形式化验证应用到了其他技术,比如自动驾驶汽车和卫星。

他们还给自己设定了一些未来想达到的崇高目标。阿佩尔希望用1000万美元打造完全经验证的端到端系统,比如Web服务器。同时,在微软,工程师们正在创建HTTPS的验证版本,以及无人机之类设备的验证规范。

作者:佚名

来源:51CTO

时间: 2024-10-27 10:46:31

令黑客一筹莫展的编程方法的相关文章

在VB中使用水晶报表的一种简易编程方法

编程|水晶报表       水晶报表(Crystal Report)的业内最专业.功能最强的报表系统,它除了强大的报表功能外,最大的优势是实现了与绝大多数流行开发工具的集成和接口.在VS.Net平台做过报表开发的程序员,一定都对水晶报表强大.高效.集成等特性留下了深刻印象.除了开发新程序外,在工作中我们常需要接触到很多较早的软件系统报表功能升级的需求,如果能结合水晶报表这一强大的工具,往往能事半功倍.       VB是以前流行的数据库开发平台,用其开发的C/S系统在社会上有非常大的保有量,但V

无线标记语言(WML)基础之WML编程方法

编程 元素和标签是WML的主要语法,它们决定了WML编程的基本原则.本章我们将从WML的元素.标签.属性等方面详细讲解WML的编程方法.学习本章知识之前,读者应当了解WML元素与标签的区别.WML的元素通常有一个首标签.内容.其它元素及一个尾标签组成.也就说,单独的标签是一个元素,成对出现的标签与其包含的内容也构成一个元素.由于元素牵涉及标签,标签又涉及属性. 3.1 卡片.卡片组及其属性 我们前面介绍了WML的卡片与卡片组,主要从概念和相互关系的角度进行了分析.我们这里则从卡片.卡片组的组成.

最大限制地提高代码的可重用性,克服传统面向对象编程方法在可重用性方面的不足

编程|对象     重用是一种神话,这似乎正在日渐成为编程人员的一种共识.然而,重用可能难以实现,因为传统面向对象编程方法在可重用性方面存在一些不足.本技巧说明了组成支持重用的一种不同方法的三个步骤. 第一步:将功能移出类实例方法由于类继承机制缺乏精确性,因此对于代码重用来说它并不是一种最理想的机制.也就是说,如果您要重用某个类的单个方法,就必须继承该类的其他方法以及数据成员.这种累赘不必要地将要重用此方法的代码复杂化了.继承类对其父类的依赖性引入了额外的复杂性:对父类的更改会影响子类:当更改父

第二章-Delphi面向对象的编程方法(四)(1)

2.1.10.7 将库单元加入工程 将库单元加入工程是比较简单的.无论是您自己建立的库单元还是Delphi建立的与窗体有关的库单元,如果已经完成,则先打开您想加入库单元的工程(可以用Open Project打开工程):再选用File|Open File,然后选择您想加入的源程序(.PAS文件),并选择OK即可.则库单元被加入到应用程序中. 2.2 用Delphi的对象进行编程 Delphi是基于面向对象编程的先进开发环境.面向对象的程序设计(OOP)是结构化语言的自然延伸.OOP的先进编程方法,

Python实现数据库编程方法详解

  本文实例讲述了Python实现数据库编程方法.分享给大家供大家参考.具体分析如下: 用PYTHON语言进行数据库编程, 至少有六种方法可供采用. 我在实际项目中采用,不但功能强大,而且方便快捷.以下是我在工作和学习中经验总结. 方法一:使用DAO (Data Access Objects) 这个第一种方法可能会比较过时啦.不过还是非常有用的. 假设你已经安装好了PYTHONWIN,现在开始跟我上路吧-- 找到工具栏上ToolsàCOM MakePy utilities,你会看到弹出一个Sel

《Visual C++数字图像模式识别技术详解(第2版)》一2.1 Visual C++编程方法

2.1 Visual C++编程方法 面向对象是一种重要的程序设计方法,采用这一思想的C++是当今世界上应用最广泛的编程语言.Windows平台下的C++编程工具首推Microsoft的Visual C++.但是,编写Windows应用程序只熟悉C++的语法还是远远不够的,还必须掌握MFC(Microsoft Foundation Class,微软基础类库). 面向对象的编程是当前程序设计中的热门话题,这里将介绍使用Visual C++进行面向对象编程时所用到的一些关键概念,这些概念是进一步学习

mfc-MFC单文档是socket编程方法

问题描述 MFC单文档是socket编程方法 我不知道recv函数应该放在什么地方,一接收数据就有问题,大神请指教 解决方案 recv函数最后在一个线程中,

雏凤清音——面向数据的前端编程方法

1 名词解释 桐花万里丹山路,雏凤清于老凤声--唐·李商隐<韩冬郎既席为诗相送因成二绝> 作为一种有别传统的前端编程方法,雏风名之.面向数据的编程方法,避开繁琐的ui代码,直接针对前端数据模型编程,你的程序就能更加清晰简单.清音名之. 2 从实例开始 避免过于枯燥的陈述,我们从实例开始,我们以百度 WebIM分组管理为例. 这里面,我们需要对用户分组列表执行:添加.删除.修改.保存.取消.排序等六种功能. 这算是一个比较常见的需求,那么,我们通常在前段实现这种功能,一般如何设计?多少代码?多长

《Arduino开发实战指南:LabVIEW卷》——3.2 LabVIEW的数据流编程方法

3.2 LabVIEW的数据流编程方法 LabVIEW使用数据流(Dataflow)的编程方法,程序也是按照数据流的模式运行.当接收到所有所需的输入时,程序框图节点将运行.节点在运行时产生输出端数据并将该数据传送给数据流路径中的下一个节点.数据流经节点的过程决定了程序框图中VI和函数的执行顺序.Visual Basic.C++.Java以及绝大多数文本编程语言都遵循程序执行的控制流模式.在控制流中,程序元素的先后顺序决定了程序的执行顺序. 如图3-10所示,显示了一个数据流编程的示例,程序框图中