Apple 的 TLS 爆了大 bug! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
est
V2EX    Python

Apple 的 TLS 爆了大 bug!

  •  
  •   est
    est 2014-02-22 22:10:39 +08:00 16586 次点击
    这是一个创建于 4325 天前的主题,其中的信息可能已经有所发展或是发生改变。


    为什么发到 python 版呢。因为这是 python 语言里极难犯的错误。
    第 1 条附言    2014-02-23 11:47:39 +08:00
    69 条回复    1970-01-01 08:00:00 +08:00
    treo
        1
    treo  
       2014-02-22 22:15:26 +08:00
    还真有人在C里用goto啊。。
    wwqgtxx
        2
    wwqgtx  
       2014-02-22 22:17:53 +08:00 via Android   1
    @treo 操作系统级别的c源码中goto很常见的,你可以看看linux的源码了
    kaiix
        3
    kaiix  
       2014-02-22 22:18:55 +08:00
    if 后单语句不加花括号的确好看 不过看来还是容易出错
    截屏中其他代码的缩进也很奇怪啊
    treo
        4
    treo  
       2014-02-22 22:20:40 +08:00
    @wwqgtxx 谢谢指教,搜了下,原来 goto fail 是被当作exception handle来用的
    dorentus
        5
    dorentus  
       2014-02-22 22:22:36 +08:00
    @kaiix 是的,最后的 goto 后面那几行和 goto 一样的缩进,但是前面最近的 if block 很明显也没有用花括号……
    yinxingren
        6
    yinxingren  
       2014-02-22 22:27:30 +08:00
    论大括号的必要性
    dorentus
        7
    dorentus  
       2014-02-22 22:28:33 +08:00
    用 ruby 的话,应该也不会有这种错误存在。

    不过 C 系列的各个语言,估计都是允许省略 if 的 { } 的吧……
    ffts
        8
    ffts  
       2014-02-22 22:29:24 +08:00
    那个两行goto的意思就是不管怎么着也会goto fail?
    est
        9
    est  
    OP
       2014-02-22 22:31:50 +08:00   2
    bcxx
        10
    bcxx  
       2014-02-22 22:45:49 +08:00
    他是怎做 code review 的啊……
    gihnius
        11
    gihnius  
       2014-02-22 22:49:57 +08:00
    所以 Go 要 {},很好.
    panlilu
        12
    panlilu  
       2014-02-22 22:53:07 +08:00
    代码风格的问题=。=
    jesse_luo
        13
    jesse_luo  
       2014-02-22 23:16:28 +08:00   1
    木有review么……

    内核开发goto很多的,而且也有很多长函数,比如netif_receive_skb
    11
        14
    11  
       2014-02-22 23:18:16 +08:00
    Linux kernel coding style…
    sdysj
        15
    sdysj  
       2014-02-22 23:26:18 +08:00
    靠,这代码多久了?还有就是mavericks的openssl还是老掉牙的0.98,是不是有nsa内幕啊?
    cchange
        16
    cchange  
       2014-02-22 23:50:41 +08:00
    大家可否受累解释一下第二个goto会造成什么后果呢?

    跳转到fail段后 就不会跳转回来吧?
    zhujinliang
        17
    zhujinliang  
       2014-02-22 23:57:33 +08:00 via iPad
    写到这一行时,本来想按一下command+s,结果不小心按成了command+d。。。
    66450146
        18
    66450146  
       2014-02-23 00:00:59 +08:00
    @bcxx 如果你一个提交只有 50 行,他们会从你的代码里挑出好几个毛病

    如果你的一个提交有 50000 行,他们会看完以后点点头,就通过了。。。
    reverland
        19
    reverland  
       2014-02-23 00:19:44 +08:00
    @cchange 好像如上面链接所示。就是跳到最后会返回个err,但err是sha1update返回的,sha1update总是成功,所以,err根本不是错误。验证总是通过
    bitinn
        20
    bitinn  
       2014-02-23 00:26:33 +08:00
    sign…… apple是最后一个在客户端阻止BEAST攻击的厂商,远远晚于其他OS平台和浏览器……

    然后现在还搞出这么个笑话。搞不好NSA已经利用多年了。
    so898
        21
    so898  
       2014-02-23 00:31:36 +08:00
    Open Source 项目长久以来都没有人Review代码的结果?
    yidaima
        22
    yidaima  
       2014-02-23 00:44:08 +08:00
    不明觉历
    multiple1902
        23
    multiple1902  
       2014-02-23 01:24:29 +08:00
    不愧是全宇宙最先进的操作系统。
    icyalala
        24
    icyalala  
       2014-02-23 01:38:42 +08:00
    “只要有足够的眼睛监视,任何 bug 都无处藏身”
    我猜肯定有人发现了。。只是没有说出来~~
    bitinn
        25
    bitinn  
       2014-02-23 02:07:42 +08:00   1
    如果你想测试自己的iOS/OSX浏览器是否受TLS bug的影响,可以到以下网址

    1. https://www.imperialviolet.org:1266/ - 加入你能正常打开网站,你受bug影响。

    2. https://gotofail.com/ - 假如你能看到图片,你受bug影响。
    Yo_oY
        26
    Yo_oY  
       2014-02-23 02:08:13 +08:00 via iPhone
    哈哈 前两天写objective-c的时候还犯过这错误。。。
    python写多了
    kavinyao
        27
    kavinyao  
       2014-02-23 02:16:51 +08:00 via iPhone
    前两天去面试,面试官说他一个在Apple工作的朋友如此评价iOS代码质量:absolutely horrible。
    cloudbeyond
        28
    cloudbeyond  
       2014-02-23 02:36:20 +08:00
    @bitinn 多谢,测试了一下,貌似就mac下的safari受影响?
    dndx
        29
    dndx  
       2014-02-23 02:42:17 +08:00
    吓死人了,一个几年前就有的严重漏洞,竟然到现在才发现。估计早被各种黑客玩烂了。
    9hills
        30
    9hills  
       2014-02-23 02:46:37 +08:00 via iPad
    iOS 7.0.3 safari 实测受bug影响
    paulw54jrn
        31
    paulw54jrn  
       2014-02-23 03:17:40 +08:00
    osX 10.9 Safari 受bug影响
    ainopara
        32
    ainopara  
       2014-02-23 08:22:31 +08:00 via iPad
    iOS6.1.2不受影响。
    sinxccc
        33
    sinxccc  
       2014-02-23 08:37:37 +08:00
    On the Timing of iOS’s SSL Vulnerability and Apple’s ‘Addition’ to the NSA’s PRISM Program

    http://daringfireball.net/2014/02/apple_prism
    detailyang
        34
    detailyang  
       2014-02-23 09:41:34 +08:00
    论风格的重要性
    isprin
        35
    isprin  
       2014-02-23 09:41:44 +08:00
    难道 Apple 不用 Lint ?
    goofansu
        36
    goofansu  
       2014-02-23 10:02:45 +08:00
    menic
        37
    menic  
       2014-02-23 10:09:13 +08:00
    打赌是python程序员写的code。。。
    lch21
        38
    lch21  
       2014-02-23 10:34:00 +08:00
    手抖多复制了一行 goto fail
    luikore
        39
    luikore  
       2014-02-23 11:26:17 +08:00
    分号语言都很容易出这样的 bug
    sanddudu
        40
    sanddudu  
       2014-02-23 11:42:11 +08:00
    感觉已经成为了一个新的笑点了
    cchange
        41
    cchange  
       2014-02-23 11:47:04 +08:00 via iPhone
    @reverland 非常感谢,但是没发现这和两个goto fail的问题啊~
    应该是fail段落的问题吧?
    timonwong
        42
    timonwong  
       2014-02-23 12:00:57 +08:00   1
    @cchange
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
    goto fail;
    goto fail;

    先改写一下
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) {
    goto fail; // err != 0
    }
    goto fail; // err == 0

    这个fail其实是一个exit point(这段代码只有一个exit point), 不要当作“失败”,因为无论是成功还是失败, fail之后的代码都会执行

    fail:
    SSLFreeBuffer(&signedHashes);
    SSLFreeBuffer(&hashCtx);
    return err; // err == 0, "Success baby"

    这样,第二个fail的问题在于,err此时为0。C语言的0返回值一般约定是没有error,这样调用者就认为SSLVerifySignedServerKeyExchange() 函数是成功的,然后就是大乌龙了。
    tttwww18
        43
    tttwww18  
       2014-02-23 12:20:17 +08:00
    iOS 7.0.6 safari 受影响
    tttwww18
        44
    tttwww18  
       2014-02-23 12:31:30 +08:00
    @tttwww18 不好意思打错。更新到7.0.6(11B651)后不受影响
    Shared
        45
    Shared  
       2014-02-23 12:32:38 +08:00
    @timonwong 其实是两次 SSLHashSHA1.upadate 之后 SSLHashSHA1.final 永远都不会执行了
    mikale
        46
    mikale  
       2014-02-23 12:37:32 +08:00
    我比较恶意,我认为这是apple 程序员故意留的bug,为了怕被发现,伪装的比较好
    Shared
        47
    Shared  
       2014-02-23 12:39:14 +08:00   1
    @menic 也许,但是:1)Python 没有 goto;2)Python 是强制缩进的,即使有 goto,写两次 goto hell 也没问题。
    messense
        48
    messense  
       2014-02-23 12:44:01 +08:00
    iOS 7.1 Beta 5 Safari 受影响。
    xowenx
        49
    xowenx  
       2014-02-23 13:25:00 +08:00
    OSX 10.9 chrome dev 不受影响 chrome用了自己的SSL/TLS库?
    treo
        50
    treo  
       2014-02-23 16:33:19 +08:00
    @xowenx 嗯,chrome和firefox用了NSS
    bombless
        51
    bombless  
       2014-02-23 16:48:27 +08:00
    估计是某些编辑器的快捷键的原因复制了一行
    zellux
        52
    zellux  
       2014-02-23 16:54:40 +08:00
    奇怪的是这样的代码编译器好歹要给个 warning 吧。

    其实这种错误 Java 里也不会有(如果 Java 里有 goto 的话),执行不到的代码的编译器会直接报错……
    luikore
        53
    luikore  
       2014-02-23 16:58:34 +08:00
    @zellux 这种错误 Java 里可多了. 关键不是 goto 语句, 而是 if () stmt; stmt;
    jasontse
        54
    jasontse  
       2014-02-23 17:07:15 +08:00 via iPad
    iOS 6.1 Safari受影响,Chrome不受影响
    Ricepig
        55
    Ricepig  
       2014-02-23 18:15:48 +08:00 via iPhone
    visual basic 表示完全没有这个问题,
    if 必须 end
    banbanchs
        56
    banbanchs  
       2014-02-23 19:26:01 +08:00
    @zellux
    @luikore

    一般编辑器/IDE也会帮你缩进啊,两个goto应该会在不同位置的
    aqqwiyth
        57
    aqqwiyth  
       2014-02-23 20:34:39 +08:00
    aqqwiyth
        58
    aqqwiyth  
       2014-02-23 20:35:16 +08:00
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.91 Safari/537.36
    cchange
        59
    cchange  
       2014-02-23 21:19:16 +08:00
    @timonwong 非常感谢 大概懂了~~~
    iam3z
        60
    iam3z  
       2014-02-23 22:51:30 +08:00
    http://daringfireball.net/2014/02/apple_prism

    证实ios5.1没有,6.0才有,是否apple给nsa故意加的prism
    likuku
        61
    likuku  
       2014-02-23 23:03:52 +08:00
    OSX 10.7.5 + Chrome 33.0.1750.112 beta 打不开上面给的测试网站.
    zellux
        62
    zellux  
       2014-02-24 06:08:13 +08:00
    @luikore 我指的的是这段代码的错误,这里第二个 goto 到标签之间的代码不可能被执行到,Java 编译器就直接报错。楼主是想说在 Python 里因为有缩进,所以连续两个 goto 只要在同一层,就不会影响到后面的执行逻辑,如果你想把问题一般化到 if () stmt; stmt; ,那么这个问题 Python 里也同样没法避免吧。
    vileer
        63
    vileer  
       2014-02-24 10:13:50 +08:00
    有没有OSX的补丁啊
    caoyue
        64
    caoyue  
       2014-02-24 10:58:29 +08:00
    以前定规范强制单行语句也必须加花括号还有人不以为然,现在活生生的案例出来了……
    luikore
        65
    luikore  
       2014-02-24 12:16:57 +08:00
    @zellux
    如果两个连着的 goto 在同一块内, 顶多算很傻, 到不了造成 bug 的地步.
    但这里其实第一个 goto 在 if 内, 第二个 goto 在 if 外, 如果没有操蛋的 if 语句规则, 好多开发者早就一眼看出来了改正了. 编译器报死代码就能解决这个问题吗? 其实根本的问题还是 C/Java/C# 的 if 语法规则, 如果把 goto 改成别的语句, 就不会报死代码了, bug 会隐藏得更好.
    standin000
        66
    standin000  
       2014-02-24 12:37:02 +08:00
    @bitinn 谢谢,ios 7.0.4中招。
    wesley
        67
    wesley  
       2014-02-24 12:58:29 +08:00
    if里面不管有几行代码都用大括号包着,这应该作为一个习惯
    zellux
        68
    zellux  
       2014-02-24 13:02:47 +08:00
    @luikore
    「如果没有操蛋的 if 语句规则, 好多开发者早就一眼看出来了改正了」没理解这句话,能再解释下吗?

    对于这个例子来说,Java 编译器当然能解决这个问题,因为这是编译错误,不是警告。
    luikore
        69
    luikore  
       2014-02-25 15:51:28 +08:00
    @zellux 我也没理解你说的话, 你用
    java 编译器去编译 C 代码? 还是你想说 java 也有 goto? 还是你想说"如果 java 有 goto, 并且 openssl 是用 java 实现的话, 用 java 编译器就解决这个问题了"? clang 也有死代码检查啊, 加上 -Werror=unused 也是编译错误, 用 java 编译器有啥优势?

    不管是故意的还是无意的, 这个 bug 没被众多的开源开发者发现, 根本原因就是 if (x) y; y; 按语法规则解释成 if (x) {y;} y; 然后两个 y 缩进一样不容易发现.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2764 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 02:20 PVG 10:20 LAX 18:20 JFK 21:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86