早先于去年12月末在德国举行的30C3会议中就有技术帝称苹果的系统中存在多个为NSA服务的间谍后门。而近日刚被曝光的苹果系统SSL安全缺陷虽然已经提供了安全更新服务,但是却被媒体指为NSA的间谍后门。

 

 

斯诺登第一批曝光的NSA机密文件中就指出美国巨头公司包括微软、雅虎、谷歌、Facebook以及苹果公司参与美国棱镜计划并暗中为NSA提供间谍服务,而文件显示苹果公司是2012年10月加入的该计划。


在一个月前,斯诺登为配合30C3的会议而新曝光的机密文件表示苹果公司参与了一项名为“DROPOUT JEEP”的间谍程序计划,文件表明苹果将为iphone手机安装一个程序,让NSA获取短信、语音信箱以及其他个人资料等信息。

 

 

不过这并不是媒体剑指苹果公司的主因。就在上个礼拜,苹果公司有关部门表示它们发现在大部分OS中存在一个SSL缺陷漏洞,并将其命名为“GotoFail”,这个漏洞可能导致允许黑客或者其他操作者进行间谍行为,即通过同一网络连接(如无线或其他网络共享)获取SSL安全数据。

 

这个缺陷的成因其实很简单,无非是多层if嵌套语句中的一行。

 

有学者在财富杂志中发布了一个时间轴,或许和这个缺陷没有直接关联,但是我们不妨看一下。

2012年9月24日苹果公司发布iOS 6.0

2012年10月苹果公司加入NSA的监听计划中

2012年12月1日到2013年5月1日苹果公司收到9K到1W台设备的“用户隐私承诺”

 

这三点时间轴其实并不能成为证据,不过还有三点可以结合一下。

1, 这个SSL缺陷第一次是出现在iOS 6.0系统上

2, iOS 6.0系统发布于2012年9月24日

3, 斯诺登公开的文件显示NSA从iOS 6.0发布一个月后开始爆苹果客户的菊花

 

“我们当然很想知道是谁把这段傻X代码加入到程序当中的,苹果的老总解释说这码农的无心之失,但是我认为大家可以假设为程序员被NSA买通,这个解释很合理”。其实这几个事实确实只是佐证而已,但是用来给NSA穿小鞋很合适。

 

不过缺陷代码看起来更像是排序错误,最终导致悲剧的语句合并。不管怎样,按照时间轴来看这个缺陷是非常诡异的,下面来看一下技术分析好了。

 

其实是一个非常简单的缺陷,在多层if语句中,关键的一行中出现了重复。

...
if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0)
 goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &clientRandom)) != 0)
 goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
 goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
 goto fail;
 goto fail; // <-------------------------------------------------
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
 goto fail;
...
fail:
 SSLFreeBuffer(&signedHashes);
 SSLFreeBuffer(&hashCtx);
 return err;
}

上面的代码中已经将错误行指出,注意第二个重复的goto fail这个代码,还有一个包含验证结果的执行变量err,在这里0表示成功。

这个值是一个return函数,导致调用者在一些验证步骤未完成执行就返回了成功值。

 

这种缺乏异常机制的编程风格虽然饱受争议,但却是一个常见的编程模式,有些码农在网上反映,“我从来不会出这类问题,因为goto实在是太操蛋了,老子从来不用它”。

//silic.wiki