据Bleeping Computer 网站披露,近20 家汽车制造商和服务机构存API安全漏洞,这些漏洞允许黑客进行远程解锁、启动车辆、跟踪汽车行踪,窃取车主个人信息的恶意攻击活动。
据悉,出现API漏洞的品牌包括但不限于宝马、罗尔斯、奔驰、法拉利、保时捷、捷豹、路虎、福特、起亚、本田、英菲尼迪、日产、讴歌、现代、丰田和创世纪等其知名汽车品牌。此外,漏洞还影响汽车技术品牌 Spireon 和 Reviver 以及流媒体服务 SiriusXM。
这些API漏洞是被Sam Curry领导研究小组发现,更详细的漏洞报告可以参考他们发布的博客文章(Web Hackers vs. The Auto Industry: Critical Vulnerabilities in Ferrari, BMW, Rolls Royce, Porsche, and More)。
现如今API的应用随处可见,API之所以能在现代软件开发过程中被广泛使用,是因为随着物联网极其软件规模扩大,公开的API数量巨大,开发人员通过调用API快速构建项目,节省了大量的时间。
例如:GEF(graphical editing framework)作为一个常用的Eclipse的图形类库,就涉及6万多个API方法。但是随着API的大规模使用,API网络安全漏洞问题也在逐步攀升。
一、什么是API及API的广泛运用
API是软件库提供的一组可访问的接口,软件库通过API向外提供服务,开发人员通过使用API实现代码复用,提高生产效率。
1968年,在NATO软件工程会议上,Mcllroy首次提出了软件复用的概念,软件开发人员开始有意识地使用标准化组件设计并构建程序。
1972年,Parnas的经典论文探索了使用模块化编程的标准。1992年,Plauger 提出了关于C语言15个接口的完整定义和详细说明。随着面向对象技术以及互联网技术的快速发展,为软件复用提供了更全面的技术支持,API技术快速发展,被视为解决软件危机、提高软件生产效率和质量的现实可行的途径。
API被广泛使用有以下原因:
①API提供了一种代码复用机制,开发人员直接复用已有的程序,节省了大量的时间。
②API提供了一种信息隐藏的机制,用户不需要知道具体的实现细节,直接调用API完成相应的功能。
③API提供了访问某些资源的接口,用户只有通过设备驱动、操作系统API等接口才能够访问到某类资源。不同的组织或者开发人员使用了不同的术语来表示API,并没有形成统一的标准:
(1)类库,如C语言的标准库,Math库等
(2)框架,如.Net框架,Eclipse框架等
(3)工具包,如Google Web Toolkit,GIMP Toolkit等
(4) API,如Win32 APIs,Google Maps APIs等
二、网络安全中API常见的漏洞
API对应着的是操作系统的某些底层功能,一个API函数要满足上层应用程序的各种各样的要求,必然会带来某些特殊的制约因素,为系统带来潜在的风险,在特定条件下就成为系统的安全漏洞。具体来说有以下几种情况:
1.API本身存在的缺陷
①缺少必要的约束检查。在执行某个操作之前,系统必须保证该操作能够分配到所需的资源如需要访问的地址、文件等等。
最常见的情况就是程序设计时忽略了完整性检查与边界检查,从而存在缓冲区溢出漏洞错误,不仅会导致系统崩溃,甚至可以使攻击者执行任意代码,获得系统的最高权限。
例如“CodeRcdII”蠕虫病毒利用的“微软Index Servcr(.ida/idq)ISAPI扩展远程溢出漏洞(MS01-033)”,就是因为ISAPI在处理某些URI,请求时存在一个未经检查的缓冲区。当攻击者提供一个精心构造的特殊格式的URL时,引发缓冲区溢出,使得攻击者可以改变程序执行流程,执行任意代码远程获取“Local Systcm”权限。
②缺少输入的有效性检查:对运行程序的任何直接俞入,如参数的类型和数量等等,都必须对其进行有效性检查。
常见的情况就是API在使用诸如syslem(). popen().xeclp(). cxeevp()等函数的过程中,只要求给出文件名,而不要求指定文件路径,使得入侵者可以欺骗系统去执行不同的文件。
例如“尼姆达”病毒传播时利用的Microsoft IIS 5.0系统文件列表权限提升漏洞”,就是利用这类缺陷,使得病毒能够在IIS进程空间中以父进程通常是系统权限)的权限被执行。
2.底层API的功能没有被公开或不被编程人所知
底层API的功能没有被公开或不被编程人所知的API接口在设计调试过程中往往会为测试时留下一些临时性代码,这些代码不会公开,但它们会产生什么影响,则很难预测。
另一种情况就是操作系统设计时故意留下了一些用户不可知的接口或“后门”,使设计者通过某种手段就可能拥有电脑的控制权。如有可能在特殊条件下通过这种手段远程控制电脑、窃取用户数据等等。更严重的是,一旦这些后门被攻击者预先知道,那么用户的电脑无疑是对攻击者敞开了大门,这种威胁尤其对于政府组织等重要部门是非常危险的。
3.API设计与实际使用的环境不同
API一般都会经过各种各样的测试,然后发布。然而,有时候测试通过的API,在实际使用的过程中会出现与调试时不一样的情况。当API没能正确处理具体运行环境时,这些事先没有考虑到的特殊情况往往就会导致
系统缺陷的产生。
例如在Solaris系统中,SSH 1版中客户端的安全RPC的特点是使用系统给定的密码来加密SSH的私钥文件,而不是要求用户提供一个独立的密码。
当用户使用这一特性时,SSH使用名叫key_encryptsession的API函数来根据用户的公钥和私钥计算出一个“加密密钥”,并用它来加密用户的私钥文件。
安全RPC的密钥由名叫keuserv的进程管理,该进程在用户通过安全RPC认证之后,将用户的公钥保存在内存中。如果用户没能通过认证,那么key_encryptsession并不能得到他的私钥。
但如果keyscrv启动时使用了参数“-d”,key_encryptsession函数将试图使用“无人私钥”来取代用户的私钥并计算"加密密钥”。这样该“加密密钥”就很可能被攻破,并用来恢复出SSH的私钥。而运行在非Solaris系统的其他版本的SSH客户端没有此类漏洞。
4.多个API联合使用
不同API采用不同的机制实现不同的系统功能,一个API单独使用时不会出现问题,然而多个API联合使用时便会因为各自的机制不同而产生安全问题。
例如: Lolus Noles中允许用户在数据库中建立文档和对象之间的连接。虽然这些对象看起来是文档的一部分,但实际上它们是作为单独的文件存储的。
数据库的ACL控制着对文档和对象的访问,Lotus Notes中使用R&A(Reader and Author)列表还可以对个人文档做进一步的访问限制。但是R&A列表仅仅修改对文档的访问限制,而不限制文档所连接亩韵螅虼艘桓雒挥形牡捣梦嗜ㄏ薜娜肭终咭坏┲牢牡档腎D,就可以通过NotesAPI打开未授权访问文档中关联的对象。
当然对于这些情况也是常见的,但发现及解决的难度更大。因为这种情况发生后产生的异常情况的报警往往并不能真正地显示出错位置。而且一般的调试只能够针对某一系统程序,而这种出错一般都会涉及多个程序。如何发现及解决这种错误,还有待解决。
结论:
API是应用程序的基础,自然也就成为网络安全中个最基础的部分,全面的了解系统API及API对网络系统安全的影响将有助于在实际应用中正确合理地使用API进而开发出更安全、有效的API应用程序。