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 · 15793 次点击
    这是一个创建于 3956 天前的主题,其中的信息可能已经有所发展或是发生改变。


    为什么发到 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
    wwqgtxx  
       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   ·   实用小工具   ·   3133 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:45 · PVG 20:45 · LAX 04:45 · JFK 07:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.