Skip to content

the handshake State judgment is not completely accurate on boringssl with the branch main-with-bazel #562

Closed
@boost2020

Description

@boost2020

此问题是#552 的后续,背景再叙说一下:
环境:
nginx 版本: nginx/1.19.3
boringssl 版本:https://github.com/google/boringssl/branches main-with-bazel commit id: f1c75347daa2ea81a941e953f2263e0a4d970c8d
静态编译到nginx中,并且没有带-g的编译,因此readelf都看不到符号表信息

 readelf -s /usr/local/openresty/nginx/sbin/nginx |grep SSL_
   179: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND OPENSSL_memory_alloc
   188: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND OPENSSL_memory_get_size
   336: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND OPENSSL_memory_free

这个时候使用ecapture就会报错:

./ecapture-0606 tls --libssl=/usr/local/openresty/nginx/sbin/nginx --ssl_version="boringssl na" -b 2 -m key
2024-06-06T22:05:00+08:00 INF AppName="eCapture(旁观者)"
2024-06-06T22:05:00+08:00 INF HomePage=https://ecapture.cc
2024-06-06T22:05:00+08:00 INF Repository=https://github.com/gojue/ecapture
2024-06-06T22:05:00+08:00 INF Author="CFC4N <cfc4ncs@gmail.com>"
2024-06-06T22:05:00+08:00 INF Description="Capturing SSL/TLS plaintext without a CA certificate using eBPF. Supported on Linux/Android kernels for amd64/arm64."
2024-06-06T22:05:00+08:00 INF Version=linux_amd64:0.8.2--8e25629:x86_64
2024-06-06T22:05:00+08:00 INF listen=localhost:28256
2024-06-06T22:05:00+08:00 INF https server starting...You can update the configuration file via the HTTP interface.
2024-06-06T22:05:00+08:00 WRN ========== module starting. ==========
2024-06-06T22:05:00+08:00 INF Kernel Info=4.19.132 Pid=36269
2024-06-06T22:05:00+08:00 INF BTF bytecode mode: non-CORE. btfMode=2
2024-06-06T22:05:00+08:00 INF master key keylogger has been set. eBPFProgramType=KeyLog keylogger=ecapture_openssl_key.og
2024-06-06T22:05:00+08:00 INF module initialization. isReload=false moduleName=EBPFProbeOPENSSL
2024-06-06T22:05:00+08:00 INF Module.Run()
2024-06-06T22:05:00+08:00 INF OpenSSL/BoringSSL version found sslVersion="boringssl na"
2024-06-06T22:05:00+08:00 INF HOOK type:Openssl elf ElfType=2 binrayPath=/usr/local/openresty/nginx/sbin/nginx masterHookFuncs=["SSL_in_init"]
2024-06-06T22:05:00+08:00 INF setupManagers eBPFProgramType=KeyLog
2024-06-06T22:05:00+08:00 INF BPF bytecode file is matched. bpfFileName=user/bytecode/boringssl_na_kern_noncore_less52.o
2024-06-06T22:05:00+08:00 FTL module run failed, skip it. error="couldn't start bootstrap manager error:1 error occurred:\n\t* error:opening uprobe: symbol SSL_in_init: not found , isRet:false, opts:&{0 0 0 0 0 }, {UID:uprobe_smk_SSL_in_init, EbpfFuncName:probe_ssl_master_key}\n\n, probes activation validation failed ." isReload=false

静态编译到nginx时带上-g,加上符号表后,

