mirror of https://github.com/docker/cli.git
vendor: bump golang.org/x/crypto bac4c82f6975 (CVE-2020-9283)
full diff: 1d94cc7ab1...bac4c82f69
Version v0.0.0-20200220183623-bac4c82f6975 of golang.org/x/crypto fixes a
vulnerability in the golang.org/x/crypto/ssh package which allowed peers to
cause a panic in SSH servers that accept public keys and in any SSH client.
An attacker can craft an ssh-ed25519 or sk-ssh-ed25519@openssh.com public
key, such that the library will panic when trying to verify a signature
with it. Clients can deliver such a public key and signature to any
golang.org/x/crypto/ssh server with a PublicKeyCallback, and servers can
deliver them to any golang.org/x/crypto/ssh client.
This issue was discovered and reported by Alex Gaynor, Fish in a Barrel,
and is tracked as CVE-2020-9283.
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
2a6caf214b
commit
1edb10fe30
|
@ -72,7 +72,7 @@ github.com/tonistiigi/units 6950e57a87eaf136bbe44ef2ec8e
|
||||||
github.com/xeipuuv/gojsonpointer 02993c407bfbf5f6dae44c4f4b1cf6a39b5fc5bb
|
github.com/xeipuuv/gojsonpointer 02993c407bfbf5f6dae44c4f4b1cf6a39b5fc5bb
|
||||||
github.com/xeipuuv/gojsonreference bd5ef7bd5415a7ac448318e64f11a24cd21e594b
|
github.com/xeipuuv/gojsonreference bd5ef7bd5415a7ac448318e64f11a24cd21e594b
|
||||||
github.com/xeipuuv/gojsonschema f971f3cd73b2899de6923801c147f075263e0c50 # v1.1.0
|
github.com/xeipuuv/gojsonschema f971f3cd73b2899de6923801c147f075263e0c50 # v1.1.0
|
||||||
golang.org/x/crypto 1d94cc7ab1c630336ab82ccb9c9cda72a875c382
|
golang.org/x/crypto bac4c82f69751a6dd76e702d54b3ceb88adab236
|
||||||
golang.org/x/net f3200d17e092c607f615320ecaad13d87ad9a2b3
|
golang.org/x/net f3200d17e092c607f615320ecaad13d87ad9a2b3
|
||||||
golang.org/x/oauth2 ef147856a6ddbb60760db74283d2424e98c87bff
|
golang.org/x/oauth2 ef147856a6ddbb60760db74283d2424e98c87bff
|
||||||
golang.org/x/sync e225da77a7e68af35c70ccbf71af2b83e6acac3c
|
golang.org/x/sync e225da77a7e68af35c70ccbf71af2b83e6acac3c
|
||||||
|
|
|
@ -562,9 +562,11 @@ func parseED25519(in []byte) (out PublicKey, rest []byte, err error) {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
key := ed25519.PublicKey(w.KeyBytes)
|
if l := len(w.KeyBytes); l != ed25519.PublicKeySize {
|
||||||
|
return nil, nil, fmt.Errorf("invalid size %d for Ed25519 public key", l)
|
||||||
|
}
|
||||||
|
|
||||||
return (ed25519PublicKey)(key), w.Rest, nil
|
return ed25519PublicKey(w.KeyBytes), w.Rest, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k ed25519PublicKey) Marshal() []byte {
|
func (k ed25519PublicKey) Marshal() []byte {
|
||||||
|
@ -582,9 +584,11 @@ func (k ed25519PublicKey) Verify(b []byte, sig *Signature) error {
|
||||||
if sig.Format != k.Type() {
|
if sig.Format != k.Type() {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
||||||
}
|
}
|
||||||
|
if l := len(k); l != ed25519.PublicKeySize {
|
||||||
|
return fmt.Errorf("ssh: invalid size %d for Ed25519 public key", l)
|
||||||
|
}
|
||||||
|
|
||||||
edKey := (ed25519.PublicKey)(k)
|
if ok := ed25519.Verify(ed25519.PublicKey(k), b, sig.Blob); !ok {
|
||||||
if ok := ed25519.Verify(edKey, b, sig.Blob); !ok {
|
|
||||||
return errors.New("ssh: signature did not verify")
|
return errors.New("ssh: signature did not verify")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -838,6 +842,10 @@ func parseSKEd25519(in []byte) (out PublicKey, rest []byte, err error) {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if l := len(w.KeyBytes); l != ed25519.PublicKeySize {
|
||||||
|
return nil, nil, fmt.Errorf("invalid size %d for Ed25519 public key", l)
|
||||||
|
}
|
||||||
|
|
||||||
key := new(skEd25519PublicKey)
|
key := new(skEd25519PublicKey)
|
||||||
key.application = w.Application
|
key.application = w.Application
|
||||||
key.PublicKey = ed25519.PublicKey(w.KeyBytes)
|
key.PublicKey = ed25519.PublicKey(w.KeyBytes)
|
||||||
|
@ -862,6 +870,9 @@ func (k *skEd25519PublicKey) Verify(data []byte, sig *Signature) error {
|
||||||
if sig.Format != k.Type() {
|
if sig.Format != k.Type() {
|
||||||
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type())
|
||||||
}
|
}
|
||||||
|
if l := len(k.PublicKey); l != ed25519.PublicKeySize {
|
||||||
|
return fmt.Errorf("invalid size %d for Ed25519 public key", l)
|
||||||
|
}
|
||||||
|
|
||||||
h := sha256.New()
|
h := sha256.New()
|
||||||
h.Write([]byte(k.application))
|
h.Write([]byte(k.application))
|
||||||
|
@ -898,8 +909,7 @@ func (k *skEd25519PublicKey) Verify(data []byte, sig *Signature) error {
|
||||||
|
|
||||||
original := Marshal(blob)
|
original := Marshal(blob)
|
||||||
|
|
||||||
edKey := (ed25519.PublicKey)(k.PublicKey)
|
if ok := ed25519.Verify(k.PublicKey, original, edSig.Signature); !ok {
|
||||||
if ok := ed25519.Verify(edKey, original, edSig.Signature); !ok {
|
|
||||||
return errors.New("ssh: signature did not verify")
|
return errors.New("ssh: signature did not verify")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1051,7 +1061,10 @@ func NewPublicKey(key interface{}) (PublicKey, error) {
|
||||||
case *dsa.PublicKey:
|
case *dsa.PublicKey:
|
||||||
return (*dsaPublicKey)(key), nil
|
return (*dsaPublicKey)(key), nil
|
||||||
case ed25519.PublicKey:
|
case ed25519.PublicKey:
|
||||||
return (ed25519PublicKey)(key), nil
|
if l := len(key); l != ed25519.PublicKeySize {
|
||||||
|
return nil, fmt.Errorf("ssh: invalid size %d for Ed25519 public key", l)
|
||||||
|
}
|
||||||
|
return ed25519PublicKey(key), nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("ssh: unsupported key type %T", key)
|
return nil, fmt.Errorf("ssh: unsupported key type %T", key)
|
||||||
}
|
}
|
||||||
|
@ -1304,7 +1317,6 @@ func parseOpenSSHPrivateKey(key []byte, decrypt openSSHDecryptFunc) (crypto.Priv
|
||||||
return nil, errors.New("ssh: malformed OpenSSH key")
|
return nil, errors.New("ssh: malformed OpenSSH key")
|
||||||
}
|
}
|
||||||
|
|
||||||
// we only handle ed25519 and rsa keys currently
|
|
||||||
switch pk1.Keytype {
|
switch pk1.Keytype {
|
||||||
case KeyAlgoRSA:
|
case KeyAlgoRSA:
|
||||||
// https://github.com/openssh/openssh-portable/blob/master/sshkey.c#L2760-L2773
|
// https://github.com/openssh/openssh-portable/blob/master/sshkey.c#L2760-L2773
|
||||||
|
|
Loading…
Reference in New Issue