“让开发者爱上安全测试”系列之软件安全漏洞谁之错? ——我为软件开发者正名
作者: 日期:2016年11月24日 阅:4,074

做软件安全这么多年,一直都在讲述一个理念:“软件开发人员是软件的缔造者,也是软件安全漏洞的制造者,应该为软件安全漏洞负责。”其实有的时候想想,这种“扣帽子”的讲法挺不对起广大的“程序猿”们。当然,这也不是只我一个人这么讲了。所以今天我们一起来聊一聊软件安全漏洞的产生原因,到底是不是我们可爱的“程序猿”的错?

聊之前,我们先明确两个软件安全的定义,今天也把它作为这篇文章的背景吧。

1. 什么是软件安全?

%e5%9b%be%e7%89%87-1

2. 什么是软件安全漏洞?

%e5%9b%be%e7%89%87-2

软件安全漏洞产有根源? ―――“如今的黑客主要利用软件自身存在安全漏洞进行攻击。而这些软件安全漏洞产生的根本原因是由于不良的软件架构和不安全的编码产生的。” (注:出自《Software Security》2005 Gary McGraw USA)

从上面的两个定义上看,不是“开发时的疏忽”就是“不安全的编码”,软件安全漏洞好像铁定就是开发者的错了,事实上是这样的吗?开发者真的就是那个“罪魁祸首”吗?在我看来,我们的“程序猿”就是那一天到完忙着打妖怪,完了还得被念“紧箍咒”的孙悟空。(程序猿=孙悟空,好像还是猴!)为什么这么说呢,证据如下:

证据1:SQL Injection的编码方式

我们拿大家都耳熟能详的SQL 注入漏洞来举例说明,这个漏洞在很多软件中都出现过,目前仍是最主要的黑客攻击手段之一。SQL注入漏洞,不管你是使用什么开发语言,只要使用SQL语句进行数据库交互就有可能引入SQL注入的风险。它在代码中显示的形式是这样的:

%e4%bb%a3%e7%a0%81%e6%ae%b51

那么我们也都知道,对这个SQL注入漏洞最常用、最有效的修复方法是什么呢?如下段代码,将所有数据以参数绑定的方式Set到SQL语句中,就可以很好的解决这个问题。

%e4%bb%a3%e7%a0%81%e6%ae%b52

然而,大家想过没有,这同样是一段代码,同样是开发人员编写的,为什么之前的就是个漏洞,后面的就没有漏洞了?之前的那个真的是开发人员有意那么写的么?还是真的就是一时疏忽?另外,为什么我们的开发语言会有第一种不安全的写法,我们又是为什么最初的时候写的总都是那种不安全的写法?我们的开发者又是从哪里学习的第一种“有漏洞”的写法?

证据2: Microsoft 公司出具Banned Function Call

早在2007年,Microsoft 公司在开发Windows Vista的时候,已经号称完全实现了SDL的安全开发生命周期管理,其中由微软首席安全顾问,Michael Howard主导的 SDL-Banned Function Call 就明确说明,在微软的开发者是不能再调用微软自己早期提供的所有函数库的API,全部用新发布的Safe CRT 进行代替。

具体如下:

%e5%9b%be%e7%89%87-3

微软Banned API

由此可见,几乎微软早期所提供的函数库中的全部API都是被禁止的,也就是说这些都是不安全的。那换句话说,2007年之前的开发者,如果用这些API是不是无论如何细致的编程都是有漏洞的?都是不安全的呢?

证据3: Intel 欲在CPU级别干掉缓冲区溢出

据安全牛6月份的新闻报道(《英特尔尝试在CPU级别干掉缓冲区溢出》),Intel 欲在CPU级别采用先进的控制流强制技术(Control-flow Enforcement Technology, CET)尝试阻挠会使用面向返回编程(Return-orientated programming, ROP)和面向跳转编程(Jump-orientated programming, JOP)来解决安全漏洞的利用。

我们先不管这个能不能实现,如果缓冲区溢出真是被Intel 在CPU层面解决的话,那是不是意味着以后开发人员不论如何疏忽,如何不安全编写代码都不再有这个缓冲区溢出的安全漏洞了呢?

由以上事实证明可见,软件漏洞并不是开发人员的“一时疏忽”,也不是“有意为之”而产生的(有意为之的那叫“后门”)。在我看来,软件漏洞=软件的“负功能”,是开发者设计程序时没有考虑到的,甚至是不知道的,而软件系统运行环境又给这些“负功能”提供了技术支持,被那所攻击者所利用,就产生了安全漏洞。所以软件安全漏洞产生的根源在大家对“软件安全知识”的缺乏,开发者不知道什么编写方式是安全的,什么函数库是不安全的,和那些利用这些“负功能”的黑客们信息严重的不对称。所以“一言不和就被攻击了”。

另外一方面,在软件安全的建设上,公司的领导首先想到的就是买这个安全设备,买那个安全盒子。没有领导给开发人员开小灶,给发个“安全编码”补贴什么的。不给补贴,多一点儿安全开发培训也是好的呀。可是这些都没有,反而给的都是在“程序猿”们加班加点完成一项项开发需求,消灭掉一个个工作任务之后,又来一通安全的“紧箍咒”,“真是让老孙好生心烦!”。

由于篇幅问题,不再往下侃了,最后总结:软件安全漏洞的产生并不是开发人员的错,有漏洞是不可必免的。有漏洞不可怕,可怕的是根本不知道有漏洞,更不知道用什么方式来修复安全漏洞。解决软件安全漏洞最根本的方法就是加大对开发者和相关技术人员的软件安全知识的培训与教育,加强安全漏洞识别和修复的实践工作,提高查找和修复软件安全漏洞的能力和速度。

作者:王宏

 

申明:本文系厂商投稿收录,所涉观点不代表安全牛立场!


相关文章