readelf -s /usr/local/openresty/nginx/sbin/nginx |grep SSL_|grep "^.*14 SSL"

 17035: 00000000002a2966   144 FUNC    LOCAL  DEFAULT   14 SSL_get_certificate
 17043: 0000000000290281    27 FUNC    LOCAL  DEFAULT   14 SSL_free
 17048: 0000000000295cce    15 FUNC    LOCAL  DEFAULT   14 SSL_CTX_sess_accept
 17115: 00000000002931a8    52 FUNC    LOCAL  DEFAULT   14 SSL_get_curve_id
 17126: 0000000000290f33   297 FUNC    LOCAL  DEFAULT   14 SSL_write
 17151: 00000000002a30a4    43 FUNC    LOCAL  DEFAULT   14 SSL_clear_chain_certs
 17167: 0000000000292156   131 FUNC    LOCAL  DEFAULT   14 SSL_set_fd
 17211: 0000000000291576   136 FUNC    LOCAL  DEFAULT   14 SSL_set_quic_early_data_c
 17215: 0000000000295839    92 FUNC    LOCAL  DEFAULT   14 SSL_set_retain_only_sha25
 17218: 0000000000294bf5    18 FUNC    LOCAL  DEFAULT   14 SSL_get_info_callback
 17260: 000000000029989d   171 FUNC    LOCAL  DEFAULT   14 SSL_use_RSAPrivateKey_ASN
 17275: 0000000000294247    94 FUNC    LOCAL  DEFAULT   14 SSL_set_tls_channel_id_en
 17285: 0000000000295d37    15 FUNC    LOCAL  DEFAULT   14 SSL_CTX_sess_cache_full
 17289: 0000000000296201    34 FUNC    LOCAL  DEFAULT   14 SSL_CTX_set_tlsext_status
 17311: 000000000028b771   384 FUNC    LOCAL  DEFAULT   14 SSL_CTX_use_PrivateKey_fi
 17312: 00000000002a2fe8   107 FUNC    LOCAL  DEFAULT   14 SSL_add1_chain_cert
 17377: 0000000000295f0e   361 FUNC    LOCAL  DEFAULT   14 SSL_process_tls13_new_ses
 17400: 00000000002a70d9   124 FUNC    LOCAL  DEFAULT   14 SSL_get_key_block_len
 17418: 0000000000285adf    62 FUNC    LOCAL  DEFAULT   14 SSL_CTX_set_signed_cert_t
 17454: 00000000002bfdd3   165 FUNC    LOCAL  DEFAULT   14 SSL_get0_ech_retry_config
 17458: 00000000002893d9    17 FUNC    LOCAL  DEFAULT   14 SSL_CIPHER_get_id
 17476: 00000000002a33c0   218 FUNC    LOCAL  DEFAULT   14 SSL_get0_chain_certs
 17477: 00000000002c03e4   201 FUNC    LOCAL  DEFAULT   14 SSL_ECH_KEYS_has_duplicat
 17493: 00000000002902ca    46 FUNC    LOCAL  DEFAULT   14 SSL_set_accept_state
 17531: 00000000002857ee   240 FUNC    LOCAL  DEFAULT   14 SSL_use_certificate_ASN1
 17536: 000000000029e780    46 FUNC    LOCAL  DEFAULT   14 SSL_SESSION_get0_id_conte
 17544: 0000000000295d0a    15 FUNC    LOCAL  DEFAULT   14 SSL_CTX_sess_cb_hits
 17551: 000000000029046c    30 FUNC    LOCAL  DEFAULT   14 SSL_get_rbio
 17554: 0000000000289bbb    17 FUNC    LOCAL  DEFAULT   14 SSL_CIPHER_get_version
 17566: 0000000000289746   317 FUNC    LOCAL  DEFAULT   14 SSL_CIPHER_get_kx_name
 17570: 00000000002858de    63 FUNC    LOCAL  DEFAULT   14 SSL_CTX_set_cert_cb
 17590: 0000000000294c8a    52 FUNC    LOCAL  DEFAULT   14 SSL_CTX_set_quic_method
 17605: 00000000002946ce   175 FUNC    LOCAL  DEFAULT   14 SSL_get_privatekey
 17608: 0000000000292b76    72 FUNC    LOCAL  DEFAULT   14 SSL_CTX_set_max_send_frag
 17634: 0000000000294862    19 FUNC    LOCAL  DEFAULT   14 SSL_get_server_tmp_key
 17680: 00000000002947fe    70 FUNC    LOCAL  DEFAULT   14 SSL_session_reused
 17686: 00000000002931dc    19 FUNC    LOCAL  DEFAULT   14 SSL_CTX_set_tmp_dh
 17687: 000000000029592b    94 FUNC    LOCAL  DEFAULT   14 SSL_set_permute_extension
 17689: 0000000000285ddf    31 FUNC    LOCAL  DEFAULT   14 SSL_delegated_credential_
 17690: 000000000028563e   119 FUNC    LOCAL  DEFAULT   14 SSL_set_chain_and_key
 17722: 000000000029574c    86 FUNC    LOCAL  DEFAULT   14 SSL_get_client_random
 17726: 000000000028f7e5  1800 FUNC    LOCAL  DEFAULT   14 SSL_new
 17747: 00000000002949c5    65 FUNC    LOCAL  DEFAULT   14 SSL_get_shutdown
 17789: 0000000000290722   278 FUNC    LOCAL  DEFAULT   14 SSL_do_handshake
 17790: 0000000000290322    42 FUNC    LOCAL  DEFAULT   14 SSL_set0_wbio

