是什么导致OpenSSL出现故障

What is causing OpenSSL to segfault?

本文关键字:故障 OpenSSL 是什么      更新时间:2023-10-16
(gdb)bt#0 0x040010c2英寸??()来自/lib/ld-linux.so.2#1 0x06a14a0b在..写入()/sysdeps/unix/syscall模板。S: 82#2 0x04154ae9英寸??()来自/lib/i386-linux-gnu/libcrypto.so.1.0.0#3来自/lib/i386-linux-gnu/libcrypto.so.1.0.0的BIO_write()中的0x041518e4#4 0x040781f1英寸??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#5 0x040785ff in??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#6 0x04078855英寸??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#7 0x04075e28英寸??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#来自/lib/i386-linux-gnu/libssl.so.1.0.0的SSL_write()中的8 0x0408d709#9 0x0409c451英寸??()来自/lib/i386-linux-gnu/libssl.so.1.0.0#来自/lib/i386-linux-gnu/libcrypto.so.1.0.0的BIO_write()中的10 0x041518e4#SSL_Connection_send中的11 0x0814b10f(连接=0x9ffbbd0)。。。(gdb)打印*连接->bio$1={method=0x40ac800,callback=0,cb_arg=0x0,init=1,shutdown=1,flags=0,retry_recause=0,num=0,ptr=0xa27e768,next_bio=0x7b84ad0,prev_bio=0x0、references=1,num_read=904,num_write=2870,ex_data={sk=0x0,dummy=774321733}}(gdb)print*连接->ssl$2={版本=769,类型=4096,方法=0x40aacc0,rbio=0x7b84ad0,wbio=0x7b84ad0、bbio=0x0,rwstate=2,in_handshake=0,handshake_func=0x40738f0,服务器=0,new_session=0,quiet_shutdown=0,shutdown=0,state=3,rstate=240,init_buf=0x0,init_msg=0xf5838e4,init_num=0,init_off=0,packet=0xf848ebb"\027\003\001\030HTTP/1.1 200正常\r\n访问控制允许来源:*\r\n缓存控制:专用,没有缓存,没有存储,必须重新验证\r\n内容类型:text/javascript;字符集=UTF-8 \r\n标记:\"cacca674ed49d64124f812372ad59561"…,packet_length=0,s2=0x0,s3=0xf3ea410,d1=0x0、read_ahead=0,msg_callback=0、msg_callback_arg=0x0;hit=0;param=0x99f82b8,cipher_list=0x0,cipher_list_by_id=0x0,mac_flags=0,enc_read_ctx=0xace5438,read_hash=0xabce1c8,expand=0x0,enc_write_ctx=0x9794468,write_hash=0xc057018,compress=0,cert=0xe1f70d8,sid_ctx_length=0,sid_ctx='\000',session=0x7d54760,generate_session_id=0,verify_mode=0,验证回调=0,info_callback=0,error=0,error_code=0,psk_client_callback=0,psk_server_callback=0,ctx=0xae8ce30,debug=0,verify_result=20,ex_data={sk=0x0,dummy=0},client_CA=0x0、references=1、options=4、mode=4、max_cert_list=102400、first_packet=0,client_version=769,max_send_fragment=16384,tlsext_debug_cb=0,tlsect_debug_arg=0x0,tlsex_hostname=0x0、servername_done=0、tlsext_statuss_type=-1、tlsex_status_expected=0,tlsext_ocsp_id=0x0,tlsext_ocsp_exts=0x0,tlsext_ocssp_resp=0x0,tlsext_ocsp_resplen=-1,tlsept_tickt_expected=1,tlsect_ecpointformatlist_length=3,tlsext_ecpointformatlist=0xac40bc8",tlsext_ellipticcurvelist_length=50,tlsext_Ellipticccurvelist=0x7b20878",tlsect_opaque_prf_input=0x0,tlsex_opaque_prf_input _len=0,tlsex_session_ticket=0x0、tls_session_tickt_ext_cb=0,tls_session_ticket_ext_cb_arg=0x0,tls_session_secret_cb=0,tls_ession_secret_cb_arg=00x0,initial_ctx=0xae8ce30,next_proto_negotiated=0x982fd50"Groups.History",next_proto_negotiated_len=111'o',srtp_profiles=0x77373656d,srtp.profile=0x2e656761,tlsext_hbeart=1953720648,tlsex_hb_pending=0,tlsect_hb_seq=424,重新协商=1232,srp_ctx={SRP_cb_arg=0x0,TLS_ext_SRP_username_callback=0x6f697463,SRP_verify_param_callback=0x64695f6e,SRP_give_SRP_client_pwd_callback=0x4c4f202c,login=0x72742e44",N=0x498,g=0x0,s=0xa,B=0xfc0301,A=0xfc03,A=0x0,B=0x0、v=0x0;info=0x0。strength=0,srp_Mask=0}}

我正在努力找出出错的原因。当我向服务器发出请求时,错误会随机发生(也只在linux上)。可能是远程侧关闭了连接(连接->生物->关闭==1)?或者是内存错误(next_proto_negotiated=0x982fd50"Groups.History"……这看起来不像是一个协议,尽管valgrind没有发现任何内存错误)。

您是否正在进行任何多线程编程,同时访问不同线程上的套接字?如果是这样的话,请确保你没有在一个线程上写入它,而在另一个线程中关闭它。我以前犯过这个错误,也见过这样的撞车事故。在一个线程上获取所有SSL调用需要一些烦人的重新安排。

如果您因多线程而面临问题,那么在对SSL_shutdown()的两次调用之间休眠一秒钟可能会有所帮助。下面的文章甚至在单线程程序中也能做到这一点。

http://pic.dhe.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=%2Fcom.ibm.ztpf-ztpfdf.doc_put.cur%2Fgtps5%2Fs5sple2.html

如果服务器在设置TLS上下文时忽略了调用SSL_CTX_set_session_id_context,我在Linux上看到过openssl segfault。

如果较新的TLS客户端(如Windows Server 2012)正在尝试重新连接TLS票证,则很好地表明这是导致崩溃的原因。您将看到的是,每隔一次连接尝试都会导致segfault,因为在一次良好的连接之后,客户端会使用TLS票证进行第二次连接。

即使您没有使用TLS票证或会话缓存,也可以查看添加对SSL_CTX_set_session_id_context的调用是否解决了问题。