如何消除jetty-websocket的CVE-2017-7657/CVE-2017-7658高危漏洞?
修复Jetty WebSocket高危漏洞及类替换方案
核心思路:升级到Jetty 9.x系列的WebSocket实现
Jetty 8.x属于停止维护的老旧版本,官方未修复该批次漏洞,必须迁移到Jetty 9.3+版本的WebSocket组件——该版本已彻底修复CVE-2017-7657和CVE-2017-7658。Jetty 9.x对WebSocket模块做了拆分重构,需要同步替换依赖包和调整导入类。
1. 替换项目依赖
Maven项目操作
移除原Jetty 8.x的WebSocket依赖,添加Jetty 9.3.24.v20180605对应的组件:
<!-- 移除旧版依赖 --> <!-- <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-websocket</artifactId> <version>8.1.1.v20120215</version> </dependency> --> <!-- 新增Jetty 9.3.x WebSocket核心依赖 --> <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>websocket-server</artifactId> <version>9.3.24.v20180605</version> </dependency> <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>websocket-client</artifactId> <version>9.3.24.v20180605</version> </dependency>
Gradle项目操作
// 移除旧版依赖 // compile 'org.eclipse.jetty:jetty-websocket:8.1.1.v20120215' // 新增Jetty 9.3.x WebSocket核心依赖 compile 'org.eclipse.jetty.websocket:websocket-server:9.3.24.v20180605' compile 'org.eclipse.jetty.websocket:websocket-client:9.3.24.v20180605'
2. 替换导入类及代码适配
Jetty 9.x的WebSocket API与8.x差异较大,核心类的包路径和调用逻辑有明显变化,以下是常见类的替换映射:
| 旧Jetty 8.x导入类 | 新Jetty 9.x对应类 |
|---|---|
org.eclipse.jetty.websocket.WebSocket | org.eclipse.jetty.websocket.api.WebSocketAdapter 或 org.eclipse.jetty.websocket.api.WebSocketListener |
org.eclipse.jetty.websocket.WebSocket.Connection | org.eclipse.jetty.websocket.api.Session |
org.eclipse.jetty.websocket.WebSocket.OnTextMessage | 实现WebSocketListener的onWebSocketText方法,或继承WebSocketAdapter重写该方法 |
org.eclipse.jetty.websocket.WebSocket.OnBinaryMessage | 实现WebSocketListener的onWebSocketBinary方法,或继承WebSocketAdapter重写该方法 |
org.eclipse.jetty.websocket.server.WebSocketHandler | org.eclipse.jetty.websocket.server.WebSocketHandler(包路径不变,但内部API逻辑调整) |
代码调整示例
原Jetty 8.x代码:
import org.eclipse.jetty.websocket.WebSocket; import org.eclipse.jetty.websocket.WebSocket.Connection; public class MyWebSocket implements WebSocket.OnTextMessage { private Connection connection; @Override public void onOpen(Connection connection) { this.connection = connection; } @Override public void onMessage(String data) { connection.sendMessage("Received: " + data); } @Override public void onClose(int closeCode, String message) { // 关闭逻辑 } }
替换为Jetty 9.x代码:
import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.WebSocketAdapter; public class MyWebSocket extends WebSocketAdapter { @Override public void onWebSocketText(String data) { Session session = getSession(); if (session.isOpen()) { session.getRemote().sendString("Received: " + data); } } @Override public void onWebSocketClose(int statusCode, String reason) { super.onWebSocketClose(statusCode, reason); // 关闭逻辑 } }
3. 适配Guacamole项目的WebSocket集成
针对guacamole-client项目,需要额外做以下检查:
- 确认自定义WebSocket处理器全部完成API替换
- 验证Guacamole核心WebSocket组件(如
GuacamoleWebSocketTunnelEndpoint)的兼容性,若存在冲突需同步调整其导入和调用逻辑 - 运行单元测试和集成测试,确保WebSocket隧道的连接、数据传输等核心功能正常
4. 漏洞修复验证
完成所有调整后:
- 重新运行安全检测工具,确认CVE-2017-7657和CVE-2017-7658漏洞已消除
- 手动覆盖WebSocket连接的各类场景,确保无功能回归
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

