Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

crypto/sha1: out-of-bounds access in blockAVX2 #15617

Closed
dvyukov opened this issue May 9, 2016 · 4 comments
Closed

crypto/sha1: out-of-bounds access in blockAVX2 #15617

dvyukov opened this issue May 9, 2016 · 4 comments
Milestone

Comments

@dvyukov
Copy link
Member

dvyukov commented May 9, 2016

go version devel +149ac34 Mon May 9 17:50:29 2016 +0000 linux/amd64

unexpected fault address 0x7f736efbf000
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x2 addr=0x7f736efbf000 pc=0x44b655]

goroutine 1 [running]:
runtime.throw(0x46a144, 0x5)
    src/runtime/panic.go:566 +0x8b fp=0xc4200797e0 sp=0xc4200797c8
runtime.sigpanic()
    src/runtime/sigpanic_unix.go:27 +0x27e fp=0xc420079830 sp=0xc4200797e0
crypto/sha1.blockAVX2(0xc420079e70, 0x7f736efbef00, 0x100, 0x1100)
    src/crypto/sha1/sha1block_amd64.s:1458 +0x4e5 fp=0xc420079db8 sp=0xc420079830
crypto/sha1.block(0xc420079e70, 0x7f736efbef00, 0x100, 0x1100)
    src/crypto/sha1/sha1block_amd64.go:19 +0x7e fp=0xc420079de0 sp=0xc420079db8
crypto/sha1.(*digest).Write(0xc420079e70, 0x7f736efbef00, 0x100, 0x1100, 0x3, 0xc4200001a0, 0x4226fa)
    src/crypto/sha1/sha1.go:75 +0x116 fp=0xc420079e20 sp=0xc420079de0
crypto/sha1.Sum(0x7f736efbef00, 0x100, 0x1100, 0x0, 0x0, 0x0)
    src/crypto/sha1/sha1.go:128 +0xcc fp=0xc420079ee0 sp=0xc420079e20
main.main()
    /tmp/sha1.go:19 +0x15b fp=0xc420079f50 sp=0xc420079ee0
runtime.main()
    src/runtime/proc.go:189 +0x20a fp=0xc420079fa0 sp=0xc420079f50
runtime.goexit()
    src/runtime/asm_amd64.s:2058 +0x1 fp=0xc420079fa8 sp=0xc420079fa0
package main

import (
    "crypto/sha1"
    "syscall"
)

func main() {
    const pageSize = 4 << 10
    data, err := syscall.Mmap(0, 0, 2*pageSize, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_ANON|syscall.MAP_PRIVATE)
    if err != nil {
        panic(err)
    }
    if err := syscall.Mprotect(data[pageSize:], syscall.PROT_NONE); err != nil {
        panic(err)
    }
    for i := 0; i < pageSize; i++ {
        println(i)
        sha1.Sum(data[pageSize-i : pageSize])
    }
}

One does not simply write native code.

@dvyukov dvyukov added this to the Go1.7 milestone May 9, 2016
@bradfitz
Copy link
Contributor

bradfitz commented May 9, 2016

I assume this is a regression introduced by fafadc5. @TocarIP, can you take a look?

@bradfitz bradfitz changed the title crypto/sha1: out-of-bounds access crypto/sha1: out-of-bounds access in blockAVX2 May 10, 2016
@bradfitz
Copy link
Contributor

I just hit this in a non-contrived program as well:

bradfitz@dev-bradfitz-debian2:~/go$ gomote push user-bradfitz-plan9-386-0
unexpected fault address 0xc420700000
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x1 addr=0xc420700000 pc=0x4a61d5]

goroutine 1 [running]:
runtime.throw(0x69d887, 0x5)
        /home/bradfitz/go/src/runtime/panic.go:566 +0x8b fp=0xc42004cc60 sp=0xc42004cc48
runtime.sigpanic()
        /home/bradfitz/go/src/runtime/sigpanic_unix.go:27 +0x27e fp=0xc42004ccb0 sp=0xc42004cc60
crypto/sha1.blockAVX2(0xc4200571f0, 0xc4206f8000, 0x8000, 0x8000)
        /home/bradfitz/go/src/crypto/sha1/sha1block_amd64.s:1458 +0x4e5 fp=0xc42004d238 sp=0xc42004ccb0
crypto/sha1.block(0xc4200571f0, 0xc4206f8000, 0x8000, 0x8000)
        /home/bradfitz/go/src/crypto/sha1/sha1block_amd64.go:19 +0x7e fp=0xc42004d260 sp=0xc42004d238
