作者iPluto (键盘Apple Genius)
看板iPhone
标题[情报] 解析7.0.6更新的安全性漏洞
时间Tue Feb 25 12:22:57 2014
本文章只是想说明一下7.0.6到底更新了什麽
对实际更新的操作和效能没有什麽帮助(汗)
当做知识看看就好XD
Apple最近发布了iOS 7.0.6,更新内容只讲了是有关SSL的安全性更新。乍听
之下好像不是什麽严重的大更新。
但是在许多安全专家开始仔细研究後,发现其实Apple出了一个相当大的包,
影响非常之大,造成的原因却又简单的好笑。
首先我们要先了解什麽是SSL。SSL是网路连线的一种加密认证方式,普遍应
用在各大网站的登入系统来避免Man In The Middle攻击。
举例来说,你今天想要进行网路购物,你势必要输入你的信用卡号码传给网
站。所谓Man In The Middle攻击,就是攻击者假扮成你要购物的网站,从中
拿走了你的信用卡资料。然後为了不让你察觉,他当然也会把这份资料送去
给真正的购物网站,拿到购物网站的回应後再传回给你。这样在你的眼中,
你还是正常的消费,但是信用卡资料却已经神不知鬼不觉的被盗取了。同样
的原理,你的email或者网路银行的帐号密码,都可以这样被盗取。
所以SSL的存在就是为了阻止这件事情。你也许注意到许多网站在登入时你的
网址都会从http://变成https://,这就表示SSL已经启动。SSL会认证跟你沟
通的对象,确定对方真的是他所宣称的网站而不是攻击者所伪装的。背後的
原理就像是我们使用亲笔签名来确认是否为本人一样,使用数位签名来确认
对方的身分。
那Apple出了什麽包呢?基本上在过去的半年多,所有Apple的产品,SSL的认
证机制都是坏掉的。也就是如果你使用Apple的产品在公开的网路环境登入任
何网站,你的资料基本上相当容易被盗取。在过去几个月也许知道这个漏洞
的人不多,所以也许没有太多的攻击事件,但是就在几天前漏洞曝光,利用
此漏动的攻击者将会大幅增加。
这边有个测试网站,它会显示你的浏览器是否受此漏洞影响:
https://gotofail.com
问题讲完了 现在来讲解决方案。iOS的使用者,请更新到7.0.6。已经JB的人
,evasi0n团队已经更新了工具可以支援7.0.6,只要更新->重新JB->重新装
回所有tweak,或者可以直接到Cydia安装SSLPatch这个tweak
MacOSX的使用者...很抱歉Apple还没有出更新档...所以现在尽量避免使用公
共无线网路登入任何网站(特别是跟金钱相关的)...等到Apple有更新档请第
一时间更新。(有个非官方的更新,但是不推荐)
Update: Apple已释出10.9.2的OSX更新
好,现在来讲讲到底是什麽原因造成这种大漏洞的。说来好笑,只是因为某
份程式码多了一行...
在C语言里面,判断是是这样写的:
if (条件)
{
条件成立要做的事情;
条件成立要做的另一件事情;
…
}
但是C又有另一个设计,就是如果要做的事情可以一行写完,那可以不用写那
两个{},你可以写成这样:
if (条件)
一行就可以做完的事情;
但是如果你这样写,就要特别小心,像以下这种状况:
if (条件)
第一件事情;
第二件事情;
这种状况乍看之下跟前面的例子一样,实际上只有第一件事情是条件符合才
会执行,第二件事情是无论如何都会被执行...因为只有if下面那行才跟条件
判断有关系...
这就是Apple出的包,以下是它的程式码:
static OSStatus
SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa,
SSLBuffer signedParams,
uint8_t *signature, UInt16
signatureLen)
{
...
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; <---- *** DANGER ***
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
goto fail;
err = sslRawVerify(ctx,
ctx->peerPubKey,
dataToSign,
dataToSignLen,
signature,
signatureLen);
...
fail:
SSLFreeBuffer(&signedHashes);
SSLFreeBuffer(&hashCtx);
return err;
}
这段程式码就是SSL在认证签名用的,整个函数会检查签名是否为真然後回传
检查结果,传回0就是正确,传回非0就是错误。本来这段程式码是没有问题
的,每个判断式会检查一样东西,认证成功会检查下一样东西,认证不成功
会跳到最下面的3行程式码,此时err应该不会是0,所以整个函数回传非0的
值,认证失败。
问题是某处连续出现的两个goto fail,只有第一个跟它上面的if有关,会考
虑条件判断。後面那个goto fail不管怎麽样都会被执行到!!! 也就是认证到
一半就跳到下面那三行程式码,此时err当然是0,函数回传了0,直接宣布认
证通过...
对,错误就是这麽简单,多了一行goto fail,可以影响全世界不知道多少的
用户,让整个SSL认证机制完全无效,写程式真的不能不小心啊…
最後,请记得更新你的系统。随着Apple发表这个更新档并且被挖出了相关漏
洞资讯,攻击者会增加的非常快速。
--
◢◤ ◢███◤ ◢◤
◤
◢◤ ◢◤◤
◢◤◤
◢◤
◢◤ ◢███◤◤
◢◤◤
◢◤ ◢◤ ◢██◤ ◢███◤
◢◤◤
◢◤ ◤
◢◤◤
◢◤◤
◢◤◤
◢◤◤◤
◢◤◤◢◤◤
◢◤◤
◢◤◤
◢◤◤
◢███◤◤
◢█◤ ◢███◤◤
◤
◤
◤
◤
◤
◤
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 76.94.199.254
1F:推 bojack:很详细的说明,推一下 02/25 12:25
2F:推 scottiting:XD 02/25 12:26
3F:推 b701217:实用推 02/25 12:30
4F:推 Schwarztee:实用推 看PTT长知识 02/25 12:32
5F:推 emptylife3:推一个 02/25 12:32
6F:推 an138:如果都没在用公用网路的人还要更新吗? 都只用自己的3G跟 02/25 12:35
7F:→ an138:家里的wifi 02/25 12:35
8F:推 stussy0716:好厉害!长知识了 02/25 12:36
9F:推 BlackSeven:推! 02/25 12:36
10F:推 mihonisizumi:专业推 02/25 12:37
11F:推 joe3477:太专业了.. 02/25 12:42
12F:推 sampo1125:长知识 推!! 02/25 12:46
13F:推 JamesChen:这漏洞是大学生等级的吧XDDD 02/25 12:47
14F:推 zx09192939:专业又讲得很浅显易懂真不容易!谢谢好文长知识 02/25 12:48
15F:推 mova:说明推! 02/25 12:52
16F:推 song042008:不愧是i大.. 02/25 12:54
17F:推 hopeltw:多学了一些 02/25 12:55
18F:→ jump0319:专业推! 02/25 12:59
19F:→ neverfly:话说为什麽会有ios的source code? 02/25 13:00
20F:推 Shigeru777:原本iphone4留在ios5 不过一看到SSL漏洞就马上升级了.. 02/25 13:03
21F:推 artiller:SSL漏洞是重大问题 除非手机完全不会输入帐号密码 02/25 13:06
22F:推 Vett:err初始给0? 应该不会吧@@ 02/25 13:06
23F:→ LoLoLuan:本来不想更 但看到你这篇马上更新.... 02/25 13:06
24F:→ zoex:只能升成iOS7才有解吗? 实在不想用那丑陋的介面.... 02/25 13:06
25F:推 LoLoLuan:iOS7哪会丑 我很喜欢 02/25 13:08
26F:→ LoLoLuan:扁平化很可爱 02/25 13:08
27F:推 ingrid0815:推!终於清楚了 02/25 13:09
28F:→ k078787878:if回圈就算只有一行我都习惯要{}以免发生这样的情形 02/25 13:12
29F:→ swpoker:很多语言都有这样的写法~只是这种写法常被当作厉害写法 02/25 13:14
30F:推 Crackhead:为了那一行要重新JB跟设定 好麻烦阿 >< 02/25 13:14
31F:推 sosoing:专业大推 02/25 13:15
32F:推 aloha888:推推推 02/25 13:16
33F:推 ohhahaha:太白痴了吧天啊 02/25 13:21
34F:推 kevinlee810:CS学生推~ 02/25 13:22
35F:推 rockmanx52:如果是"过去半年多"的话 那受灾户应该只有iOS7吧? 02/25 13:30
36F:→ rockmanx52:iOS6"理论上"不必担心这点 02/25 13:30
37F:推 uarenotalone:专业推 02/25 13:30
38F:→ rockmanx52:啊抱歉,应该是iOS6.0才不用担心...6.1应该也有问题 02/25 13:31
39F:推 s111121:是只有iOS 7有这个漏洞吗,iOS 6以前的呢? 02/25 13:33
40F:推 mars1396:专业给推!!!!!! 02/25 13:34
41F:推 sysop5566: 苹果的程式 都没再审核吗? 为何BUG会上架 02/25 13:35
42F:推 wavel:bug不是说找就找,写程式最难也花最多实绩的就是debug 02/25 13:38
43F:→ wavel: 时间 02/25 13:38
44F:→ willychn33:OSX10.9.2和iOS7.1全都还没修补QQ 02/25 13:40
45F:推 jump0319:这样子ios6也需要担心吗? 02/25 13:40
46F:推 SkLc:快推 不然人家以为我看不懂 02/25 13:48
47F:推 hisky:好详细! 02/25 13:48
48F:推 shinichi:但我的iPod touch4最高只支援到iOS6 但这波的更新也释出 02/25 13:50
49F:→ shinichi:属於iOS6的新版本 所以iOS6也是有影响吧? 02/25 13:50
50F:推 memo5215:写程式不难,debug才烦 02/25 13:52
52F:推 Neymar:iOS6 以上的才要跟新,有JB的去cydia下载SSLpatch就好了 02/25 13:59
53F:推 Neymar:没JB的人就乖乖升级吧,除非你停在iOS 5以前的版本。 02/25 14:02
55F:推 kobe8112:这... 02/25 14:22
56F:推 s605152002:猛 02/25 14:23
57F:推 victoryss:不推对不起自己 02/25 14:35
58F:推 SiePtt:推 02/25 14:41
59F:推 jackjack135:太强大! 02/25 14:43
60F:推 lingchen:感谢 写的浅显易懂实在不容易 02/25 14:48
61F:推 jca:超专业,看过一定要推的啊:)))) 02/25 14:53
62F:推 SOMEGOOD:ios 6.1.2飘过,装了CYDIA的SSLPATCH後测试已安全 02/25 14:56
63F:推 boys5566:专业推! 02/25 14:59
64F:推 daniel414:CS的推~ 02/25 15:05
65F:推 robin2503:推 02/25 15:06
66F:推 HuMirage:详细推 02/25 15:16
67F:推 PLASBOT:详细推! 02/25 15:18
68F:推 SuperShangXD:推!! 02/25 15:19
69F:推 NagoyaOsaka:这该M吧 02/25 15:28
70F:推 chunptt:谢谢详细解说! iOS6.1.2装了patch後测safe 02/25 15:40
71F:推 ckstorm:所以做过的系统都要求 if後无论是否一行都得加{ } 02/25 16:00
72F:→ neverfly:goto fail if err= xxx; =>perl有这种更帅气的一行if语法 02/25 16:06
73F:推 Preaz:推~~ 难怪iOS升上6.0之後, 就发生盗刷的新闻. 02/25 16:13
74F:推 seraph01:原来是这样! 难怪之前一堆被盗 02/25 16:16
75F:推 KawasumiMai:好蠢的漏洞= =果然习惯{}是对的 02/25 16:24
76F:→ KawasumiMai:每次接手那种省略{}的code都会先花时间人工format 02/25 16:25
77F:→ KawasumiMai:就怕哪天多跳一行就出包了= = 02/25 16:25
78F:推 LBJ23K:傻眼.... 02/25 16:28
79F:推 mixbqw:而且更麻烦的是bug有些还是照跑,不提示错误..这种要抓会 02/25 16:29
80F:→ mixbqw:抓到天荒地老 02/25 16:29
81F:推 horseorange:专业大推 02/25 16:31
82F:推 skhan:惨了 pcman点了那个网址没有出现"Safe." 其它都有Safe. 02/25 16:36
83F:推 Rindou:专业又浅显易懂 02/25 16:39
84F:推 superbabyer:专业大推 外行都懂 02/25 16:51
85F:推 chang0206:专业推 XD 02/25 16:58
86F:嘘 Shane7:我觉得这种文章还是要持保留态度吧 第一苹果怎麽可能让他 02/25 16:58
87F:推 danielwu13:专业推! 02/25 16:59
88F:→ Shane7:的加密机制source code给你知道 第二这种错误只有你会犯吧 02/25 16:59
89F:→ Shane7:你以为苹果的工程师是大一新生吗 02/25 17:00
网路上的东西是不该随便相信没有错
来,首先看Apple的公告:
http://support.apple.com/kb/HT6147?viewlocale=en_US&locale=en_US
这边提到漏洞编号是CVE-2014-1266
於是接着查到这边:
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-1266&cid=1
表示漏洞存在於libsecurity_ssl/lib/sslKeyExchange.c
最後是Apple自己放上去的程式码
http://tinyurl.com/phzhghu
里面就有上面提到的漏洞
然後有人针对这段程式码的错误自行做了一个Patch
在
http://www.sektioneins.de/en/blog/14-02-22-Apple-SSL-BUG.html可以找到
实测结果patch後真的有效(前面有漏洞测试网站)
所以应该是这个错误无误
最後
加密认证很多程式码都是公开的,例如OpenSSL
程式码公开不代表安全性有问题(其实公开的反而安全 大家会帮忙找漏洞)
加密认证个重点在你有攻击者所不知道的key
90F:推 chang0206:不过我也很好奇,为啥原PO可以拿到SOURCE CODE? 02/25 17:00
92F:→ jimei2:来源 还是被google的工程师爆挂的... 02/25 17:05
93F:→ kobe8112:无知并不可怕,可怕的是不懂装懂的那种... 02/25 17:05
94F:推 willy87009:专业推 02/25 17:05
95F:→ kiii210:苹果工程师不是万能的神ok 只要是软体都会有bug 02/25 17:10
96F:推 j19880709:厉害!!!!!!! 02/25 17:11
※ 编辑: iPluto 来自: 76.94.199.254 (02/25 17:20)
97F:推 kyle5241:苹果在软体功能上跟google 差远了 02/25 17:14
98F:推 osk2:上面都说Apple有open source了,是在嘘什麽看不懂 02/25 17:19
99F:→ jimmy055263:只要是人写的程式都会有bug,尤其是错在这种简单的地 02/25 17:29
100F:→ jimmy055263:方才更容易让人疏忽。只是内部没有测出来也是蛮奇怪。 02/25 17:29
101F:推 GoldDeath:有人的脸很肿 02/25 17:39
102F:推 iaudio:快推 不然人家以为我看不懂 02/25 17:43
103F:推 slent67:推一下 02/25 17:51
104F:→ lostkimo:没学过不懂就不懂。没甚麽...不是每个人都万能的。 02/25 18:01
105F:推 noxhsu:就跟一格空白的悲剧一样 本来rm -rf /usr/lib/.. 断在r /间 02/25 18:01
106F:推 d86012005:专业推 苹果快点推出 OSX 更新... 02/25 18:15
107F:→ Sunicer:养成好习惯是很重要的:永远使用中括号,一定要给预设值。 02/25 18:16
108F:推 Vincnet:专业推! 02/25 18:24
109F:推 shin9770:Ios5没有这个漏洞我上那网站测过了 02/25 18:31
110F:→ shin9770:因为这漏洞升级的喝喝了 02/25 18:31
111F:→ alanzeratul:真的很夸张,在这之前根本不能想像会有这种纰漏 02/25 18:33
112F:→ alanzeratul:做网路交易,有https都有点提心吊胆,但为了方便还是 02/25 18:34
113F:→ alanzeratul:没办法,何况是https之前竟然是无效的 02/25 18:35
114F:推 mike760616:1有用!推 02/25 18:50
115F:→ TsaoCCFGOGO:iOS {3.1.3, 4.2.1, 5.1.1} 我都测过没这问题。 02/25 18:59
116F:→ chauliu:iOS6还特地出了更新 所以是iOS6就开始出错了? 02/25 19:13
117F:推 likora:专业推! 02/25 19:16
118F:推 VinceCarter:专业推!! 02/25 19:21
119F:推 zaknafein:这真的是扯到爆... 02/25 19:29
120F:推 pa26288:专业推!!!!!幸好更新了 02/25 19:30
121F:推 nojoe:专业解说 好险看的懂 02/25 19:56
122F:推 kitune:推 02/25 19:59
123F:推 lskywalkerl:所以7.0.4 直接安装大老板源下的SSLPatch就能解决吗? 02/25 19:59
124F:推 revorea:这洞也太蠢XD 02/25 20:01
125F:推 rockmanx52:去年PSO2的清空硬碟事件也是因为少打东西造成的... 02/25 20:02
126F:→ rockmanx52:只能说这种程式漏洞防不胜防 02/25 20:03
128F:推 ninewords:哪那麽好找?说的那麽简单!另外感谢原po说明! 02/25 20:28
129F:推 ll1:iOS 6.1.2 <网站检测没通过> 02/25 20:40
130F:推 jefferk:我写if 都一定只写一个判断式XD 小嫩B都这样 哈哈 02/25 20:57
131F:推 unoturbo105:谢谢原po。长知识了 02/25 20:58
132F:→ jefferk:写3层之後就开始昏了 要先喝口茶休息一下 XD 02/25 20:58
133F:推 jefferk:不过我看完怎觉得如果都是goto fail 那是什麽东西fail? 02/25 21:02
134F:推 jefferk:err应该是显示错误的话 goto fail 那这样不管是否err 02/25 21:05
135F:推 xatier:→ Sunicer:养成好习惯是很重要的:永远使用中括号 <- (? 02/25 21:05
136F:→ jefferk:err必定存在 那err确定是认证吗? 我怎看起来不像XD? 02/25 21:06
一般函数回传的值通常表示执行结果是否成功,回传0表示正确,回传非0表示错误
又那个非0的值可能还会因为值不同代表不同的错误,有助於发现问题
这边每个if判断式都在call一个函数,并且把回传值存到err这个变数
所以直接看err是否非0就可以判断这些函数是否执行有错误
有错误就是认证失败,此时err就不会是0
然後程式码就跳到fail:那边,又因为err不是0,就可以直接回传err,表示认证失败
同时回传的非0 err值也可以显示是什麽错误
如果认证一路上是成功的
最後sslRawVerify()会把err设成0
回传err时就会回传0 代表认证是成功
137F:推 DJony:推 02/25 21:20
138F:推 ull0730:精华文章,赞 02/25 21:22
139F:推 shaolun0:推 02/25 21:30
140F:推 kenk0818:哇 有学有推 感恩 02/25 21:56
141F:→ LinkedList:昨天还是前天有在八卦版看到有人分享 02/25 22:05
142F:推 oas:我用iPhone4 5.1.1测gotofail是Safe 所以5.1.1是OK的? 不用升? 02/25 22:38
143F:推 s850284:难怪这次更新apple这麽积极!以往更新只会跳出一次通知,这 02/25 23:13
144F:→ s850284:次一直跳出讯息,超烦der 02/25 23:13
145F:推 iphonessss:推推 长知识 02/25 23:18
146F:推 Adadadadada:ㄣㄣ跟我想的差不多 02/25 23:26
147F:推 sanderpan:推专业和大气度! 02/25 23:35
148F:推 cattgirl:iOS6测出漏洞 我更新就安全了 02/26 00:51
149F:推 Icereal:太实用了上站一推 02/26 01:50
150F:推 Archio:写程式的工作真的不是常人可干的.... 02/26 02:09
※ 编辑: iPluto 来自: 24.199.19.190 (02/26 02:43)
※ 编辑: iPluto 来自: 24.199.19.190 (02/26 02:58)
151F:推 lovecool123:厉害 推 02/26 03:58
152F:推 jacka1:这篇好专业! 大推! 02/26 04:18
153F:推 tyai:好文长知识 02/26 05:30
154F:推 rosywhite:推! 02/26 09:25
155F:推 lim10337:想起那些写程式的日子~ 专业推!! 02/26 09:44
156F:推 zaq123123:高三正学C语言中 呜呜..好像很难 02/26 11:21
157F:→ abian:长知识推 02/26 12:20
158F:推 taxitaxi:有够专业! 02/26 14:19
159F:推 lovelong880:推 02/26 15:47
160F:推 jlchien:讲解真详细~推 02/26 20:00
161F:推 jefferk:感谢喔 我目前还没碰到ssl认证加密的问题XD 02/26 20:25
162F:→ jefferk:这样说我就懂了XD ios真是很常用判断式来确认 感谢~~ 02/26 20:26
163F:推 ryanlei:厉害 这回真的是"专业"问题了XDD 02/26 21:19
164F:推 bigshowshow:6.1.3, 用safari点测试网页不安全,用puffin却安全? 02/26 21:39
因为跟浏览器有关
OSX上Chrome也是安全的
但是因为系统很多服务以及app是会用到SSL的
即使你都用Puffin上网
但是如果你用了Apple内建的Mail软体 一样会受这个漏洞影响
所以还是更新OS最实际...
165F:推 tustarosa:这种错误实在有一点扯 02/26 21:50
166F:推 alance:推文看到有人说10.6也有更新,请问有办法只更新到10.6吗? 02/26 23:43
167F:→ alance:我怕更新到10.7跑不动... 02/26 23:44
168F:推 alance:笔误..上面说的是ios6及ios7 02/26 23:55
169F:推 usoko:这漏洞八成是git auto merge造成的 因为行数不对mer成两行 02/27 01:17
170F:→ usoko:乖小孩记得即使if内容只有一行也要加大括号喔 02/27 01:17
171F:推 bababababa:好文 推! 02/27 01:37
172F:推 kazumaking:专业推! 02/27 01:54
173F:推 greedybit:checkpatch.pl不会让有括号的一行if进到kernel里的 02/27 02:31
174F:→ greedybit:所以对大神来说乱加括号真的很丑 02/27 02:31
175F:→ iPluto:3GS可以只更新到6.1.6 不然你可以JB然後装Patch XD 02/27 02:42
176F:→ iPluto:usoko说的没错 这八成是merge出来的 没有人会自己这样写... 02/27 02:42
※ 编辑: iPluto 来自: 24.199.19.190 (02/27 02:45)
177F:推 bigshowshow:专业推!之前gmail的确有被盗用,还是更新较心!谢谢解 02/27 12:31
178F:→ bigshowshow:惑! 02/27 12:31
179F:嘘 justlink:Man in midle 引用错误 02/27 14:17
180F:→ justlink:Man in middle SSL 根本防不了。 02/27 14:18
181F:→ justlink:Key 被拿走了 还是可以被 sniffer 02/27 14:23
182F:推 justlink:尤其是不小心吃了伪CA 02/27 14:30
183F:推 justlink:另外,我先前说的 SSL 完全防不了,是我的错误。 02/27 14:33
184F:推 ga762599:专业 03/01 02:11
185F:推 CloudPigLee:长知识推! 03/01 13:18
186F:推 tokai:推 03/07 11:58