On Wed, Aug 22, 2012, Ralf Horstmann wrote:

> Hi,
> 
> when using OpenSSL 1.0.1c together with a chrooted bind 9.7.3
> on Red Hat 6 x86_64, I got reproducible crashes within OpenSSL:
> 
> Program received signal SIGSEGV, Segmentation fault.
> OPENSSL_cleanse () at x86_64cpuid.s:181
> 181             movq    %rax,(%rdi)
> (gdb) bt
> #0  OPENSSL_cleanse () at x86_64cpuid.s:181
> #1  0x00007ffff6ee076f in drbg_free_entropy (ctx=<value optimized out>, 
> out=0x0, olen=<value optimized out>) at rand_lib.c:213
> #2  0x00007ffff6e699b4 in FIPS_drbg_instantiate () from /lib64/libcrypto.so.10
> #3  0x00007ffff6ee0b90 in RAND_init_fips () at rand_lib.c:286
> #4  0x00007ffff6e74b31 in CRYPTO_set_mem_functions (m=0x7ffff7973780 
> <mem_alloc>, r=0x7ffff7973730 <mem_realloc>,
>     f=0x7ffff79734d0 <mem_free>) at mem.c:128
> #5  0x00007ffff79737f8 in dst__openssl_init (engine=0x0) at openssl_link.c:174
> #6  0x00007ffff797a888 in dst_lib_init2 (mctx=<value optimized out>, 
> ectx=0x7ffff7fa7280, engine=0x0, eflags=1) at dst_api.c:210
> #7  0x0000555555589493 in ns_server_create (mctx=<value optimized out>, 
> serverp=0x5555557c9eb0) at server.c:4934
> #8  0x0000555555579199 in setup (argc=<value optimized out>, 
> argv=0x7fffffffe698) at ./main.c:856
> #9  main (argc=<value optimized out>, argv=0x7fffffffe698) at ./main.c:1026
> 
> The strace fragment shows what is going on before the segfault:
> 
> 26734 open("/dev/urandom", O_RDONLY|O_NOCTTY|O_NONBLOCK) = -1 ENOENT (No such 
> file or directory)
> 26734 open("/dev/random", O_RDONLY|O_NOCTTY|O_NONBLOCK) = 9
> 26734 fstat(9, {st_mode=S_IFCHR|0644, st_rdev=makedev(1, 8), ...}) = 0
> 26734 poll([{fd=9, events=POLLIN}], 1, 10) = 1 ([{fd=9, revents=POLLIN}])
> 26734 read(9, "\254j\357\235t\36\273\306\26261\0\352A\221\321", 32) = 16
> 26734 close(9)                          = 0
> 26734 open("/dev/srandom", O_RDONLY|O_NOCTTY|O_NONBLOCK) = -1 ENOENT (No such 
> file or directory)
> 26734 socket(PF_FILE, SOCK_STREAM, 0)   = 9
> 26734 connect(9, {sa_family=AF_FILE, path="/var/run/egd-pool"}, 19) = -1 
> ENOENT (No such file or directory)
> 26734 close(9)                          = 0
> 26734 socket(PF_FILE, SOCK_STREAM, 0)   = 9
> 26734 connect(9, {sa_family=AF_FILE, path="/dev/egd-pool"}, 15) = -1 ENOENT 
> (No such file or directory)
> 26734 close(9)                          = 0
> 26734 socket(PF_FILE, SOCK_STREAM, 0)   = 9
> 26734 connect(9, {sa_family=AF_FILE, path="/etc/egd-pool"}, 15) = -1 ENOENT 
> (No such file or directory)
> 26734 close(9)                          = 0
> 26734 socket(PF_FILE, SOCK_STREAM, 0)   = 9
> 26734 connect(9, {sa_family=AF_FILE, path="/etc/entropy"}, 14) = -1 EACCES 
> (Permission denied)
> 26734 close(9)                          = 0
> 26734 getuid()                          = 25
> 26734 time(NULL)                        = 1345561606
> 26734 --- SIGSEGV (Segmentation fault) @ 0 (0) ---
> 
> So the init code doesn't get enough bytes from /dev/random,
> which then later triggers the bug.
> 
> The patch below fixes the issue. Creating /dev/urandom within the
> chroot helps as well.
> 

Since changing the fips module is not easy an alternative is to change the FIPS
capable OpenSSL. Try this patch: 

http://cvs.openssl.org/chngview?cn=22772

Steve.
--
Dr Stephen N. Henson. OpenSSL project core developer.
Commercial tech support now available see: http://www.openssl.org
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [email protected]
Automated List Manager                           [email protected]

Reply via email to