Shellshock 再次震惊全球

我们都是人性这部巨大躯体之中的细胞

这两天,Linux 又爆出了一个非常严重的漏洞 —— Shellshock (CVE-2014-6271)。 之所以用“又”,是因为就在今年 4 月,Linux 才刚刚爆出了 openssl 的“心沥”漏洞 ( 关于 Heartbleed(心沥) 漏洞 ),想必大家还心有余悸。

这个漏洞是由 Linux 上广泛使用 Bash shell 引起的,因此称为“Shellshock”,不知道是不是可以译为“壳震”,也有中文报道翻译为“破壳”和“壳裂”。

Shell Shock 一词,还有一个意思是“战争后遗症”或“弹震症”。一般指那些参加过战争的士兵,在经历过战争的精神和身体的折磨回到和平之后,还会经常出现的紧张、恐惧、失眠、疼痛等症状,严重的甚至出现无法自控的情况。

漏洞原理

这个漏洞的原理依然很简单,一句话就可以说明:Bash 在处理环境变量的时候,对其中函数定义后的内容,会继续作为代码来执行。例如:

$ env var='() { ignore this;}; echo vulnerable' bash -c /bin/true  

这个漏洞看起来还是很低级,但是比起前面的“心沥” 来说,还是要好一些,造成“心沥”的,可谓是一个最最低级的代码错误(长度检查)。而这里,应该是逻辑上没有考虑严谨。

小心余震!

早先的关于这个漏洞的修复,并没有完全修复完整,又引入了另一个漏洞 (CVE-2014-7169), 被称为 “Aftershock” ,也就是“余震”。

Mac OS 未能幸免

OS X 使用的 shell 是bash的变种,也带有同样的漏洞。可以使用如下的代码来测试改漏洞是否已经修复:

$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'

如果shell输出了 vulnerable,那么,你的系统还是带有漏洞的。如果没有,也不要高兴太早,因为还有可能有“余震”。

关于余震漏洞的测试和漏洞修复参见 http://apple.stackexchange.com/questions/146849/how-do-i-recompile-bash-to-avoid-shellshock-the-remote-exploit-cve-2014-6271-an/146851#146851

Windows 逃过一劫

就想逃过上次 “心沥” 一样,Windows 又逃过了 “壳震”。Windows 做的更安全吗?不是,只不过 Windows 没有使用 linux 上被广泛使用的技术而已。如果你认为更多的不被广泛知道的漏洞会更安全,那这样说的话,Windows 更安全。

互联网还靠得住吗

今年接连爆出的超级严重的漏洞,让我们不禁感慨:互联网还靠得住吗?

我的态度是:互联网靠不住,但我却愿意依赖它。

作为一个程序员,我可以深刻体会到,软件开发不过就是这样一个过程:后来的程序员修复前面的程序员留下的漏洞,同时又造成新的漏洞,让再后来的程序员来修复,如此循环,无穷尽也。

程序员这么容易出问题,真是很差劲呀。没错,程序员是很容易出问题,但这却不应该责怪程序员。并非为程序员辩护,任何一个职业都是如此。程序员作为普通的人类,无法超越人类自身的局限,人类总是会犯错。而因为互联网的影响之大,程序员犯的一个小错可能带来非常严重的后果。这就像,驾驶员的错误会引起车祸,飞机机长的错误会让数百人丧命,而一个国家元首如果犯个错误,后果可能是数百万人的生命。

我们通过提高汽车性能和智能来减少和避免驾驶员的犯错;我们通过增加副机长、自动驾驶、地面控制等方式来减少机长的犯错;我们通过智囊、增加流程和议会等方式来减少一个国家元首的犯错。但是,在软件开发中,对于程序员的犯错,尤其是会产生严重影响的软件的程序员的犯错,我们做的还非常原始。

只有我们更多的关注互联网,更关注程序开发工作,让关键的程序有更多的人来审查和测试,才有可能降低出现错误的概率。但如同其他所有的行业一样,错误和事故却不可能完全杜绝。希望最近这些不断爆出的安全漏洞,能让我们更加严肃的看待软件开发。

参考资料

Git Flow 和那些 Git Workflows

好的工具,可以改变我们的思维方式

什么是 Git Flow

2010 年初,荷兰的程序员 Vincent Driessen 在他自己的博客 http://nvie.com/ 发表了一篇文章 《A successful Git branching model》 ,在开源世界引起了一阵不小的关于 Git 工作流程的讨论,这篇文章里提出的 Git Flow 也成为了很多软件开发的事实标准。

