Apache Archiva 任意目录删除(CVE-2022-40309) 和 任意文件读取(CVE-2022-40308)
字数 1600 2025-08-26 22:12:02

Apache Archiva 目录穿越漏洞分析 (CVE-2022-40309 & CVE-2022-40308)

漏洞概述

Apache Archiva 是一个存储库管理软件,2.2.9以下版本存在两个严重漏洞:

  1. CVE-2022-40309 - 任意目录删除漏洞
  2. CVE-2022-40308 - 任意文件读取漏洞

这两个漏洞的共同点是都利用了目录穿越技术,通过在路径中注入../等目录穿越符,绕过系统限制访问或删除非授权目录。

影响范围

  • Apache Archiva < 2.2.9

环境搭建

  1. 下载受影响版本:

    https://archive.apache.org/dist/archiva/2.2.8/binaries/apache-archiva-2.2.8-bin.zip
    
  2. 启动方式:

    • Linux: ./bin/archiva console
    • Windows: .\bin\archiva.bat console
  3. 调试配置(可选):
    conf/wrapper.conf中添加:

    wrapper.java.additional.9=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
    
  4. 首次运行需要添加Admin用户:
    访问http://127.0.0.1:8080/#open-admin-create-box,创建用户时需勾选Validated复选框。

CVE-2022-40309 - 任意目录删除漏洞

漏洞复现步骤

  1. 使用拥有archiva-delete-artifact权限的账号登录(系统管理员或Repository Manager - internal角色)

  2. 上传一个Artifact到Archiva Managed Internal Repository:

    • 文件会存储在repositories/internal/com/test/test/1.0/test-1.0.jar
  3. /#browse页面点进group然后删除project时抓包

  4. 构造恶意DELETE请求:

    DELETE /restServices/archivaServices/repositoriesService/project/internal/com.test/test%2f..%2f..%2f..%2f..%2f..%2fdata
    
    • 这将删除Archiva根目录下的data目录
    • %2f/的URL编码

漏洞分析

漏洞入口:

@Path("project/{repositoryId}/{groupId}/{projectId}")
@DELETE
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN})
@RedbackAuthorization(noPermission = true)
Boolean deleteProject(@PathParam("groupId") String groupId, 
                     @PathParam("projectId") String projectId,
                     @PathParam("repositoryId") String repositoryId) 
    throws ArchivaRestServiceException;

关键点:

  1. 权限检查isAuthorizedToDeleteArtifacts()确保用户有archiva-delete-artifact权限
  2. 直接拼接目录名进行删除操作,未对projectId进行路径规范化检查

漏洞修复:

  • 对输入路径进行规范化处理,防止目录穿越

CVE-2022-40308 - 任意文件读取漏洞

漏洞复现步骤

前置条件:

  • 启用匿名读取或使用拥有archiva-read-repository权限的用户

复现步骤:

  1. 在下载界面抓包
  2. 修改URL为:
    /repository/internal/..//../data/databases/users/log/log1.dat
    
    • 这将读取Archiva根目录下的data/databases/users/log/log1.dat文件
    • 该文件包含系统用户账号及加密后的密码

注意:

  • 目录穿越符..//..必须使用两个及以上数量的/
  • 单斜杠形式/repository/internal/../../data/...会被Jetty识别为/data/...而绕过

漏洞分析

入口:

<servlet-mapping>
    <servlet-name>RepositoryServlet</servlet-name>
    <url-pattern>/repository/*</url-pattern>
</servlet-mapping>

关键点:

  1. 请求由RepositoryServlet处理
  2. 鉴权通过后,直接将包含目录穿越的路径拼接到new File()参数中
  3. 未对文件名进行规范化验证

漏洞修复:

  • 对输入路径进行规范化处理,防止目录穿越

修复方案

官方修复提交:

  1. CVE-2022-40309:
    https://github.com/apache/archiva/commit/930460424c715f52a7cb5eef5b084a7a8ef31fb5
    
  2. CVE-2022-40308:
    https://github.com/apache/archiva/commit/4a2d43be63634331668d71590034963e96a8886a
    

修复方式主要是对路径输入进行规范化验证,防止目录穿越。

总结

这两个漏洞都是由于路径验证不足导致的目录穿越问题,攻击者可以利用这些漏洞:

  1. 删除服务器上的任意目录(CVE-2022-40309)
  2. 读取服务器上的任意文件(CVE-2022-40308)

防护建议:

  1. 升级到Apache Archiva 2.2.9或更高版本
  2. 严格控制用户权限,特别是archiva-delete-artifactarchiva-read-repository权限
  3. 对所有用户输入进行严格的验证和规范化处理
Apache Archiva 目录穿越漏洞分析 (CVE-2022-40309 & CVE-2022-40308) 漏洞概述 Apache Archiva 是一个存储库管理软件,2.2.9以下版本存在两个严重漏洞: CVE-2022-40309 - 任意目录删除漏洞 CVE-2022-40308 - 任意文件读取漏洞 这两个漏洞的共同点是都利用了目录穿越技术,通过在路径中注入 ../ 等目录穿越符,绕过系统限制访问或删除非授权目录。 影响范围 Apache Archiva < 2.2.9 环境搭建 下载受影响版本: 启动方式: Linux: ./bin/archiva console Windows: .\bin\archiva.bat console 调试配置(可选): 在 conf/wrapper.conf 中添加: 首次运行需要添加Admin用户: 访问 http://127.0.0.1:8080/#open-admin-create-box ,创建用户时需勾选 Validated 复选框。 CVE-2022-40309 - 任意目录删除漏洞 漏洞复现步骤 使用拥有 archiva-delete-artifact 权限的账号登录(系统管理员或Repository Manager - internal角色) 上传一个Artifact到Archiva Managed Internal Repository: 文件会存储在 repositories/internal/com/test/test/1.0/test-1.0.jar 在 /#browse 页面点进group然后删除project时抓包 构造恶意DELETE请求: 这将删除Archiva根目录下的 data 目录 %2f 是 / 的URL编码 漏洞分析 漏洞入口: 关键点: 权限检查 isAuthorizedToDeleteArtifacts() 确保用户有 archiva-delete-artifact 权限 直接拼接目录名进行删除操作,未对 projectId 进行路径规范化检查 漏洞修复: 对输入路径进行规范化处理,防止目录穿越 CVE-2022-40308 - 任意文件读取漏洞 漏洞复现步骤 前置条件: 启用匿名读取或使用拥有 archiva-read-repository 权限的用户 复现步骤: 在下载界面抓包 修改URL为: 这将读取Archiva根目录下的 data/databases/users/log/log1.dat 文件 该文件包含系统用户账号及加密后的密码 注意: 目录穿越符 ..//.. 必须使用两个及以上数量的 / 单斜杠形式 /repository/internal/../../data/... 会被Jetty识别为 /data/... 而绕过 漏洞分析 入口: 关键点: 请求由 RepositoryServlet 处理 鉴权通过后,直接将包含目录穿越的路径拼接到 new File() 参数中 未对文件名进行规范化验证 漏洞修复: 对输入路径进行规范化处理,防止目录穿越 修复方案 官方修复提交: CVE-2022-40309: CVE-2022-40308: 修复方式主要是对路径输入进行规范化验证,防止目录穿越。 总结 这两个漏洞都是由于路径验证不足导致的目录穿越问题,攻击者可以利用这些漏洞: 删除服务器上的任意目录(CVE-2022-40309) 读取服务器上的任意文件(CVE-2022-40308) 防护建议: 升级到Apache Archiva 2.2.9或更高版本 严格控制用户权限,特别是 archiva-delete-artifact 和 archiva-read-repository 权限 对所有用户输入进行严格的验证和规范化处理