Skip to content
  • David Benjamin's avatar
    crypto/tls: fix a minor MAC vs padding leak · 1f8aa21c
    David Benjamin authored
    The CBC mode ciphers in TLS are a disaster. By ordering authentication
    and encryption wrong, they are very subtly dependent on details and
    implementation of the padding check, admitting attacks such as POODLE
    and Lucky13.
    
    crypto/tls does not promise full countermeasures for Lucky13 and still
    contains some timing variations. This change fixes one of the easy ones:
    by checking the MAC, then the padding, rather than all at once, there is
    a very small timing variation between bad MAC and (good MAC, bad
    padding).
    
    The consequences depend on the effective padding value used in the MAC
    when the padding is bad. extractPadding simply uses the last byte's
    value, leaving the padding bytes effectively unchecked. This is the
    scenario in SSL 3.0 that led to POODLE. Specifically, the attacker can
    take an input record which uses 16 bytes of padding (a full block) and
    replace the final block with some interesting block. The MAC check will
    succeed with 1/256 probability due to the final byte being 16. This
    again means that after 256 queries, the attacker can decrypt one byte.
    
    To fix this, bitwise AND the two values so they may be checked with one
    branch. Additionally, zero the padding if the padding check failed, to
    make things more robust.
    
    Updates #27071
    
    Change-Id: I332b14d215078928ffafe3cfeba1a68189f08db3
    Reviewed-on: https://go-review.googlesource.com/c/go/+/170701
    
    
    Reviewed-by: default avatarFilippo Valsorda <filippo@golang.org>
    Run-TryBot: Filippo Valsorda <filippo@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    1f8aa21c