实证评价可用性和安全性

今天的计算机系统通常包含数以百万行的代码和集成组件构成,其中许多是由第三方编写的。应用程序接口(APIs)是连接这些软件组件的桥梁。当SEI和其他人已经把重点放在开发安全的编码实践,而没有同等重视APIs。这个博客文章介绍了我们最近的研究,旨在为AP设计师提供具体的指导,帮助他们处理API组件的安全问题。

API安全漏洞概述

API破坏软件系统安全性由来已久。C字符串库是在70年代开发的,仍然是安全问题的一个主要来源。最近,许多网站开始添加功能按钮,允许用户登录使用他们的Facebook证书。该网站必须使用Facebook编写的API。类似地,如果该网站使用另一个厂商的身份验证凭据,那么必需使用该厂商的API。不幸的是,研究人员发现,虽然这些API在技术上是正确的,但他们很难安全的使用。事实上,研究表明大多数网站在错误的使用他们,用户可以使自己的 Facebook或其他证书被盗(这些问题随后纠正)。

这个例子说明,最终,网络安全失败的原因是程序员编写的有缺陷的代码。毕竟,程序员也是人,人也会犯错误。API在技术上是正确的,但不足够好,它还是会被其他程序员使用,因此最终失败。

我们工作的基础

虽然设计出的API使开发者很容易使用,但知道很少有关于如何做到这一点,常识已经证明是不可靠的。据我们所知,我们是第一个研究API的安全性和可用性的。

布拉德梅尔斯大学计算机科学学院的教授,是联合首席研究员和他的博士生一起研究的项目。我们还与乔纳森奥德里奇合作,另一位教授在CMU的计算机科学学院,在CMU的软件研究所系统科学家的Joshua Sunshine,和在SEI的福雷斯特沙尔。

我们的研究集中在非安全相关的APIs的可用性和安全性,因为我们有兴趣在安全问题的后果,而程序员都集中在功能,而不是安全。我们的研究使得APIs在软件开发工具包和语言功能之间的有点区别。例如,将并发是建立在JAVA中,但它被认为是作为一个库(虽然编译器不同意这个)。另外,C++的常量和Java的最终有不同的语法。

最终,我们的研究有三个目标:

API设计者提供可控的和具体的指导,影响API设计的安全策略及安全性与适用性的交互。为语言设计人员提供指导,影响API设计人员表达重要属性的能力。

为这领域的研究提供公认的方法。

第一阶段,我们的研究主要集中在访谈和测试专业的程序员,以及与关键API的设计者进行结构化访谈,以确定安全相关的问题。我们工作的第二阶段的工作重点是设计和建造的原型工具,使设计人员能够提高他们建立的API的可用性和安全性。我们工作的第三阶段是与学生和程序员进行可控实验,以验证和测量我们的尝试,以提高API的可用性和安全性的结果。

状态控制与稳定性

一个由API设计者做出的基本设计策略是如何管理和控制状态的。例如,安全性和功能性编程语言团队都高度推荐设计不可改变的对象,这些对象创建后其状态是不可更改的。

以下举例说明:

Oracle安全指南强调,最大限度地依赖于不可改变的对象是一个完善的策略,用于创建简单、可靠的代码。

Java安全指南强调额外的工作是防止漏洞需要可变对象。

最后,易变性,即时间差攻击密切相关,涉及到改变一个对象的状态在权限检查但是在操作敏感。既然不可变的对象不能有他们的状态发生改变,以防止TOCTOU攻击。

以前的工作

之前的工作由一个梅尔斯博士的前学生,Jeffrey Stylos写的,提出了有趣的问题研究。微软史提芬和克拉克,在他们的文章中指出了可用性的影响需要对象参数,研究了两种不同的API对象构造方法的可用性。如果你有一个对象”fooclass”需要两个参数,可以成功地应用,有两个基本选择如何构造对象,如下代码所示:

对象构造函数的基本模式:

1. Required-constructor:
foo = new FooClass(arg1, arg2);

2. Create-set-call:
foo = new FooClass();
foo.setArg1(arg1);
foo.setArg2(arg2);

创建调用集合意味着对象必须是可变的

在第一种方法中,你需要程序员在构建对象时提供两个参数。二是创建一个“空白”对象,然后有程序员明确地设置了两个参数。这第二种方法意味着对象必须是可变的。

令人惊讶的是,Stylos 和 Clarke发现,所有的程序员,他们研究发现的第二个方法更有用。程序员更有效率,而且一般都喜欢用API,这就造成了空白的对象,必须满足未来。然而,这种方法困扰着安全专家,因为有许多可能的途径导致失败。这一发现导致了非常具体的研究问题:我们可以复制这个结果,如果是这样的话,我们可以衡量来折衷可用性和安全性?


评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。