Skip to content

Commit d5b730e

Browse files
shuaijiemax-lvs
authored andcommitted
fix: 命令注入漏洞安全
命令注入漏洞安全 Log: 命令注入漏洞安全 Bug: https://pms.uniontech.com/bug-view-269973.html
1 parent eb60582 commit d5b730e

4 files changed

Lines changed: 51 additions & 26 deletions

File tree

deepin-devicemanager-server/deepin-devicecontrol/src/drivercontrol/drivermanager.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -373,25 +373,23 @@ bool DriverManager::isSigned(const QString &filepath)
373373
return true;
374374
}
375375

376-
QProcess process;
377-
QStringList options;
378-
QString strSignTool;
376+
QStringList arguments;
377+
QString program;
379378
QString strSignCheckString;
380379

381380
if (filepath.contains("deb")) {
382-
strSignTool = "deepin-deb-verify ";
381+
program = "deepin-deb-verify";
382+
arguments << filepath;
383383
strSignCheckString = "signature verified";
384384
} else {
385-
strSignTool = "deepin-elf-sign -f ";
385+
program = "deepin-elf-sign";
386+
arguments << "-f" << filepath;
386387
strSignCheckString = "Verified successfully";
387388
}
388-
options << "-c" << strSignTool + filepath;
389-
390-
process.start("/bin/bash", options);
391-
process.waitForFinished(-1);
392389

393-
QString str = process.readAll();
394-
return str.contains(strSignCheckString);
390+
QString outInfo;
391+
bool ret = Utils::runCmdSafeWithArgs(outInfo, program, arguments, -1);
392+
return (ret && outInfo.contains(strSignCheckString));
395393
}
396394
bool DriverManager::isArchMatched(const QString &path)
397395
{

deepin-devicemanager-server/deepin-devicecontrol/src/drivercontrol/httpdriverinterface.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,15 @@ bool HttpDriverInterface::checkDriverInfo(QString strJson, DriverInfo &driverInf
188188
bool HttpDriverInterface::isPkgInstalled(QString strPkgName, QString strVersion)
189189
{
190190
//调用apt命令查看包是否安装。
191-
QProcess process;
192-
QStringList options;
193-
options << "-c" << "apt policy " + strPkgName;
194-
process.start("/bin/bash", options);
195-
process.waitForFinished(-1);
196-
QStringList infoList = QString(process.readAllStandardOutput()).split("\n");
191+
QStringList arguments;
192+
QString program;
193+
arguments << "policy" << strPkgName;
194+
program = "apt";
195+
QString outInfo;
196+
bool ret = Utils::runCmdSafeWithArgs(outInfo, program, arguments, -1);
197+
if(!ret)
198+
return false;
199+
QStringList infoList = outInfo.split("\n");
197200

198201
if (infoList.size() > 2 && infoList[1].contains(strVersion)) {
199202
return true;

deepin-devicemanager-server/deepin-devicecontrol/src/drivercontrol/utils.cpp

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -109,19 +109,29 @@ bool Utils::isDriverPackage(const QString &filepath)
109109
if (tmpDir.mkdir(tmpPath)) {
110110
tmpDir.cd(tmpPath);
111111
QString strExtract = tmpDir.absolutePath();
112-
QProcess process;
113-
process.start("sh", QStringList() << "-c" << QString("dpkg-deb -x '%1' %2").arg(filepath).arg(strExtract));
114-
if (process.waitForFinished()) {
112+
QStringList arguments;
113+
arguments << QString("-x") << filepath << strExtract;
114+
QString program = QString("dpkg-deb");
115+
QString outInfo;
116+
bool ret = runCmdSafeWithArgs(outInfo, program, arguments);
117+
if (ret) {
115118
// 2021-12-24 liujuna@uniontech.com 修改过滤规则
116119
// 关键字查找 insmod modprobe和 路径 /lib/module 会在设备管理器本身(后台服务)和libhd等安装包中返回true,因此暂不可使用
117120
// 英伟达驱动中找不到 .ko 和 .ppd 等信息 , 但是可以找到 nvidia*.ko 字段,因此添加 nvidia*.ko 过滤字段
118121
// 不能直接通过包名判断 比如 "deepin-devicemanager_1.0.deb" 判断是否包含 "deepin-devicemanager" 此时同样会过滤 "/home/uos/deepin-devicemanager/driver.deb"
119-
process.start("sh", QStringList() << "-c" << QString("grep -irHE 'nvidia*.ko' %1 || find %1 -name '*.ko' -o -name '*.ppd'").arg(strExtract));
120-
if (process.waitForFinished()) {
121-
//获取查找结果,有结果不为空
122-
QString strKeyContent = process.readAllStandardOutput();
123-
qCInfo(appLog) << strKeyContent;
124-
if (!strKeyContent.isEmpty()) {
122+
QStringList arguments1;
123+
arguments1 << QString("-irHE") << QString("nvidia*.ko") << strExtract;
124+
QString outInfo1;
125+
bool ret1 = runCmdSafeWithArgs(outInfo1, "grep", arguments1);
126+
if (ret1 && !outInfo1.isEmpty()) {
127+
bsuccess = true;
128+
}
129+
if(!bsuccess) {
130+
QStringList arguments2;
131+
arguments2 << strExtract << QString("-name") << QString("*.ko") << QString("-o") << QString("-name") << QString("*.ppd");
132+
QString outInfo2;
133+
bool ret2 = runCmdSafeWithArgs(outInfo2, "find", arguments2);
134+
if (ret2 && !outInfo2.isEmpty()) {
125135
bsuccess = true;
126136
}
127137
}
@@ -213,4 +223,17 @@ QString Utils::getUrl()
213223
}
214224
}
215225

226+
bool Utils::runCmdSafeWithArgs(QString &outInfo, const QString &program, const QStringList &arguments, int msecsWaiting)
227+
{
228+
QProcess process;
229+
process.start(program, arguments);
230+
if (!process.waitForFinished(msecsWaiting)) {
231+
qCInfo(appLog) << program << arguments << "run null";
232+
return false;
233+
}
234+
235+
outInfo = process.readAllStandardOutput();
236+
qCInfo(appLog) << program << arguments << outInfo;
237+
return true;
238+
}
216239

deepin-devicemanager-server/deepin-devicecontrol/src/drivercontrol/utils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class Utils
2626
static bool isDpkgLocked();
2727
//获取url
2828
static QString getUrl();
29+
static bool runCmdSafeWithArgs(QString &outInfo, const QString &program, const QStringList &arguments, int msecsWaiting = 30000);
2930
};
3031

3132
#endif // UTILS_H

0 commit comments

Comments
 (0)