基于检索的语音转换 WebUI 中存在多个漏洞
总结
Retrieval-based-Voice-Conversion-WebUI 容易受到命令行注入的攻击
项目
基于检索的语音转换 WebUI
问题 1:infer-web.py 中的命令注入preprocess_dataset
(GHSL-2025-012
)
变量 、 和 获取用户输入并将其传递给函数,该函数将它们连接成在服务器上运行的命令。这可能导致任意命令执行。exp_dir1
np7
trainset_dir4
sr2
preprocess_dataset
def preprocess_dataset(trainset_dir, exp_dir, sr, n_p):
sr = sr_dict[sr]
os.makedirs("%s/logs/%s" % (now_dir, exp_dir), exist_ok=True)
f = open("%s/logs/%s/preprocess.log" % (now_dir, exp_dir), "w")
f.close()
cmd = '"%s" infer/modules/train/preprocess.py "%s" %s %s "%s/logs/%s" %s %.1f' % (
config.python_cmd,
trainset_dir,
sr,
n_p,
now_dir,
exp_dir,
config.noparallel,
config.preprocess_per,
)
冲击
此问题可能会导致任意命令执行。
CWEs
- CWE-77:命令中使用的特殊元素的不当中和(“命令注入”)
问题 2:infer-web.py 中的命令注入extract_f0_feature
(GHSL-2025-013
)
变量 ,并获取用户输入并将其传递给函数,函数将它们连接成在服务器上运行的命令。这可能导致任意命令执行。请注意,这些命令在函数中多次运行,并且必须修复所有这些命令以防止命令行注入:exp_dir1
np7
f0method8
extract_f0_feature
extract_f0_feature
- https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/7ef19867780cf703841ebafb565a4e47d1ea86ff/infer-web.py#L276-L278
- https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/7ef19867780cf703841ebafb565a4e47d1ea86ff/infer-web.py#L307-L309
- https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/7ef19867780cf703841ebafb565a4e47d1ea86ff/infer-web.py#L330-L332
- https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/7ef19867780cf703841ebafb565a4e47d1ea86ff/infer-web.py#L373-L375
def extract_f0_feature(gpus, n_p, f0method, if_f0, exp_dir, version19, gpus_rmvpe): gpus = gpus.split("-") os.makedirs("%s/logs/%s" % (now_dir, exp_dir), exist_ok=True) f = open("%s/logs/%s/extract_f0_feature.log" % (now_dir, exp_dir), "w") f.close() if if_f0: if f0method != "rmvpe_gpu": cmd = ( '"%s" infer/modules/train/extract/extract_f0_print.py "%s/logs/%s" %s %s' % ( config.python_cmd, now_dir, exp_dir, n_p, f0method, ) ) logger.info("Execute: " + cmd) p = Popen( cmd, shell=True, cwd=now_dir ) # , stdin=PIPE, stdout=PIPE,stderr=PIPE
冲击
此问题可能会导致任意命令执行。
CWEs
- CWE-77:命令中使用的特殊元素的不当中和(“命令注入”)
问题 3:infer-web.py 中的命令注入click_train
(GHSL-2025-014
)
变量 ,除其他外,获取用户输入并将其传递给函数,函数将它们连接成在服务器上运行的 here 和 here 命令。这可能导致任意命令执行。exp_dir1
click_train
if gpus16:
cmd = (
'"%s" infer/modules/train/train.py -e "%s" -sr %s -f0 %s -bs %s -g %s -te %s -se %s %s %s -l %s -c %s -sw %s -v %s'
% (
config.python_cmd,
exp_dir1,
sr2,
1 if if_f0_3 else 0,
batch_size12,
gpus16,
total_epoch11,
save_epoch10,
"-pg %s" % pretrained_G14 if pretrained_G14 != "" else "",
"-pd %s" % pretrained_D15 if pretrained_D15 != "" else "",
1 if if_save_latest13 == i18n("是") else 0,
1 if if_cache_gpu17 == i18n("是") else 0,
1 if if_save_every_weights18 == i18n("是") else 0,
version19,
)
)
else:
cmd = (
'"%s" infer/modules/train/train.py -e "%s" -sr %s -f0 %s -bs %s -te %s -se %s %s %s -l %s -c %s -sw %s -v %s'
% (
config.python_cmd,
exp_dir1,
sr2,
1 if if_f0_3 else 0,
batch_size12,
total_epoch11,
save_epoch10,
"-pg %s" % pretrained_G14 if pretrained_G14 != "" else "",
"-pd %s" % pretrained_D15 if pretrained_D15 != "" else "",
1 if if_save_latest13 == i18n("是") else 0,
1 if if_cache_gpu17 == i18n("是") else 0,
1 if if_save_every_weights18 == i18n("是") else 0,
version19,
)
)
logger.info("Execute: " + cmd)
p = Popen(cmd, shell=True, cwd=now_dir)
冲击
此问题可能会导致任意命令执行。
CWEs
- CWE-77:命令中使用的特殊元素的不当中和(“命令注入”)
问题 4:infer-web.py 中的代码注入change_info_
(GHSL-2025-015
)
该变量接受用户输入(例如模型的路径)并将其传递给 function,函数打开并读取给定路径上的文件(除了它将路径上的 final 更改为 ),并将文件的内容传递给 eval,这可能导致远程代码执行。ckpt_path2
change_info_
train.log
def change_info_(ckpt_path):
if not os.path.exists(ckpt_path.replace(os.path.basename(ckpt_path), "train.log")):
return {"__type__": "update"}, {"__type__": "update"}, {"__type__": "update"}
try:
with open(
ckpt_path.replace(os.path.basename(ckpt_path), "train.log"), "r"
) as f:
info = eval(f.read().strip("\n").split("\n")[0].split("\t")[-1])
冲击
This issue may lead to .remote code execution
CWEs
- CWE-94: Improper Control of Generation of Code (‘Code Injection’)
Issue 5: unsafe deserialization in process_ckpt.py function (show_info
GHSL-2025-016
)
The variable takes user input (e.g. a path to a model) and passes it to the function in , which uses it to load the model on that path with torch.load, which can lead to unsafe deserialization.ckpt_path1
show_info
process_ckpt.py
def show_info(path):
try:
a = torch.load(path, map_location="cpu")
冲击
此问题可能导致远程代码执行。
CWEs
- CWE-502:不受信任数据的反序列化
Issue 6:process_ckpt.py 函数中不安全的反序列化 (extract_small_model
GHSL-2025-017
)
该变量接受用户输入(例如模型的路径)并将其传递给 中的函数,该函数使用它通过 torch.load 在该路径上加载模型,这可能导致不安全的反序列化。ckpt_path2
extract_small_model
process_ckpt.py
def extract_small_model(path, name, sr, if_f0, info, version):
try:
ckpt = torch.load(path, map_location="cpu")
冲击
此问题可能导致远程代码执行。
CWEs
- CWE-502:不受信任数据的反序列化
问题 7:process_ckpt.py 函数中不安全的反序列化 (change_info
GHSL-2025-018
)
该变量接受用户输入(例如模型的路径)并将其传递给 中的函数,该函数使用它通过 torch.load 在该路径上加载模型,这可能导致不安全的反序列化。ckpt_path0
change_info
process_ckpt.py
def change_info(path, info, name):
try:
ckpt = torch.load(path, map_location="cpu")
冲击
此问题可能导致远程代码执行。
CWEs
- CWE-502:不受信任数据的反序列化
Issue 8:process_ckpt.py 函数 (merge
GHSL-2025-019
)
and 变量在这里和这里获取用户输入(例如模型的路径)并将其传递给 中的函数,该函数使用它们通过 torch.load 在这些路径上加载模型,这可能会导致不安全的反序列化。ckpt_a
cpkt_b
merge
process_ckpt.py
def merge(path1, path2, alpha1, sr, f0, info, name, version):
try:
def extract(ckpt):
a = ckpt["model"]
opt = OrderedDict()
opt["weight"] = {}
for key in a.keys():
if "enc_q" in key:
continue
opt["weight"][key] = a[key]
return opt
ckpt1 = torch.load(path1, map_location="cpu")
ckpt2 = torch.load(path2, map_location="cpu")
冲击
此问题可能导致远程代码执行。
CWEs
- CWE-502:不受信任数据的反序列化
问题 9:export.py 中的不安全反序列化 (GHSL-2025-020
)
该变量接受用户输入(例如模型的路径)并将其传递给 中的函数,该函数使用它通过 torch.load 在该路径上加载模型,这可能导致不安全的反序列化。ckpt_dir
change_info
export.py
def export_onnx(ModelPath, ExportedPath):
cpt = torch.load(ModelPath, map_location="cpu")
冲击
此问题可能导致远程代码执行。
CWEs
- CWE-502:不受信任数据的反序列化
Issue 10: vr.py 中的不安全反序列化AudioPre
(GHSL-2025-021
)
该变量接受用户输入(例如模型的路径)并将其传递给 中的函数。在 中,使用 包含 aformentioned 用户输入的属性(此处称为 local )创建 class 的新实例。请注意,在此步骤中,已将扩展添加到路径中。model_choose
uvr
vr.py
uvr
AudioPre
model_path
model_name
.pth
在该类中,用户输入(此处称为 )用于使用 torch.load 在该路径上加载模型,这可能导致不安全的反序列化。AudioPre
model_path
class AudioPre:
def __init__(self, agg, model_path, device, is_half, tta=False):
self.model_path = model_path
self.device = device
self.data = {
# Processing Options
"postprocess": False,
"tta": tta,
# Constants
"window_size": 512,
"agg": agg,
"high_end_process": "mirroring",
}
mp = ModelParameters("infer/lib/uvr5_pack/lib_v5/modelparams/4band_v2.json")
model = Nets.CascadedASPPNet(mp.param["bins"] * 2)
cpk = torch.load(model_path, map_location="cpu")
冲击
此问题可能导致远程代码执行。
CWEs
- CWE-502:不受信任数据的反序列化
Issue 11: vr.py 中的不安全反序列化AudioPreDeEcho
(GHSL-2025-022
)
该变量接受用户输入(例如模型的路径)并将其传递给 中的函数。在 中,如果包含字符串 ,则使用包含上述用户输入的属性(此处称为 local )创建 class 的新实例。请注意,在此步骤中,已将扩展添加到路径中。model_choose
uvr
vr.py
uvr
model_name
"DeEcho"
AudioPreDeEcho
model_path
model_name
.pth
在该类中,用户输入(此处称为 )用于使用 torch.load 在该路径上加载模型,这可能导致不安全的反序列化。AudioPreDeEcho
model_path
class AudioPreDeEcho:
def __init__(self, agg, model_path, device, is_half, tta=False):
self.model_path = model_path
self.device = device
self.data = {
# Processing Options
"postprocess": False,
"tta": tta,
# Constants
"window_size": 512,
"agg": agg,
"high_end_process": "mirroring",
}
mp = ModelParameters("infer/lib/uvr5_pack/lib_v5/modelparams/4band_v3.json")
nout = 64 if "DeReverb" in model_path else 48
model = CascadedNet(mp.param["bins"] * 2, nout)
cpk = torch.load(model_path, map_location="cpu")
冲击
此问题可能导致远程代码执行。