WebKit2GTK4修改SoupMessageHeaders致WebPageProcess崩溃问题
崩溃原因
核心问题有两个,均会直接触发Web进程段错误崩溃:
- 信号回调函数签名完全不匹配:
WebKitWebPage的send-request信号回调原型要求第三个参数是WebKitURIResponse**(二级指针,用于存储重定向响应对象),且必须预留第四个gpointer user_data参数位置。原有代码把第三个参数定义为WebKitURIResponse*实例指针,且没有留user_data参数位,C语言信号连接没有运行时参数类型校验,信号触发时参数压栈错位会直接破坏栈内存,后续所有栈上变量(包括拿到的http_headers指针)都会变成野指针,调用soup_message_headers_replace时自然会访问非法内存崩溃。 - Soup版本混链风险:当前主流发行版提供的
webkit2gtk-4.0依赖Soup 2,webkit2gtk-4.1依赖Soup 3,两个版本的SoupMessageHeaders结构体布局、接口ABI完全不兼容。如果编译时头文件引入和实际链接的WebKit依赖的Soup版本不一致,即使指针地址正确,调用接口时也会触发内存访问错误。
另外原有代码还有一个非崩溃类逻辑问题:用strncmp(type, "GET", 3)匹配请求方法,会误匹配GETH、GETPOST这类非标准方法,存在逻辑漏洞。
修复方案
按照以下步骤修改即可:
- 严格按照
send-request信号的官方原型修正回调函数签名 - 调用
soup_message_headers_replace前先校验http_headers指针非空 - 编译时确保链接的Soup版本和WebKit2GTK版本对应:使用
webkit2gtk-4.0时链接soup-2.4,使用webkit2gtk-4.1时链接soup-3.0 - 用
g_strcmp0做字符串比较,避免方法误匹配
修复后的完整代码如下:
#include <webkit2/webkit-web-extension.h> static gboolean set_http_headers(WebKitWebPage *page, WebKitURIRequest *req, WebKitURIResponse **redirected_res, gpointer user_data) { SoupMessageHeaders *http_headers = webkit_uri_request_get_http_headers(req); const gchar *type = webkit_uri_request_get_http_method(req); if (g_strcmp0(type, "GET") == 0 && http_headers != NULL) { soup_message_headers_replace(http_headers, "Accept-Encoding", "gzip, deflate, br"); soup_message_headers_replace(http_headers, "Accept-Language", "en-US,en;q=0.5"); } return FALSE; } static void wp_handle_cb(WebKitWebExtension *webext, WebKitWebPage *wp, gpointer dummy) { g_signal_connect_object(wp, "send-request", G_CALLBACK(set_http_headers), NULL, 0); } G_MODULE_EXPORT void webkit_web_extension_initialize(WebKitWebExtension *webext) { g_signal_connect(webext, "page-created", G_CALLBACK(wp_handle_cb), NULL); }
注意:如果是为Soup3版本编译,
brotli压缩编码默认已经被WebKit支持,不需要额外配置,设置该头不会引发功能异常。
内容的提问来源于stack exchange,提问作者Ömer Gök
相关产品推荐
相关产品推荐