ecapture就能正常work了

 ./ecapture-0606 tls --libssl=/usr/local/openresty/nginx/sbin/nginx --ssl_version="boringssl na" -b 2 -m key
2024-06-06T22:10:20+08:00 INF AppName="eCapture(旁观者)"
2024-06-06T22:10:20+08:00 INF HomePage=https://ecapture.cc
2024-06-06T22:10:20+08:00 INF Repository=https://github.com/gojue/ecapture
2024-06-06T22:10:20+08:00 INF Author="CFC4N <cfc4ncs@gmail.com>"
2024-06-06T22:10:20+08:00 INF Description="Capturing SSL/TLS plaintext without a CA certificate using eBPF. Supported on Linux/Android kernels for amd64/arm64."
2024-06-06T22:10:20+08:00 INF Version=linux_amd64:0.8.2--8e25629:x86_64
2024-06-06T22:10:20+08:00 INF listen=localhost:28256
2024-06-06T22:10:20+08:00 INF https server starting...You can update the configuration file via the HTTP interface.
2024-06-06T22:10:20+08:00 WRN ========== module starting. ==========
2024-06-06T22:10:20+08:00 INF Kernel Info=4.19.132 Pid=38162
2024-06-06T22:10:20+08:00 INF BTF bytecode mode: non-CORE. btfMode=2
2024-06-06T22:10:20+08:00 INF master key keylogger has been set. eBPFProgramType=KeyLog keylogger=ecapture_openssl_key.og
2024-06-06T22:10:20+08:00 INF module initialization. isReload=false moduleName=EBPFProbeOPENSSL
2024-06-06T22:10:20+08:00 INF Module.Run()
2024-06-06T22:10:20+08:00 INF OpenSSL/BoringSSL version found sslVersion="boringssl na"
2024-06-06T22:10:20+08:00 INF HOOK type:Openssl elf ElfType=2 binrayPath=/usr/local/openresty/nginx/sbin/nginx masterHookFuncs=["SSL_in_init"]
2024-06-06T22:10:20+08:00 INF setupManagers eBPFProgramType=KeyLog
2024-06-06T22:10:20+08:00 INF BPF bytecode file is matched. bpfFileName=user/bytecode/boringssl_na_kern_noncore_less52.o
2024-06-06T22:10:20+08:00 INF perfEventReader created mapSize(MB)=4
2024-06-06T22:10:20+08:00 INF module started successfully. isReload=false moduleName=EBPFProbeOPENSSL

但这里还是有问题:

boringssl_masterkey.h 第299行

        if (ssl3_hs_state.state < 20) {
            // not finished yet.
            return 0;
        }

