为什么OpenSSL崩溃

Why is OpenSSL crashing?

本文关键字:崩溃 OpenSSL 为什么      更新时间:2023-10-16

这是我从gdb:获得的回溯

(gdb)bt#0 0x040010c2英寸??()来自/lib/ld-linux.so.2#1 0x06822a0b在..写入()/sysdeps/unix/syscall模板。S: 82#bss_conn.c:442处的conn_write(b=0x9791b40,in=0xe9125a3"\027\003\003",inl=175)中的2 0x082e6891#BIO_write中的3 0x082e40cb(b=0x9791b40,in=0xe9125a3,inl=175),位于BIO_lib.c:247#ssl3_write_pending中的4 0x08290991(s=0xea22bd8,类型=23,buf=0xafdeb08"主机:graphic.facebook.com\r\n用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.4(KHTML,类似Gecko)Chrome/22.1229.94 Safari/537.4\r\n",len=146),位于s3_pkt.c:881#do_ssl3_write中的5 0x082908a4(s=0xea22bd8,类型=23,buf=0xafdeb08"主机:graphic.facebook.com\r\n用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.4(KHTML,类似Gecko)Chrome/22.1229.94 Safari/537.4\r\n",len=146,create_empty_frage=0),位于s3_pkt.c:853#s3_pkt.c:609处的ssl3_write_bytes中的6 0x08290281(s=0xea22bd8,类型=23,buf=0xafdeb08,len=146)#s3_lib.c:4204处的ssl3_write(s=0xea22bd8,buf=0xafdeb08,len=146)中的7 0x0828d0c3#SSL_lib.c:1002处SSL_write中的8 0x082a4eae(s=0xea22bd8,buf=0xafdeb08,num=146)#写中的9 0x082b363b(b=0xaf5ba48,out=0xfdeb08"主机:graphic.facebook.com\r\n用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.4(KHTML,类似Gecko)Chrome/22.1229.94 Safari/537.4\r\n",outl=146)位于bio_ssl.c:243#BIO_write中的10 0x082e40cb(b=0xf5ba48,in=0xfdeb08,inl=146),位于BIO_lib.c:247#Connection_send中的11 0x0816c7db(连接=0xaf6ef10,data=0xfdeb08"主机:graphic.facebook.com\r\n用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.4(KHTML,类似Gecko)Chrome/22.1229.94 Safari/537.4\r\n",长度=146)在Util/SSL_Connection.cpp:318

这是第一个可疑的valgrind错误:

==2803==系统调用参数写入(buf)指向未初始化的字节===2803===在0x6822A0B:???(系统调用模板.S:82)===2803===通过0x82E40CA:BIO_write(BIO_lib.c:247)===2803===通过0x829790E:ssl23_write_bytes(s23_pkt.c:77)===2803===通过0x8296D63:ssl23_client_hello(s23_clnt.c:594)===2803===通过0x829621C:ssl23_connect(s23_clnt.c:217)===2803===通过0x82A785C:SSL_do_handshake(SSL_lib.c:2564)===2803===通过0x82B3C22:ssl_ctrl(bio_ssl.c:423)===2803===通过0x82E4552:BIO_ctrl(BIO_lib.c:370)===2803===通过0x816C2AA:SSL_Connection_connect(SSL_Connection_s*)(SSL_Cnnection.cpp:162)===2803===通过0x8147C17:Connection_connectToHost(Connection.cpp:48)===2803===通过0x815E8B7:Http_client_send_prepare(Http_Message_s*)(Http_client.cpp:330)===2803===通过0x815E9FD:Http_client_send(Http_client.cpp:357)===2803===地址0xe9e6f33在分配的大小为21848的块内为11个字节===2803===在0x4028876:malloc(vg_replace_malloc.c:236)===2803===通过0x82C898B:default_malloc_ex(mem.c:79)===2803===通过0x82C8EAA:CYPTO_malloc(mem.c:308)===2803===通过0x82E349B:BUF_MEM_grow(缓冲区.c:121)===2803===通过0x8296198:ssl23_connect(s23_clnt.c:195)===2803===通过0x82A785C:SSL_do_handshake(SSL_lib.c:2564)===2803===通过0x82B3C22:ssl_ctrl(bio_ssl.c:423)===2803===通过0x82E4552:BIO_ctrl(BIO_lib.c:370)===2803===通过0x816C2AA:SSL_Connection_connect(SSL_Connection_s*)(SSL_Cnnection.cpp:162)===2803===通过0x8147C17:Connection_connectToHost(Connection.cpp:48)===2803===通过0x815E8B7:Http_client_send_prepare(Http_Message_s*)(Http_client.cpp:330)===2803===by0x815E9FD:Http_client_send(Http_client.cpp:357)