Git Flow 就是 Vincent Driessen 在使用 Git 的过程中总结出来的一套工作流程(一种 Git Workflow)。这套流程非常适合互联网项目开发,这个流程约定了一些 Git 使用方法,让开发者可以井井有条地组织 Git 的 commit 和 branch 等操作,方便地完成项目的开发、测试、发布等环节。

几年来,这个流程已经成为业界的事实标准,关于它的介绍到处可见,在此只对其中几个要点做摘要:

  • master 分支只做发布
  • 每一个特性开一个 feature 分支(或者叫做 topic 分支)
  • feature 分支来自 developer 分支,也将被合并到 developer 分支
  • release 分支来之 developer 分支,将被合并到 master 分支 (或合并回developer分支)
  • 修改线上bug时,从 master 分支开一个 hotfix 分支,将被合并回 master 分支

事实上,Git Flow 并不能算是个非常简单的工作流程,其每一步的操作,都需要若干个 Git 命令来完成。 作为一个自称 “tech enthusiast who breathes code and loves creating beautiful software” 的极客,Vincent Driessen 当然不能容忍这种机械且易错的流程,很自然地,他开发了一个 Git Flow 工具 gitflow

gitflow 提供一系列抽象层次更高的命令,来更快捷的完成 Git Flow , 例如:

  • git flow feature start [] // 开始一个特性的开发
  • git flow feature finish // 完成一个特性的开发
  • git flow release start // 开始一次 release
  • git flow release finish // 完成一次 release
  • git flow hotfix start // 开始一个线上bug修复
  • git flow hotfix finish // 完成一个线上bug修复

这些高层的命令调用了 git 的分支操作来实现其目的,让整个流程更加便捷,也减少了错误的产生。

有人说 Git Flow 的一个缺点就是需要用命令操作,多数图形界面还是要手工操作 git 命令。也许曾经是这样,但是大名鼎鼎的 Git 图形界面工具 SourceTree 早已经官方支持 Git Flow 了,这也可以证明 Git Flow 是一个已经被广大开发者所熟悉和接受的工作流。

说了半天,Git Flow 到底有什么好处,这个嘛,谁用谁知道。

其他的 Git Workflows

既然 Git Flow 只是一种 Git Workflow,这么说,还有其他的 Git Workflows 咯?

GitHub Flow

这个是 GitHub 自己使用的流程,也就是他们开发 github.com 使用的流程,而不是这些开源项目使用 GitHub 的流程,哈哈。
也许是他们认为 GitFlow 太复杂,更可能的是因为 GitHub 早于 Git Flow 诞生,所以 GitHub Flow 是一个非常简单的流程,大致的要点如下:

  • master 上任何一个 commit 都应该是可部署的
  • 要做改动,从 master 开一个新分支
  • 改动完成,开一个 pull request
  • 某个负责人确认了改动之后,就可以将其合并到 master 了
  • 合并到 master 之后,应该被立即部署

这个流程简单到吓人,GitHub 大概有 15 到 20 人在同一个项目(github.com)上使用这个流程,每天,他们可以完成数十次部署。

这个流程简单的让人流口水。然而,只有内功达到一定程度的高手,才能使用最简单的兵器御敌制胜。“飞花落叶皆可杀人”,可不是人人都能做到的,口水先咽到肚子里吧,盲目跟随,小心死得很难看呀.

Centralized Workflow