判断握手状态的值 20不太合适,实际上state 等于18时,握手就完成了

           <...>-37497 [001] .... 25597082.620129: 0: mastersecret->version :771, client_version:771, 
           <...>-37497 [001] .... 25597082.620153: 0: client_version:771, state:18, tls13_state:0
           <...>-37497 [001] .... 25597082.620153: 0: TLS version :771, hash_len:0, 
           <...>-37497 [001] .... 25597082.620154: 0: SSL_HANDSHAKE_ALLBOOL:8520208, ssl_hs_st_addr:56077c9a9088
           <...>-37497 [001] .... 25597082.620155: 0: mastersecret->version :771, client_version:771, 
           <...>-37497 [001] .... 25597082.620157: 0: ssl_st->s3->hs->new_session is not null, address :56077e5c7ba8
           <...>-37497 [001] .... 25597082.620158: 0: s3_address:56077e5cc508, ssl_session_st_addr addr :56077e5c7ba8
           <...>-37497 [001] .... 25597082.620159: 0:  secret_length:48
           <...>-37497 [001] .... 25597082.620160: 0: master_key: 62 e0 2b
           <...>-37497 [001] .... 25597082.620174: 0: client_version:771, state:18, tls13_state:0
           <...>-37497 [001] .... 25597082.620175: 0: TLS version :771, hash_len:0, 
           <...>-37497 [001] .... 25597082.620176: 0: SSL_HANDSHAKE_ALLBOOL:8520208, ssl_hs_st_addr:56077c9a9088
           <...>-37497 [001] .... 25597082.620177: 0: mastersecret->version :771, client_version:771, 
           <...>-37497 [001] .... 25597082.620178: 0: ssl_st->s3->hs->new_session is not null, address :56077e5c7ba8
           <...>-37497 [001] .... 25597082.620179: 0: s3_address:56077e5cc508, ssl_session_st_addr addr :56077e5c7ba8
           <...>-37497 [001] .... 25597082.620180: 0:  secret_length:48
           <...>-37497 [001] .... 25597082.620181: 0: master_key: 62 e0 2b
           <...>-37497 [001] .... 25597082.620191: 0: client_version:771, state:18, tls13_state:0
           <...>-37497 [001] .... 25597082.620192: 0: TLS version :771, hash_len:0, 
           <...>-37497 [001] .... 25597082.620193: 0: SSL_HANDSHAKE_ALLBOOL:8520208, ssl_hs_st_addr:56077c9a9088
           <...>-37497 [001] .... 25597082.620194: 0: mastersecret->version :771, client_version:771, 
           <...>-37497 [001] .... 25597082.620195: 0: ssl_st->s3->hs->new_session is not null, address :56077e5c7ba8
           <...>-37497 [001] .... 25597082.620196: 0: s3_address:56077e5cc508, ssl_session_st_addr addr :56077e5c7ba8
           <...>-37497 [001] .... 25597082.620197: 0:  secret_length:48
           <...>-37497 [001] .... 25597082.620198: 0: master_key: 62 e0 2b
           <...>-37497 [001] .... 25597082.620217: 0: client_version:771, state:18, tls13_state:0
           <...>-37497 [001] .... 25597082.620218: 0: TLS version :771, hash_len:0, 
           <...>-37497 [001] .... 25597082.620219: 0: SSL_HANDSHAKE_ALLBOOL:8520208, ssl_hs_st_addr:56077c9a9088
           <...>-37497 [001] .... 25597082.620220: 0: mastersecret->version :771, client_version:771, 
           <...>-37497 [001] .... 25597082.620221: 0: ssl_st->s3->hs->new_session is not null, address :56077e5c7ba8
           <...>-37497 [001] .... 25597082.620222: 0: s3_address:56077e5cc508, ssl_session_st_addr addr :56077e5c7ba8
           <...>-37497 [001] .... 25597082.620223: 0:  secret_length:48
           <...>-37497 [001] .... 25597082.620224: 0: master_key: 62 e0 2b

image

所以我这里有2个问题
1) 没有加-g的编译时,也就是没有带上调试信息时,能否也能让ecapture正常work?
2) boringssl 在main-with-bazel 这个分支时 state == 18时就可以正常工作了,这个如何修改适合普适的版本

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions