V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · Feb 22, 2014 · 16872 views
    This topic created in 4453 days ago, the information mentioned may be changed or developed.


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

    不过 C 系列的各个语言,估计都是允许省略 if 的 { } 的吧……
    ffts
        8
    ffts  
       Feb 22, 2014
    那个两行goto的意思就是不管怎么着也会goto fail?
    est
        9
    est  
    OP
       Feb 22, 2014   ❤️ 2
    bcxx
        10
    bcxx  
       Feb 22, 2014
    他們是怎麼做 code review 的啊……
    gihnius
        11
    gihnius  
       Feb 22, 2014
    所以 Go 要 {},很好.
    panlilu
        12
    panlilu  
       Feb 22, 2014
    代码风格的问题=。=
    jesse_luo
        13
    jesse_luo  
       Feb 22, 2014   ❤️ 1
    木有review么……

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

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

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

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

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

    2. https://gotofail.com/ - 假如你能看到图片,你受bug影响。
    Yo_oY
        26
    Yo_oY  
       Feb 23, 2014 via iPhone
    哈哈 前两天写objective-c的时候还犯过这错误。。。
    python写多了
    kavinyao
        27
    kavinyao  
       Feb 23, 2014 via iPhone
    前两天去面试,面试官说他一个在Apple工作的朋友如此评价iOS代码质量:absolutely horrible。
    cloudbeyond
        28
    cloudbeyond  
       Feb 23, 2014
    @bitinn 多谢,测试了一下,貌似就mac下的safari受影响?
    dndx
        29
    dndx  
       Feb 23, 2014
    吓死人了,一个几年前就有的严重漏洞,竟然到现在才发现。估计早被各种黑客玩烂了。
    9hills
        30
    9hills  
       Feb 23, 2014 via iPad
    iOS 7.0.3 safari 实测受bug影响
    paulw54jrn
        31
    paulw54jrn  
       Feb 23, 2014
    osX 10.9 Safari 受bug影响
    ainopara
        32
    ainopara  
       Feb 23, 2014 via iPad
    iOS6.1.2不受影响。
    sinxccc
        33
    sinxccc  
       Feb 23, 2014
    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  
       Feb 23, 2014
    论风格的重要性
    isprin
        35
    isprin  
       Feb 23, 2014
    难道 Apple 不用 Lint ?
    goofansu
        36
    goofansu  
       Feb 23, 2014
    menic
        37
    menic  
       Feb 23, 2014
    打赌是python程序员写的code。。。
    lch21
        38
    lch21  
       Feb 23, 2014
    手抖多复制了一行 goto fail
    luikore
        39
    luikore  
       Feb 23, 2014
    分号语言都很容易出这样的 bug
    sanddudu
        40
    sanddudu  
       Feb 23, 2014
    感觉已经成为了一个新的笑点了
    cchange
        41
    cchange  
       Feb 23, 2014 via iPhone
    @reverland 非常感谢,但是没发现这和两个goto fail的问题啊~
    应该是fail段落的问题吧?
    timonwong
        42
    timonwong  
       Feb 23, 2014   ❤️ 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  
       Feb 23, 2014
    iOS 7.0.6 safari 受影响
    tttwww18
        44
    tttwww18  
       Feb 23, 2014
    @tttwww18 不好意思打错。更新到7.0.6(11B651)后不受影响
    Shared
        45
    Shared  
       Feb 23, 2014
    @timonwong 其实是两次 SSLHashSHA1.upadate 之后 SSLHashSHA1.final 永远都不会执行了
    mikale
        46
    mikale  
       Feb 23, 2014
    我比较恶意,我认为这是apple 程序员故意留的bug,为了怕被发现,伪装的比较好
    Shared
        47
    Shared  
       Feb 23, 2014   ❤️ 1
    @menic 也许,但是:1)Python 没有 goto;2)Python 是强制缩进的,即使有 goto,写两次 goto hell 也没问题。
    messense
        48
    messense  
       Feb 23, 2014
    iOS 7.1 Beta 5 Safari 受影响。
    xowenx
        49
    xowenx  
       Feb 23, 2014
    OSX 10.9 chrome dev 不受影响 chrome用了自己的SSL/TLS库?
    treo
        50
    treo  
       Feb 23, 2014
    @xowenx 嗯,chrome和firefox用了NSS
    bombless
        51
    bombless  
       Feb 23, 2014
    估计是某些编辑器的快捷键的原因复制了一行
    zellux
        52
    zellux  
       Feb 23, 2014
    奇怪的是这样的代码编译器好歹要给个 warning 吧。

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

    一般编辑器/IDE也会帮你缩进啊,两个goto应该会在不同位置的
    aqqwiyth
        57
    aqqwiyth  
       Feb 23, 2014
    aqqwiyth
        58
    aqqwiyth  
       Feb 23, 2014
    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  
       Feb 23, 2014
    @timonwong 非常感谢 大概懂了~~~
    iam3z
        60
    iam3z  
       Feb 23, 2014
    http://daringfireball.net/2014/02/apple_prism

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

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

    不管是故意的还是无意的, 这个 bug 没被众多的开源开发者发现, 根本原因就是 if (x) y; y; 按语法规则解释成 if (x) {y;} y; 然后两个 y 缩进一样不容易发现.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2415 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 168ms · UTC 04:47 · PVG 12:47 · LAX 21:47 · JFK 00:47
    ♥ Do have faith in what you're doing.