这是崩溃前最新的valgrind错误:

==系统调用参数写入(buf)指向未初始化的字节===2803===在0x6822A0B:???(系统调用模板.S:82)===2803===通过0x82E40CA:BIO_write(BIO_lib.c:247)===2803===通过0x8290990:ssl3_write_pending(s3_pkt.c:881)===2803===通过0x82908A3:do_ssl3_write(s3_pkt.c:853)===2803===通过0x8290280:ssl3_write_bytes(s3_pkt.c:609)===2803===通过0x828D0C2:ssl3_write(s3_lib.c:4204)===2803===通过0x82A4EAD:SSL_write(SSL_lib.c:1002)===2803===通过0x82B363A:ssl_write(bio_ssl.c:243)===2803===通过0x82E40CA:BIO_write(BIO_lib.c:247)===2803===通过0x816C7DA:SSL_Connection_send(SSL_Connection_s*,char*,unsigned int)(SSL_Cnnection.cpp:318)===2803===通过0x8147F66:Connection_send(Connection.cpp:167)===2803===通过0x815EA67:Http_client_send(Http_client.cpp:368)===2803===地址0xe9125a8在分配的大小为17584的块内为8个字节===2803===在0x4028876:malloc(vg_replace_malloc.c:236)===2803===通过0x82C898B:default_malloc_ex(mem.c:79)===2803===通过0x82C8EAA:CYPTO_malloc(mem.c:308)===2803===通过0x8293115:freelist_extract(s3_both.c:708)===2803===通过0x8293412:ssl3_setup_write_buffer(s3_both.c:811)===2803===通过0x829349B:ssl3_setup_buffers(s3_both.c:829)===2803===通过0x82961C3:ssl23_connect(s23_clnt.c:204)===2803===通过0x82A785C:SSL_do_handshake(SSL_lib.c:2564)===2803===通过0x82B3C22:ssl_ctrl(bio_ssl.c:423)===2803===通过0x82E4552:BIO_ctrl(BIO_lib.c:370)===2803===通过0x816C2AA:SSL_Connection_connect(SSL_Connection_s*)(SSL_Cnnection.cpp:162)===2803===由0x8147C17:Connection_connectToHost(Connection.cpp:48)

带有--磁道原点:

