eCapture是什么

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

年底打脸

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

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

增加难度

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

性能提升10倍

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

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

进步大源于起点底

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

继续宠粉

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

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

新版下载

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

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负责。

今年封面

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

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

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