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以下版本存在两个严重漏洞:
- CVE-2022-40309 - 任意目录删除漏洞
- CVE-2022-40308 - 任意文件读取漏洞
这两个漏洞的共同点是都利用了目录穿越技术,通过在路径中注入../等目录穿越符,绕过系统限制访问或删除非授权目录。
影响范围
- Apache Archiva < 2.2.9
环境搭建
-
下载受影响版本:
https://archive.apache.org/dist/archiva/2.2.8/binaries/apache-archiva-2.2.8-bin.zip -
启动方式:
- Linux:
./bin/archiva console - Windows:
.\bin\archiva.bat console
- Linux:
-
调试配置(可选):
在conf/wrapper.conf中添加:wrapper.java.additional.9=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -
首次运行需要添加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请求:
DELETE /restServices/archivaServices/repositoriesService/project/internal/com.test/test%2f..%2f..%2f..%2f..%2f..%2fdata- 这将删除Archiva根目录下的
data目录 %2f是/的URL编码
- 这将删除Archiva根目录下的
漏洞分析
漏洞入口:
@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;
关键点:
- 权限检查
isAuthorizedToDeleteArtifacts()确保用户有archiva-delete-artifact权限 - 直接拼接目录名进行删除操作,未对
projectId进行路径规范化检查
漏洞修复:
- 对输入路径进行规范化处理,防止目录穿越
CVE-2022-40308 - 任意文件读取漏洞
漏洞复现步骤
前置条件:
- 启用匿名读取或使用拥有
archiva-read-repository权限的用户
复现步骤:
- 在下载界面抓包
- 修改URL为:
/repository/internal/..//../data/databases/users/log/log1.dat- 这将读取Archiva根目录下的
data/databases/users/log/log1.dat文件 - 该文件包含系统用户账号及加密后的密码
- 这将读取Archiva根目录下的
注意:
- 目录穿越符
..//..必须使用两个及以上数量的/ - 单斜杠形式
/repository/internal/../../data/...会被Jetty识别为/data/...而绕过
漏洞分析
入口:
<servlet-mapping>
<servlet-name>RepositoryServlet</servlet-name>
<url-pattern>/repository/*</url-pattern>
</servlet-mapping>
关键点:
- 请求由
RepositoryServlet处理 - 鉴权通过后,直接将包含目录穿越的路径拼接到
new File()参数中 - 未对文件名进行规范化验证
漏洞修复:
- 对输入路径进行规范化处理,防止目录穿越
修复方案
官方修复提交:
- CVE-2022-40309:
https://github.com/apache/archiva/commit/930460424c715f52a7cb5eef5b084a7a8ef31fb5 - CVE-2022-40308:
https://github.com/apache/archiva/commit/4a2d43be63634331668d71590034963e96a8886a
修复方式主要是对路径输入进行规范化验证,防止目录穿越。
总结
这两个漏洞都是由于路径验证不足导致的目录穿越问题,攻击者可以利用这些漏洞:
- 删除服务器上的任意目录(CVE-2022-40309)
- 读取服务器上的任意文件(CVE-2022-40308)
防护建议:
- 升级到Apache Archiva 2.2.9或更高版本
- 严格控制用户权限,特别是
archiva-delete-artifact和archiva-read-repository权限 - 对所有用户输入进行严格的验证和规范化处理