==3588==系统调用参数写入(buf)指向未初始化的字节===3588===在0x6822A0B:???(系统调用模板.S:82)===3588===通过0x82E40CA:BIO_write(BIO_lib.c:247)===3588===通过0x829790E:ssl23_write_bytes(s23_pkt.c:77)===3588===通过0x8296D63:ssl23_client_hello(s23_clnt.c:594)===3588===通过0x829621C:ssl23_connect(s23_clnt.c:217)===3588===通过0x82A785C:SSL_do_handshake(SSL_lib.c:2564)===3588===通过0x82B3C22:ssl_ctrl(bio_ssl.c:423)===3588===通过0x82E4552:BIO_ctrl(BIO_lib.c:370)===3588===通过0x816C2AA:SSL_Connection_connect(SSL_Connection_s*)(SSL_Cnnection.cpp:162)===3588===通过0x8147C17:Connection_connectToHost(Connection.cpp:48)===3588===地址0x106e8cd3在大小为21848的块内为11个字节===3588===在0x4028876:malloc(vg_replace_malloc.c:236)===3588===通过0x82C898B:default_malloc_ex(mem.c:79)===3588===通过0x82C8EAA:CRYPTO_maloc(mem.c:308)===3588===通过0x82E349B:BUF_MEM_grow(缓冲区.c:121)===3588===通过0x8296198:ssl23_connect(s23_clnt.c:195)===3588===通过0x82A785C:SSL_do_handshake(SSL_lib.c:2564)===3588===通过0x82B3C22:ssl_ctrl(bio_ssl.c:423)===3588===通过0x82E4552:BIO_ctrl(BIO_lib.c:370)===3588===通过0x816C2AA:SSL_Connection_connect(SSL_Connection_s*)(SSL_Cnnection.cpp:162)===3588===通过0x8147C17:Connection_connectToHost(Connection.cpp:48)===3588===未初始化的值是由堆分配创建的===3588===在0x4028876:malloc(vg_replace_malloc.c:236)===3588===通过0x82C898B:default_malloc_ex(mem.c:79)===3588===通过0x82C8EAA:CRYPTO_maloc(mem.c:308)===3588===通过0x83568E7:bnrand(bn_rand.c:134)===3588===由0x8356B6E:BN_rand(BN_rand.c:213)===3588===通过0x8356DCD:bn_rand_range(bn_rand.c:281)===3588===通过0x8356EA9:BN_rand_range(BN_rand.c:299)===3588===通过0x82DE894:EC_KEY_generate_KEY(EC_KEY.c:271)===3588===通过0x8288A4D:ssl3_send_client_key_exchange(s3_clnt.c:2606)===3588===通过0x8283BA6:ssl3_connect(s3_clnt.c:416)===3588===通过0x82A4CF2:SSL_connect(SSL_lib.c:949)===3588===通过0x82975B7:ssl23_get_server_hello(s23_clnt.c:797)===3588===通过0x829624A:ssl23_connect(s23_clnt.c:226)===3588===通过0x82A785C:SSL_do_handshake(SSL_lib.c:2564)===3588===通过0x82B3C22:ssl_ctrl(bio_ssl.c:423)===3588===通过0x82E4552:BIO_ctrl(BIO_lib.c:370)===3588===通过0x816C2AA:SSL_Connection_connect(SSL_Connection_s*)(SSL_Cnnection.cpp:162)===3588===by 0x8147C17:Connection_connectToHost(Connection.cpp:48)

为什么会发生此错误:这些错误看起来都来自OpenSSL库?

从Valgrind错误消息来看,您的程序似乎正在试图访问系统调用中未初始化或不可调整的值(write)。

==2803== Syscall param write(buf) points to uninitialised byte(s)
==2803==  Address 0xe9125a8 is 8 bytes inside a block of size 17,584 alloc'd
==2803==  Address 0xe9e6f33 is 11 bytes inside a block of size 21,848 alloc'd

从Valgrind(Memcheck)手册中可以找到以下信息:

它检查系统调用的所有参数。

它检查所有直接参数本身,无论它们是否已初始化。

此外,如果系统调用需要从您的程序,Memcheck检查整个缓冲区是否可寻址内容被初始化。

如果系统调用需要写入用户提供的缓冲器,Memcheck检查缓冲区是否可寻址。

系统调用后,Memcheck将其跟踪信息更新为精确反映系统引起的内存状态的任何变化呼叫

您可能希望在Valgrind中使用--track origins=yes选项运行应用程序,以获取未初始化内存使用的更详细信息。您可以查看我之前关于Valgrind的帖子,以及如何在您的程序报告第一个错误时将GDB/Valgrind一起用于执行实时调试。