集中式工作流程 (https://www.atlassian.com/git/workflows#!workflow-centralized) 实际上,这就是 svn 使用的工作流程,大家在同一个集中管理的仓库上开发,各自在更新的时候负责解决冲突。是的,我们在 svn 时代一直使用这种工作流程,现在看来,是不是很难忍受了?

Feature Branch Workflow

https://www.atlassian.com/git/workflows#!workflow-feature-branch
这个工作流程已经很接近 GitFlow 了,或者说,它是个简化的 GitFlow,只是强调了 feature branch,没有 developer 和 release, hotfix 等分支概念,它和前面提到的 GitHub Flow 也很类似。

Forking Workflow

https://www.atlassian.com/git/workflows#!workflow-forking
这是一个基于多个代码仓库的工作流,每个开发者在自己的仓库上进行开发和提交,然后在不同仓库直接进行合并。在自己的仓库中,又可以按照独立的分支管理方式(工作流程)来进行开发,最后,向上游管理者发起 pull request 来进行合并。GitHub 上的大多数开源项目都用了这个工作流程。

更多 Git Workflows …

小结

为什么在 svn 时代,没有产生这么丰富的工作流程? svn 也有 branch 的概念,为什么大家没有像用 Git 这样来用 svn?

svn 里的分支,并不是 svn 本身的概念,而是用户使用svn时候的“约定”,也就是说,“分支”对于svn来说,就是一种工作流程,“分支”所在的抽象层次,相比 svn 提供的抽象层次,已经高出了一级。

对于一个工具来说,在用户熟练使用后,一般可以衍生出一些使用“文化”,也就是一些约定的”惯用法“或“工作流程”,然而这些“文化”一般只比工具提供的抽象层次高一个层次,也就是说,这些“文化”是可以通过工具提供的基础功能进行重复、组合等方式来实现的。

svn 里的“分支”,就是利用svn基本的目录功能来实现的,并不是 svn 直接提供的,因此,它是在比svn 抽象层次更高一级的层次上的。而本文提到的 git 的丰富的工作流程,多数是由“分支”这个概念衍生出来的,对于 svn 来说,这种工作流程已经是高于其两个抽象层次的逻辑,对于人类这种生物来说,可能确实比较困难。

而 git 中,有了 branch 等更多的基本概念,使用 git 完成各种工作流程,还是仅仅提高了一个抽象层次而已,对人类来说没有障碍,所以各种流程百家争鸣。git 不过是比 svn 提高了一个抽象层次,却给开发者带来了更广阔的天空。

乘法确实就是加法的叠加,但从这种运算中涌现出了新的力量,如果我们只把乘法看成是加法的重复,就永远不可能掌握这种力量,只满足于加法,就永远得不到 E=mc^2
— Kevin Kelly

参考资料

  1. http://nvie.com/posts/a-successful-git-branching-model/
  2. http://www.syntevo.com/smartgit/documentation/6/show?page=git-flow
  3. http://www.jiangyouxin.net/
  4. 基于git的源代码管理模型——git flow
  5. git flow的简单使用
  6. https://guides.github.com/introduction/flow/index.html
  7. http://scottchacon.com/2011/08/31/github-flow.html
  8. http://blog.endpoint.com/2014/05/git-workflows-that-work.html

不得不说的 Swift

/*
WWDC 已经过去一周了,本周的焦点已经是世界杯了。对于一个不是球迷的码农来说,WWDC显然是更值得关注的事情,那些说话带着全世界口音的苹果技术宅们,比起绿茵场上身穿各色球衣的肌肉男们,显然也更有魅力一些……
最近还是太忙了些,不然,我觉得,熬夜听WWDC的报告,肯定要比熬夜看球有意思,至少不会扰民。可惜时至今日,在指缝中挤出的时间里,才看了不到1/5的WWDC的内容,确实本非我所愿。
总在不停的忙碌着,不过是为了追逐这变化莫测的世界,到头来却因为忙东忙西而总是慢了几拍,错过了身边的美景,真是极大的讽刺。
*/

本届 WWDC 可以说是近几年来变化最大的一次,苹果在开发的各个方面都有了很大的创新和改进,苹果开发的生态环境又向前迈了一大步,这也充分展示了库克时代的特点。

Continue reading “不得不说的 Swift”

Cocoa 潮人 Mattt Thompson

又到周末啦,心情轻松了好多,今天我们来看看牛人 Mattt Thopson

在 iOS 开发中,你很可能使用过一个叫做 AFNetworking 的网络库,Mattt 就是这个著名开源软件的作者。

Mattt 是一个多产的开源作者,除了 AFNetworking 之外,Mattt 还创作了 TTTAttributedLabel, FormatterKit, GroundControl, SkyLab 等许多非常好用的开源项目.

Mattt 的成就不仅于此,他还是著名技术博客 NSHipster 的作者。看这个名字就知道这是一个关于 Objective-C和 Cocoa 的技术博客。NS 是在 Mac OS 和 iOS 开发框架 Cocoa 中大量使用的前缀,这个前缀来源于乔布斯在 1985 年创建的 Next 公司。Next 公司制作的计算机操作系统叫做 NextStep, 该系统提供了 Objective-C 的编程接口,后来,Next 被 Apple 收购,乔布斯回到苹果,在 NextStep 的基础上研发出了 Mac 操作系统,Objective-C 成了 Mac 编程的官方语言,NS 前缀的命名方式也流传下来。Mattt 为其博客取名 NSHipster,Mac 和 iOS 开发者自然心领神会。

Continue reading “Cocoa 潮人 Mattt Thompson”

关于 Heartbleed(心沥) 漏洞

image

什么是 Heartbleed

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

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

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

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

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

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

还有网友们惊呼:

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

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

“狼真的来了”

Continue reading “关于 Heartbleed(心沥) 漏洞”