Closed
Description
kern/openssl.h
中有一段解析SSL*获取fd的代码,看起来一个是认为结构体大致以如下形式分布
struct ssl_st {
int version;
const SSL_METHOD *method;
BIO *rbio;
BIO *wbio;
BIO *bbio;
...
}
但是在openssl 3.2.0中,这个结构体直接大改,bio系列结构体都放进了一个ssl_connection_st
的结构体,原ssl_st变为
struct ssl_st {
int type;
SSL_CTX *ctx;
const SSL_METHOD *defltmeth;
const SSL_METHOD *method;
CRYPTO_REF_COUNT references;
CRYPTO_RWLOCK *lock;
/* extra application data */
CRYPTO_EX_DATA ex_data;
};
ssl_connection_st为
struct ssl_connection_st {
struct ssl_st ssl;
int version;
BIO *rbio;
BIO *wbio;
BIO *bbio;
...
}
在调用时ssl_st
使用宏SSL_CONNECTION_FROM_SSL
进行转换为ssl_connection_st
,因此对于新的openssl版本,需整体添加sizeof(struct ssl_st)+sizeof(int)
的偏移才能获取到rbio/wbio结构体
以及,在uprobe/SSL_write
中,读出ssl_wbio_addr
后,后续却是使用ssl_wbio_ptr
加上偏移去读取数据,是否有误?
ssl_wbio_ptr = (u64 *)(ssl + SSL_ST_WBIO);
ret = bpf_probe_read_user(&ssl_wbio_addr, sizeof(ssl_wbio_addr),
ssl_wbio_ptr);
if (ret) {
debug_bpf_printk(
"(OPENSSL) bpf_probe_read ssl_wbio_addr failed, ret :%d\n",
ret);
return 0;
}
// get fd ssl->wbio->num
ssl_wbio_num_ptr = (u64 *)(ssl_wbio_ptr + BIO_ST_NUM);
ret = bpf_probe_read_user(&ssl_wbio_num_addr, sizeof(ssl_wbio_num_addr),
ssl_wbio_num_ptr);
if (ret) {
debug_bpf_printk(
"(OPENSSL) bpf_probe_read ssl_wbio_num_ptr failed, ret :%d\n",
ret);
return 0;
}