Skip to content

Instantly share code, notes, and snippets.

@kneep
Last active August 29, 2015 14:07
Show Gist options
  • Save kneep/d49bc932fba360feff1e to your computer and use it in GitHub Desktop.
Save kneep/d49bc932fba360feff1e to your computer and use it in GitHub Desktop.

Shellshock漏洞证明是时候放弃CGI技术了

最近,被类UNIX系统广泛使用的Bash软件曝出了一系列已经存在数十年的漏洞(Shellshock),在业界引起了非常大的影响。不少Linux发行版本连夜发布了修复版本的Bash,在服务器领域占有不少份额的FreeBSD和NetBSD已经默认关闭了引起漏洞的功能。InfoQ也及时带来了关于Shellshock的详细报道

在这个漏洞的风波逐渐平息之余,不少业内人士也在思考,它为何波及如此之广,影响如此之大。InfoWorld的专栏作者Andrew C. Oliver在一篇文章中表达了自己看法,他认为CGI技术的普及是个错误,正是因为CGI技术的不合理之处,Shellshock才有机可乘。

CGI技术是Web技术刚兴起的时候发明的,它是最早的可以创建动态网页内容的技术之一。它会把一个HTTP请求转化为一次shell调用。而Shellshock的原理是利用了Bash在导入环境变量函数时候的漏洞,启动Bash的时候,它不但会导入这个函数,而且会误把函数定义后面的命令也执行一遍。在有些CGI脚本的设计中,数据是通过环境变量来传递的,这样就给了数据提供者利用Shellshock漏洞的机会。对此,Oliver抱怨道:

为什么有人会认为,通过HTTP请求给一个陌生人访问shell(哪怕是受限的)的机会是一个好主意呢?我不理解。

Oliver把CGI技术比作“上了膛的武器”,程序员必须非常谨慎地使用它,写出优秀的脚本。但在现代的商业实践中,雇佣优秀程序员已经不是一个必选项,大量的廉价程序员很多时候也能合力完成工作。能写出考虑周全的CGI脚本的人越来越少,这也使得CGI技术更不合时宜了。

Oliver甚至觉得,用C语言编写的动态网页程序都要比CGI好一些,因为避免C语言的缓冲溢出问题其实并不难,如果程序员不给自己挖坑,并且认真做好单元测试的话,问题不会太大。

编写水平糟糕的CGI脚本,确实是互联网上可利用漏洞最多的技术之一了。当然网络、计算机架构等也有可能存在漏洞,但是CGI从诞生之初就是一个设计错误,经历此次Shellshock风波,其弱点也再次暴露在公众面前。Oliver也呼吁大家,逐步放弃CGI技术,“先移除那些暴露在公众访问之下,又需要非常仔细编写才能不出问题的脚本”。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment