关于 Heartbleed(心沥) 漏洞

image

什么是 Heartbleed

仅仅通过 Heartbleed 这个名字,我们就能感受到这个漏洞很严重,心脏出血啊!
看一下网上关于这个漏洞的报道:

心脏出血漏洞(Heartbleed Bug)是今年以来最严重的互联网安全漏洞,影响了全球近2/3的服务器,造成的数据泄露不计其数,我们身边的网络安全因此次漏洞出现“内伤”。 — Pingraphic

互联网史上最大的安全漏洞——Heartbleed(心脏流血)漏洞。– Business Insider

4月8日或许是让很多互联网企业运维人员忙得焦头烂额的一天。 — 网易科技

互联网当前最危险的漏洞 — 网易科技

如果类似事件的影响程度分为1-10级的话,这次事件的影响会达到11级。 –著名的安全专家 Bruce Schneier

还有网友们惊呼:

“互联网安全史上最致命一击“

“2014 年 4 月 8 日,这一天必将永载互联网史册”

“狼真的来了”

那么,这个 Heartbleed 到底是什么。官方说法:

The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library.

即:Heartbleed 缺陷是流行软件库 OpenSSL 中的一个严重缺陷.

为啥这个缺陷很严重,因为这是互联网技术架构中很底层的一个缺陷,会影响到互联网的许多方面。

OpenSSL 是 SSL/TLS 的一个开源实现。SSL/TLS 是目前互联网安全认证的基础加密协议,几乎所有和安全相关的协议都使用了 SSL/TLS。虽然 SSL/TLS 有很多种实现方式,但是 OpenSSL 是使用最为广泛的一种,因此,OpenSSL出了漏洞,也就意味着互联网的大部分服务都可能存在漏洞。

利用这个漏洞,黑客可以获取服务器上存储的敏感信息,包括各种账号密码! 这个漏洞真的很严重!

漏洞原理

这么严重的漏洞,一定很复杂吧。恰恰相反,这个漏洞的原理非常简单,甚至可以说是个低级错误造成的。

这里有个漫画很形象的解释了漏洞的原理 http://xkcd.com/1354/ ,果壳有中文版本 http://www.guokr.com/post/580383/

稍微技术一点说,导致这个漏洞的关键就是一个学过 C 的大一学生都知道的函数 memcpy :

void * memcpy(void *restrict dst, const void *restrict src, size_t n);

这是把一段内存数据拷贝到另一个位置的操作,参数 dst 表示要拷贝到的目的起始地址,src 是存放待拷贝的数据的起始地址,n 表示需要拷贝的数据长度。正常情况下,src 对应的地址放着待拷贝的数据,n 指示着数据的大小,dst 有足够的空间存放这些数据,函数可以正常工作。

如果不小心传入了一个错误的 n 值,比实际真正需要数据长度要大,那么这个函数就会继续拷贝真正数据后面的内存内容,直到拷完全部 n 个字节为止。这就是 heartbleed 漏洞的直接原因!

在 OpenSSL 中,n 值是客户端传上来的,src 的内容也是客户端提供的,服务端代码直接使用 n 开辟了目标内存 dst,然后就开始 memcpy. 这样如果客户端别有用心制造一个数据,传一个很短的数据作为 src, 然后传一个很大的长度 n,这样,服务就傻傻的开始拷贝内存内,直到把长度为 n 的数据都拷贝到 dst 里,然后把 dst 发给客户端! 这样,客户端就得到了它本来不应该得到的数据!虽然这这些数据不一定是什么内容,但是这个过程可以反复重复,这样,一个别有用心的客户端就有很大概率获得服务器进程中存储的各种敏感内容!

这个原理其实是一个极其普遍的情形,很多年来,它一直在造成无数的服务器端漏洞,memcpy 是一个非常不安全的函数,很多现代编译器都已经抛弃甚至禁用它了。

除了这种情况,memcpy 还有另外一个常见的漏洞。当 dst 开辟的内存空间不足以容纳长度为 n 的数据时,memcpy 就会继续向后拷贝,覆盖其后面的其他数据!如果某个别有用心的客户端提供一份精心设计的数据,这个数据是一段代码,那么,memcpy 就会把这段代码覆盖到正常的数据上,在某种情况下,代码获得了执行,就相当于客户端入侵了服务器,拿到了执行权限!这就是造成大部分注入、入侵漏洞的原因。

漏洞的发现和公开

据说这个漏洞是由 Google 和 Codenomicon 同时独立发现的。当然,这是因为他们公开了,我们才知道这个漏洞。而这个漏洞实际上已经存在两年之久了,这么长的时间里,有多少黑客发现了这个漏洞而没有公开,又有多少人利用这个漏洞做了多少事情,我们不得而知。

Codenomicon 是由一群芬兰IT专家建立的国际网络安全研究所,它在全世界六个国家都有自己的办公室。这群专家其实各个都是赏金漏洞猎人,而Codenomicon的工程师的日常工作,或者说最擅长的工作,就是为软件检查漏洞,再写出修复补丁。Verizon,微软还有Adobe都是他们的客户。

个人认为 Codenomicon 在这次漏洞事件中做出了极大的贡献,这并不仅仅是因为他们发现并报告了这个漏洞,而是因为他们接下来所做出的宣传工作,极大的降低了这次漏洞对整个互联网造成的伤害。

OpenSSL 只是一个开源软件,由几个开发者组成的小组维护。Codenomicon 认为,由 OpenSSL 小组来发布这个漏洞,很可能不会引起广泛的重视,因为对于关注软件漏洞的安全工程师来说,各种漏洞每天都有,而这次,必须要让大家都警醒起来。

CVE-2014-0160, 是这个漏洞最初的代号,和其他各种漏洞一样,没什么特别的,只是个代号。而 Codenomicon 的员工想到了 Heartbleed 这样一个名字,让这个漏洞的宣传变得更为简单和明确。这也是一个非常形象的名字,因为漏洞本身就来自处理心跳的代码,漏洞又属于缓冲区溢出类型,所以 Heartbleed 简直可以完全说明这个漏洞的特点。

Codenomicon 还立即注册了 heartbleed.com 这个域名,给它建立了一个网站,还设计了一个非常形象的 logo, 就是本文开头引用的那个图片。

这个网站极大的帮助了这个漏洞的宣传,让很多人了解了这个漏洞,让很多网站在第一时间修复了这个漏洞,从很大层度上降低了这个漏洞带来的损失。

看到有些报道中对 Codenomicon 把精力用在做网站和 logo 上,而不是更多的通知那些网站去修复漏洞 表示不满。我认为 Codenomicon 做的非常对,一个形象的名字和形象的 logo,对于传播来说非常重要,而有效的传播,才能让更多的公司了解并修复该漏洞,这比主动去通知和解释这个漏洞要高效的多,Codenomicon 不愧是专业的安全公司。

微软苹果不受影响?

据他们自己声称,微软和苹果的网络服务在这次漏洞爆出时没有受到严重的影响。

是微软和苹果的技术更好吗?显然不是,只不过微软和苹果没有大面积使用OpenSSL而已,他们使用了其他的类库来实现对应的功能。

那么,其他的类库就更好吗?当然不是,苹果使用的 SecureTransport 在之前也爆出过相当严重的漏洞。而微软,漏洞和补丁大家已经很习惯了。

代码都是人写的,人都会犯错,所以没有那个代码库是绝对安全的。像 OpenSSL 这样的开源库,所有人都可以查看其代码,所以有了漏洞更容易被发现,安全性反而更高。

马上更改密码?

我们作为普通的互联网用户,面对这个漏洞,要做的是什么?一般来说,当我们的敏感信息有可能泄露的时候,我们应该马上修改它们。

但这一次,不要太着急,我们应该在确定网站服务器已经修复该漏洞之后,再去更改密码。如果服务器端漏洞依然存在,即使更改了密码,又容易马上泄露。

目前,漏洞发布已经过去一周了,大多数靠谱的互联网公司,都在漏洞发布24小时内修复了漏洞,大家可以修改密码后放心使用。而对于各种小站或者办事效率极低的或官僚风气严重的网站,则有可能修复较慢。

这里可以测试某个网站服务器是否修复了该漏洞 http://filippo.io/Heartbleed/

安全行业的耻辱还是开源社区的悲哀

有人说,一个如此低级的错误居然堂而皇之的存在了两年之久才被发现,真是IT安全行业的耻辱。

OpenSSL 作为一个开源软件,被数以百万的软件和公司使用着,却没有多少人在真正维护它。开源软件在软件行业被广泛接受,其中一个很重要的原因就是其质量足够好。可是大家可能忘了,开源软件质量足够好,是因为维护者足够多,如果大家都是只使用,而不维护,那谁来保证开源软件的质量?这让我想到一句歌词:你不扛枪我不扛枪,谁来保卫祖国谁来保卫她?或许不太恰当,但我们似乎太习惯了享受开源带来的好处,太习惯了拿来主义,总觉得,有那么多人维护呢,但如果不是你我他,那些维护的人又从何而来呢?

引入这个漏洞的作者 Seggelmann表示,如果这一事件有什么积极影响的话,那就是开源软件需要更多的人加入进来,贡献自己的力量。

作为一个程序员,我想我可以感受到 Seggelmann 的无奈。作为 OpenSSL 的作者,他们凭着几个人的力量,维护着整个互联网安全的基石,一旦出了问题,很多人就会把矛头指向他们。据悉,OpenSSL 每年只能拿到大概 2000 美金的捐赠,这简直不够一个实习生半个月的薪水!那些依赖 OpenSSL 节省了大量成本的公司,却没有多少真正关心过这个开源社区。

希望这次事件,能让我们学到免费的代价。

参考资料

  1. http://en.wikipedia.org/wiki/Heartbleed
  2. https://zh.wikipedia.org/wiki/%E5%BF%83%E8%84%8F%E5%87%BA%E8%A1%80%E6%BC%8F%E6%B4%9E
  3. http://heartbleed.com/
  4. http://www.zdnet.com/apples-ios-os-x-dont-have-heartbleed-bug-but-bbm-for-ios-and-android-do-7000028334/
  5. http://www.cbsnews.com/news/changing-your-password-for-heartbleed-bug-heres-what-you-need-to-know/
  6. http://www.zdnet.com/google-aws-rackspace-affected-by-heartbleed-openssl-flaw-but-azure-escapes-7000028281/
  7. http://www.leiphone.com/man-who-introduced-heartbleed.html
  8. https://news.ycombinator.com/item?id=7575210
  9. http://tech.qq.com/a/20140411/020404.htm
  10. http://tech.163.com/14/0412/14/9PKVM4FP00094ODU.html

Gestalt Principles 格式塔原则

Gestalt 是一个源自德语的单词,在德语中的意思是“形式、形状”,在英语中引申为“统一的整体”,专业一点说叫做“完形”。

Gestalt Psychology,格式塔心理学,也叫做完形心理学,源于19世纪初心理学界关于认知的研究。格式塔心理学强调整体和完形,认为人类的意识首先感知到整体,其次或同时感知到组成整体的各个部分。与之对应的学派是构造主义心理学,认为复杂的知觉是简单知觉的组合。

如此纷繁复杂的大千世界,人类的大脑确可以轻而易举的的认知到各种千奇百怪的事物,这真是件非常奇妙的事情。然而人类的大脑是否能真正了解人类的大脑,却一直困扰着科学家和心理学家们,格式塔心里学在人类认知上给出了一些结论,总结为格式塔原则, Gestalt Principles 或者 Gestalt Laws, 也叫做 Principles of grouping 或 Gestalt laws of grouping,即 分组原则或格式塔分组定律。

相似性原则

当某些东西和其他东西看起来相似时,人们倾向于把它们作为一个整体对待。例如:

image

连续性原则

当某些物体和其他物体对齐或连成一线,人们倾向于将他们作为一个整体对待。连续性原则使得那些被其他物体挡住的物体依然被作为一个整体来感知,但有时候,这种认知却是错误的,例如

image

封闭性原则

当物体接近但没有完全构成一个封闭的形状时,人们会自动将其作为一个封闭的形状来感知,那些缺失的部分被脑补了出来。这里有一个很好的例子:

image

临近性原则

人们会自动将距离近的物体作为一个整体来看待,同样,这个特点有时候也很不靠谱:

image

主体/背景原则

人们会不自觉地试图区分出主体和背景,这个例子很好的说明了这一点。

image

共同命运原则

当一些物体具有相同或相似的运动轨迹、方向或频率的时候,人们会倾向于把它们作为一个整体对待。

格式塔原则是对人类认知行为的总结,了解这些原则,有助于让我们不容易受到自己的欺骗(大家总说是眼睛欺骗了自己,实际上是大脑欺骗了你自己),更好的认清事实。在视觉设计中,利用格式塔原则,则可以帮助我们做出更好的设计。

参考资料

  1. http://www.scholarpedia.org/article/Gestalt_principles
  2. http://en.wikipedia.org/wiki/Gestalt_psychology
  3. http://www.slideshare.net/luisaepv/the-gestalt-laws-of-perception
  4. http://graphicdesign.spokanefalls.edu/tutorials/process/gestaltprinciples/gestaltprinc.htm#similarity
  5. http://baike.baidu.com/view/562626.htm
  6. http://blog.163.com/qin_et/blog/static/1755412182008317102950392/
  7. http://blog.163.com/zeng_lanxin/blog/static/174724274201111199459130/

Box2D 和 Chipmunk

Box2D

Box2D 是个非常流行的物理引擎,有大量的游戏使用 Box2D 完成,在 AppStore 上,Angry Birds 和 Tiny Wings 都使用了 Box2D 引擎。

2006 年,Erin Catto 在 GDC 上演示了 “Box2D Lite”. 2007年9.11,Box2D 在 Sourceforge 上发布开源版本,2010年, Box2D 迁移到 Google Code. 直到现在,还没有迁移到 github, 呵呵

关于愤怒的小鸟使用 Box2D 还有个小插曲:2011年的,GDC ,当时 Rovio 正如日中天,在他们的宣讲会的问答环节,一位听众站起来
问:“Angy Birds 用的是神马物理引擎?”
答:“Box2D”
问:”你们会考虑在游戏中给 Box2D 来个 credit 吗?”
答:”会的”
问:“谢谢!顺便说一下,我就是 Box2D 的作者 Erin Gatto”
答:“太好了!会后我们再详细聊一下”

这部分是来自 Erin 自己在论坛的转述,techcrunch 对这个事情也有报道:http://techcrunch.com/2011/02/28/creator-of-angry-birds-physics-engine-calls-out-rovio-for-not-giving-him-credit/. 这个事情在国内被用来批评和嘲讽 Rovio 的骄傲态度。但 Erin 在论坛明确表态 Rovio 非常友好,自己也很尊敬 Rovio. 并表示不会向 Rovio 索取费用. (技术宅的高风亮节啊)

Continue reading

DevArt——程序员的艺术

在网上逛的时候无意遇到了 https://devart.withgoogle.com/ 眼前一亮。

什么是 DevArt

DevArt is a new type of art. It is made with code, by developers that push the possibilities of creativity and technology. They use technology as the canvas and code as the raw materials to create innovative, engaging digital art installations.

这个应该是官方的定义吧,试翻一下:

DevArt 是一种新的艺术形式。是开发者利用编码和开发技术,拓展创意,制作出的一种创新的,引人入胜的数字艺术程序。

Google 在 https://devart.withgoogle.com 举办了一个 DevArt 的竞赛,为程序员和艺术家提供了一个展示平台,希望能推动 DevArt 的发展。 Google 将和巴比肯中心(Barbican Centre)在今年夏天举行题为:“数字革命” 的艺术展览,其中,DevArt 将是重要组成部分。

http://www.devart.com/ 是乌克兰的一家科技公司,主要产品是数据库相关的开发工具和解决方案。今天说的 DevArt 跟它没有关系,只是偶然重名了而已。

个人理解,DevArt 就是以展现艺术创意和表达为目的的软件程序。它不像传统的应用程序,其目的是为了满足应用的需求,DevArt 程序的主要目的是艺术表现。

DevArt 和传统的由艺术家设计,交由程序员实现的程序不同,DevArt 更强调程序和技术的作用,更注重由程序员用代码直接展示其艺术思想,展现技术本身的艺术性。

另一方面,DevArt 又不应该是“技艺”的展示,它不是《计算机程序设计艺术》里面指的那种艺术,不是程序设计的艺术性。编码在这里依然只是个手段,重点还是通过编码来表达一定的艺术思想,而不是编码本身的艺术化。

image

node.js 异常处理 和 domain

node.js 的纯异步思路给编程带来了新的体验,同时也挖了一些坑…

无效的 try…catch

在 node.js 中,你无法使用传统的 try…catch 来捕获异步函数中的异常。看这段代码

try{
    ...

    setTimeout(function(){
        ...
        throw new Error("some error");
        ...
    },1000);
}
catch{
    // 处理异常
}

此处 throw 所抛出的异常是无法被 catch 到的,因为异常是在 try 执行完毕之后才被抛出的,此时 try…catch 的作用域已经不存在了。
Continue reading

BaaS ——移动App开发者的福祉

Backend as a service (BaaS)

BaaS 中文被翻译为“后端即服务”。这个概念理解起来其实很简单,比我之前写过的 云计算的几个概念 IaaS,PaaS 和 SaaS——都是 XaaS 还更容易一些。

现在做 App,已经很少有完全不需要网络交互的了,或多或少都需要跟服务器通讯,在一般的开发中流程中,都会安排专门做服务器的人员在团队中,服务器和客户端确定好各种消息协议,相互配合实现需求。其实,对于用于支持 App 的服务器端开发,往往大同小异,总是有账号、登陆、统计、充值等功能,成熟点的公司会把这些常见的通用功能做成一个框架或类库,在不同项目中进行复用。当某个框架的做的足够通用时,那它不仅可以给自己的App提供服务,也可以给别人的 App 提供服务了,这就成了一个 BaaS。

Continue reading

Objective-C 的包管理 CocoaPods

关于包管理

包管理的概念应该是来自操作系统吧,例如 ubuntu 的 apt-get 。

类似的概念被借鉴到应用程序级别,用来管理其依赖的其他软件包。很多编程语言,都有自己的包管理工具,或者说是第三方库管理工具,如 Python 的 pip, Ruby 的 gems, Node.js 的 npm 都是很好用的包管理工具。

我们总说,不要重复发明轮子,但是我们需要一个途径找到我们想要的那个别人已经发明好的轮子才行,包管理工具,就是个帮我们找轮子、装轮子和更新轮子的工具。

Continue reading

游戏编程的未来——FRP(函数式反应型编程)

编程范式

先要说说编程范式。

编程范式(Programming paradigm) 其实就是计算机编程所使用的方法,是设计程序结构所采用的设计风格。

目前主流的编程范式有:命令式编程(Imperative programming)、函数式编程(Functional programming)、面向对象编程(Object-oriented programming)等。我们普通码农最熟悉的应该就是面向对象编程了。

我们常见的架构、设计模式等都是在面向对象这个范式下面进行的设计,而编程范式则是更高一层的概念,它关注的不是怎么用写程序来解决问题,而是关注各种不同的设计程序的思考方式。

最近,函数式编程 越来越流行,我们也开始关注编程范式这个概念了。编程范式有很多种,维基http://en.wikipedia.org/wiki/Programming_paradigm 列出来的大大小小的编程范式有几十种之多。

Continue reading

编程中的那些“动物小伙伴”

/*
在编程中,我们有时候会碰到一些“动物小伙伴”,这些形象而有趣的名字给我们的编程生活带来了不少乐趣,一起来看看吧~
*/

Python 语言

Python 是我最喜欢的编程语言,但现在要加上’之一‘了。

为什么要用“蟒蛇”来命名一个编程语言,这就要问 Python 的作者了。Guido van Rossum(吉多·范罗苏姆)是一名荷兰的程序员,是Python编程语言的创始人。1989年圣诞节,Guido 为了打发圣诞节的无趣,决心开发一个新的脚本语言,他想为这个语言找一个简单新颖而又有点神秘感的名字,正巧当时他正着迷于BBC 的肥皂剧《Monty Python’s Flying Circus》,所以,Python语言诞生了。

Continue reading

云计算的几个概念 IaaS,PaaS 和 SaaS——都是 XaaS

/*
我们的生活还没有被云计算改变太多,我们的头脑却被一堆概念搞到了云里雾里。
我很讨厌炒概念,希望本文不会成为另外一颗让大家更迷惑的烟雾弹。
*/

IaaS, PaaS 和 SaaS 都是云计算的服务模型。所谓服务模型,可以理解为服务的类型或服务的种类、方式。IaaS, PaaS 和 SaaS 实际上是按照服务的不同层次划分的。wikipedia的这个图解释的非常清楚。

Continue reading

Web & Mobile, Design & Code

无觅相关文章插件,快速提升流量