sync: from linuxdeepin/dde-session-shell#508
Conversation
There was a problem hiding this comment.
Sorry @deepin-ci-robot, you have reached your weekly rate limit of 500000 diff characters.
Please try again later or upgrade to continue using Sourcery
17d10ad to
e361384
Compare
deepin pr auto review你好!我是CodeGeex。我已经仔细审查了你提供的Git Diff,该代码的主要目的是引入 整体设计思路清晰,但代码在安全性、逻辑严谨性、资源管理和代码质量方面存在一些需要改进的地方。以下是详细的审查意见: 一、 安全性问题 🚨1. 文件描述符(FD)缺乏校验,存在严重的本地提权风险 int fd1 = cmdParser.isSet(fd1Opt) ? cmdParser.value(fd1Opt).toInt() : -1;风险:如果恶意用户通过命令行传入属于其他进程或敏感文件(如 2. 包装脚本的降级回退逻辑削弱了安全性 # Fallback: direct launch without loader (no polkit-free authorization)
exec "$REAL_BINARY" "$@"风险:恶意用户可以通过篡改环境变量(如修改 3. 版权年份异常 二、 语法与逻辑问题 🧩1. FD 管道通信存在死锁风险 fd1File.write(jsonData);
fd1File.close();
// ...
QByteArray response = fd2File.readAll();风险:如果 2. 无用的 D-Bus 调用 systemBus.interface()->isServiceRegistered("org.freedesktop.DBus");这不仅浪费了一次系统调用和IPC开销,且返回值被丢弃。应将其删除。 3. 三、 代码性能与质量 ⚡1. for (const auto &existing : m_destList) {
const QJsonObject current = existing.toObject();
// ... 比较
}
m_destList.append(dest);问题:每次添加新条目都遍历整个 2. QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), &error);问题: 3. Wrapper 脚本的路径硬编码 REAL_BINARY="/usr/libexec/deepin/dde-lock"
LOADER="/usr/bin/deepin-security-loader"问题:路径硬编码不利于多发行版适配或自定义安装前缀。 四、 改进后的代码示例 💻针对以上核心问题,提供以下修改建议代码: 1. C++ 端增加 FD 校验( // securityloaderhelper.cpp 中添加 FD 校验函数
#include <sys/stat.h>
bool SecurityLoaderHelper::isValidFd(int fd) {
if (fd < 0) return false;
struct stat st;
if (fstat(fd, &st) != 0) {
return false;
}
// 必须是管道或套接字,拒绝普通文件
return S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode);
}
void SecurityLoaderHelper::doSecurityLoader(int fd1, int fd2)
{
if (fd1 < 0 || fd2 < 0) {
qCWarning(secLoader) << "Not loaded by loader, skipping handshake";
return;
}
// 安全校验
if (!isValidFd(fd1) || !isValidFd(fd2)) {
qCCritical(secLoader) << "Security: Invalid file descriptors received! Possible spoofing attack.";
return; // 或者直接 exit(1)
}
qCInfo(secLoader) << "Detected loader injection: fd1=" << fd1 << "fd2=" << fd2;
// ... 后续逻辑
}2. 优化去重逻辑( void SecurityLoaderHelper::loadConfig(const QString &configPath)
{
QString path = configPath.isEmpty() ? DEFAULT_CONFIG_PATH : configPath;
qCInfo(secLoader) << "Loading permission config from:" << path;
// 使用 QSet 进行高效去重
QSet<QString> existingKeys;
for (const auto &item : m_destList) {
QJsonObject obj = item.toObject();
existingKeys.insert(obj["DbusName"].toString() + obj["DbusPath"].toString() + obj["DbusInterface"].toString());
}
// 假设 parseJsonFile 返回解析出的新列表
QJsonArray newDests = parseJsonFile(path); // 需重构 parseJsonFile 使其返回结果
for (const auto &item : newDests) {
QJsonObject obj = item.toObject();
QString key = obj["DbusName"].toString() + obj["DbusPath"].toString() + obj["DbusInterface"].toString();
if (!existingKeys.contains(key)) {
m_destList.append(item);
existingKeys.insert(key);
}
}
}3. 删除无用代码并增加注释( bool SecurityLoaderHelper::performHandshake(int fd1, int fd2)
{
// ... 前置校验 ...
QDBusConnection systemBus = QDBusConnection::systemBus();
if (!systemBus.isConnected()) {
qCWarning(secLoader) << "Cannot connect to system bus";
return false;
}
// 删除这行无用代码: systemBus.interface()->isServiceRegistered("org.freedesktop.DBus");
QString uniqueName = systemBus.baseService();
// ... 构建 JSON ...
// 注意: QFile 接管 fd 后,析构时会自动 close(fd1),后续不可再使用 fd1
QFile fd1File;
if (!fd1File.open(fd1, QIODevice::WriteOnly)) { /* ... */ }
fd1File.write(jsonData);
fd1File.close();
// 注意: 同理,fd2 会被自动关闭
QFile fd2File;
if (!fd2File.open(fd2, QIODevice::ReadOnly)) { /* ... */ }
// ... 读取逻辑 ...
}4. CMake 动态配置 Wrapper 脚本 #!/bin/bash
REAL_BINARY="@CMAKE_INSTALL_FULL_LIBEXECDIR@/deepin/dde-lock"
LOADER="@CMAKE_INSTALL_FULL_BINDIR@/deepin-security-loader"
# ... 其他逻辑不变在 configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/files/dde-lock-loader-wrapper.in
${CMAKE_CURRENT_BINARY_DIR}/dde-lock-loader-wrapper
@ONLY
)
install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/dde-lock-loader-wrapper DESTINATION ${CMAKE_INSTALL_BINDIR}
RENAME dde-lock
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) |
Synchronize source files from linuxdeepin/dde-session-shell. Source-pull-request: linuxdeepin/dde-session-shell#68
e361384 to
eeca107
Compare
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: deepin-ci-robot, xionglinlin The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
Synchronize source files from linuxdeepin/dde-session-shell.
Source-pull-request: linuxdeepin/dde-session-shell#68