推荐学习书目
› 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 · 17692 views
    This topic created in 4643 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
    treo
    Feb 22, 2014
    1
    还真有人在C里用goto啊。。
    wwqgtxx
    wwqgtxx
    Feb 22, 2014 via Android❤️1
    2
    @treo 操作系统级别的c源码中goto很常见的,你可以看看linux的源码了
    kaiix
    kaiix
    Feb 22, 2014
    3
    if 后单语句不加花括号的确好看 不过看来还是容易出错
    截屏中其他代码的缩进也很奇怪啊
    treo
    treo
    Feb 22, 2014
    4
    @wwqgtxx 谢谢指教,搜了下,原来 goto fail 是被当作exception handle来用的
    dorentus
    dorentus
    Feb 22, 2014
    5
    @kaiix 是的,最后的 goto 后面那几行和 goto 一样的缩进,但是前面最近的 if block 很明显也没有用花括号……
    yinxingren
    yinxingren
    Feb 22, 2014
    6
    论大括号的必要性
    dorentus
    dorentus
    Feb 22, 2014
    7
    用 ruby 的话,应该也不会有这种错误存在。

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

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

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

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

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

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

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

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

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

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

    对于这个例子来说,Java 编译器当然能解决这个问题,因为这是编译错误,不是警告。
    luikore
    luikore
    Feb 25, 2014
    69
    @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   ·   Privacy   ·   Solana   ·   1023 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 174ms · UTC 22:38 · PVG 06:38 · LAX 14:38 · JFK 17:38
    ♥ Do have faith in what you're doing.