crypto/sha1.(*digest).Write(0xc4200571f0, 0xc4206f8000, 0x8000, 0x8000, 0x8000, 0x0, 0x0)
        /home/bradfitz/go/src/crypto/sha1/sha1.go:75 +0x116 fp=0xc42004d2a0 sp=0xc42004d260
io.copyBuffer(0x7f8eb7b403e0, 0xc4200571f0, 0x7b7320, 0xc42002a188, 0xc4206f8000, 0x8000, 0x8000, 0x66dc00, 0xc42004d300, 0x7f8eb7b403e0)
        /home/bradfitz/go/src/io/io.go:400 +0x24c fp=0xc42004d320 sp=0xc42004d2a0
io.Copy(0x7f8eb7b403e0, 0xc4200571f0, 0x7b7320, 0xc42002a188, 0xc4200571f0, 0xc4203dd2d8, 0x406162)
        /home/bradfitz/go/src/io/io.go:368 +0x5a fp=0xc42004d378 sp=0xc42004d320
main.fileSHA1(0xc420120d00, 0x35, 0x0, 0x0, 0x0, 0x0)
        /home/bradfitz/src/golang.org/x/build/cmd/gomote/push.go:293 +0x16e fp=0xc42004d3f0 sp=0xc42004d378
main.push.func3(0xc420120d00, 0x35, 0x7bbc40, 0xc4200d51e0, 0x0, 0x0, 0x0, 0x0)
        /home/bradfitz/src/golang.org/x/build/cmd/gomote/push.go:135 +0x268 fp=0xc42004d490 sp=0xc42004d3f0
path/filepath.walk(0xc420120d00, 0x35, 0x7bbc40, 0xc4200d51e0, 0xc420373360, 0x0, 0x0)
        /home/bradfitz/go/src/path/filepath/path.go:349 +0x71 fp=0xc42004d560 sp=0xc42004d490
path/filepath.walk(0xc4205fcc90, 0x21, 0x7bbc40, 0xc4200d45b0, 0xc420373360, 0x0, 0x0)
        /home/bradfitz/go/src/path/filepath/path.go:374 +0x324 fp=0xc42004d630 sp=0xc42004d560
path/filepath.walk(0xc4202561c0, 0x1c, 0x7bbc40, 0xc420100c30, 0xc420373360, 0x0, 0x0)
        /home/bradfitz/go/src/path/filepath/path.go:374 +0x324 fp=0xc42004d700 sp=0xc42004d630
path/filepath.walk(0xc420372880, 0x15, 0x7bbc40, 0xc42036d450, 0xc420373360, 0x0, 0x0)
        /home/bradfitz/go/src/path/filepath/path.go:374 +0x324 fp=0xc42004d7d0 sp=0xc42004d700
path/filepath.walk(0xc4200120c7, 0x11, 0x7bbc40, 0xc42011a1a0, 0xc420373360, 0x0, 0x1)
        /home/bradfitz/go/src/path/filepath/path.go:374 +0x324 fp=0xc42004d8a0 sp=0xc42004d7d0
path/filepath.Walk(0xc4200120c7, 0x11, 0xc420373360, 0x0, 0xc42037b260)
        /home/bradfitz/go/src/path/filepath/path.go:396 +0xc6 fp=0xc42004d8e8 sp=0xc42004d8a0
main.push(0xc42000c260, 0x1, 0x1, 0x4, 0xc42002dd50)
        /home/bradfitz/src/golang.org/x/build/cmd/gomote/push.go:142 +0x465 fp=0xc42004de48 sp=0xc42004d8e8
main.main()
        /home/bradfitz/src/golang.org/x/build/cmd/gomote/gomote.go:128 +0x151 fp=0xc42004df50 sp=0xc42004de48
runtime.main()
        /home/bradfitz/go/src/runtime/proc.go:189 +0x20a fp=0xc42004dfa0 sp=0xc42004df50
runtime.goexit()
        /home/bradfitz/go/src/runtime/asm_amd64.s:2058 +0x1 fp=0xc42004dfa8 sp=0xc42004dfa0

I will roll this back if the roll-forward fix can't be made soon.

gopherbot pushed a commit that referenced this issue May 10, 2016
Updates #15617

Change-Id: I2104776f8e789d987b4f2f7f08f2ebe979b747a1
Reviewed-on: https://go-review.googlesource.com/23001
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Reviewed-by: Minux Ma <minux@golang.org>
@rsc
Copy link
Contributor

rsc commented May 16, 2016

/cc @TocarIP

@gopherbot
Copy link

CL https://golang.org/cl/23138 mentions this issue.

@golang golang locked and limited conversation to collaborators May 26, 2017
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

4 participants