1

eCapture v0.7.3新版性能提升10倍,支持OpenSSL 3.2

 7 months ago
source link: https://www.cnxct.com/ecapture-v0-7-3/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

eCapture是什么

eCapture旁观者一个无需CA证书,无侵入的HTTPS/TLS明文抓包工具。可以在Linux 4.18以上版本使用,同时也支持Android arm64 5.5以上版本。

记得8月份时,在GitHub万星项目进度70%,eCapture旁观者7K Stars达成一文中吹牛说到,年底冲1万颗星,奈何平时工作特别忙,根本没时间堆新功能,年底一看,果然打脸了,只有7.8K星,

ecapture-7.8k.jpeg

不过,笔者也一直忙里偷闲地回复社区的问题,不停地修复程序bug。

这不,有几个小朋友给我提出了新的挑战,在生产环境,上万QPS的7层负载均衡,启用eCapture,会有什么样的结果?性能扛得住吗?

性能提升10倍

有用户在社区反馈eCapture性能问题TLS 模式下,对被检测程序的性能影响,执行一千万次SSL_write写数据的场景,不开启eCapture耗时6秒,而开启eCapture后却要30秒,性能耗时增大5倍以上。

ecapture-30-5s.png

这个数字就很尴尬,就在你潇洒的这两天,笔者全身心投入,用爱发电,翻阅OpenSSL源码,终于有了很大的进展。

进步大源于起点底

笔者分析了OpenSSL类库中,以ServerClient两种模式,分别选择合适的HOOK函数,减少SSL_writeSSL_read两个函数高频调用下的触发机制,最终把耗时从30秒降低到7秒。整体来看,进步特别大。但原来确实有偷懒,直接用了SSL_write函数。

ecapture-7s-5s.png

又有小朋友在社区提了issue:The SSL structure in openssl 3.2.0 has been modified,里面提到OpenSSL 3.2.0已发布了,而且核心ssl_st结构体发生很大变化,eCaptuer捕获TLS通讯密钥的功能无法使用。

openssl-3.2.0.png

笔者确认了一下,OpenSSL 3.2.0是2023年11月底发布的,至今不过2个月时间,应该还没有多少大型应用使用,不过,笔者就是喜欢宠粉,立马给安排了。谁让这位小朋友的issue写得漂亮呢。

issue-464.png

无CA捕获TLS明文软件eCapture v0.7.3版发布,性能提升10倍,千万次调用增加2秒,支持openssl 3.2。

ecapture-v0.7.3-release.png

Warning

以下为技术原理,可以不用看。

  • 为了读取到TLS握手完成后的client_random等密钥,必需要选择一个合适的HOOK函数。
  • SSL_write\SSL_read时,TLS握手是建立完成的,但调用过于频繁,会带来性能问题,参见 #463
  • 综合来看,合适的HOOK函数需要满足以下几个条件:
    1. 函数是在TLS握手完成后调用
    2. 函数名在动态链接库的符号表中是导出状态
    3. 函数是低频调用
  • 在 openssl 类库中,以客户端角色调用 SSL_connect 或者以服务端角色 SSL_accept ,最终都会进入 ssl/statem/statem.cstate_machine 函数进行TLS握手。
  • 所以,可选范围是在这个函数内以大写SSL开头的函数。
  • 当使用openssl的方式为同步调用时,TLS握手成功会返回1,也就是ret = 1,即需要在这个变量赋值后,被调用的函数,才能拿到符合要求的内存数据。 state_machine函数内符合要求的就只有SSL_get_wbio了。
  • 当使用openssl的方式为异步 (BIO)调用时,还需要增加SSL_in_before函数。
masterKeyHookFuncs = []string{
        "SSL_get_wbio", // openssl client mode
        //"SSL_is_init",  // boringssl client mode
        // 备用HOOK 函数
        //"SSL_is_init_finished",
        "SSL_in_before", //openssl client mode
        "SSL_do_handshake",   // openssl server mode
    }

OpenSSL 3.2.0

无它,翻阅OpenSSL源码,分析差异,重新实现密钥提取代码,详情见 PR 472 。不过,新版里新增了对QUIC TLS的支持,eCapture暂时没支持,预计春节后安排。

// TODO 检查 ssl->type, 参考 ssl/ssl_local.h的 SSL_CONNECTION_FROM_SSL_int 宏
    int type;
    if (type == SSL_TYPE_QUIC_CONNECTION) {
        // Reget the address of the ssl->tls as the address of the SSL_CONNECTION
        debug_bpf_printk("unsupported type: SSL_CONNECTION, coming soon.\n");
        return 0;
    }

届时,eCapture就可以无需CA证书,即可捕获QUIC TLS的明文内容了,敬请期待。

红包封面预告

即将春节,送给大家一些手绘的红包封面,依旧由去年红包封面《烤火兔》的设计大师,外甥女S负责。

本次春节红包封面《龙"码"精神》,依旧没有任何广告、品牌标识。仿版画风格,材质感更重。

立寒冬,暖阳待雪,龙码精神!这款红包风格采用木质版画风格,五行之中黑色对应水,遇水则发~黑龙俯卧在金灿灿的摇钱树给大家送福啦!

2024-wechat-redpacket.jpg

CFC4N的博客 由 CFC4N 创作,采用 知识共享 署名-非商业性使用-相同方式共享(3.0未本地化版本)许可协议进行许可。基于https://www.cnxct.com上的作品创作。转载请注明转自:eCapture v0.7.3新版性能提升10倍,支持OpenSSL 3.2


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK