# 漏洞简述
OneDev 是开源的一体化轻量DevOps平台,在OneDev 7.4.14及以前版本中存在路径遍历漏洞,具有项目管理权限的攻击者可以将恶意 jar 文件上传到 lib 目录,覆盖原有jar包,攻击者可利用此漏洞在服务器中写入任意文件或远程执行恶意代码。
- 漏洞CVSS评分:8.8(高危)
- 受影响组件版本范围:Onedev <= v7.4.14
# 漏洞分析
# 问题代码分析
项目管理员可以在 OneDev 的build
模块对自己的一个项目进行构建,同时在build
模块中提供了手动上传Artifacts
功能。
以v7.4.14为例,当用户点击上传后会调用ArtifactUploadPanel.java
中的onSubmit
函数将该用户选择的自定义文件上传到服务器,其中如果用户自定义了Directory
, filePath
将会采用字符串拼接的方式将用户自定义的目录名和文件名进行组合,导致攻击者可以上传文件至任意路径。
# 上传 Artifacts 流程验证
在上传
Artifacts
时任意选择一张图片进行上传,Directory
可以自定义,这里先留空。上传时如果自定义目录名为空,则默认上传到后台的项目对应的
artifacts
目录:
# 漏洞复现
创建一个新项目并进行构建(
build
)系统
build
功能代码对应为io.onedev.server-plugin-executor-serverdocker-7.4.14.jar
中的ServerDockerExecutor
类。如果攻击者能将其替换为自己定义的恶意jar包,将会远程执行攻击者可控的代码。因此攻击者可以制作一个恶意的jar包,将其命名为“io.onedev.server-plugin-executor-serverdocker-7.4.14.jar”,然后通过构建恶意路径(
../../../../../../lib
)上传到服务的lib目录(如/opt/onedev/lib),原有的同名jar包将被替换。此时进入oneDev服务器“/opt/onedev/lib”目录进行查看,发现原来的“io.onedev.server-plugin-executor-serverdocker-7.4.14.jar”已经替换成攻击者上传的jar包。
由于执行
build
功能的 jar 包已被替换,重启服务后重新进行build,发现恶意代码被执行:
# 针对路径遍历漏洞对开发者的建议
- 避免在调用文件系统 API 时直接传递用户输入数据
- 对用户提交的文件名进行归一化,并检查该文件名是否包含路径遍历序列如“..”、“/”、" "
- 将用户上传内容限定至特定的上传路径
- 针对文件访问的功能应使用一个硬编码的白名单列表,拒绝任何访问其他文件类型的请求
下图为 onedev v7.4.15针对路径遍历漏洞的修复代码:
# 对用户的修复建议
将 Onedev 升级至 7.4.15 及更高版本