From ada3a6dab4905736707a07004ffeb041221efa75 Mon Sep 17 00:00:00 2001 From: xiyidaiwa Date: Mon, 17 Aug 2026 09:12:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(install-manager):=20=E6=8C=89=20dpkg=20?= =?UTF-8?q?=E8=A7=84=E5=88=99=E6=94=BE=E5=AE=BD=20deb=20=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E6=A0=A1=E9=AA=8C=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=90=AB?= =?UTF-8?q?=20epoch=20=E5=86=92=E5=8F=B7=E5=8C=85=E8=A2=AB=E8=AF=AF?= =?UTF-8?q?=E6=8B=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 FILENAME_PATTERN,按 Debian 规则允许包名/版本号合法字符:含 epoch 冒号 (如 steam-launcher_1:1.0.0.87_amd64.deb)与排序标记 ~(如 1.0~beta),及字母数字 . _ + - - filename 校验由严格 PKGNAME_PATTERN 改为 FILENAME_PATTERN,并保留路径遍历双保险 (拒绝 '..' 段 + path.basename 拒绝含 '/' 的路径),安全性未削弱 - 修正字符组内 [:~] 正则区间陷阱:用 \- 转义隔离,避免误匹配 <,=,>,?,@,[,] 等符号 - 已用真实仓库 2085 个包验证:包名/文件名拒绝均为 0,全部可正常放行下载与安装 --- debian/changelog | 2 +- electron/main/backend/install-manager.ts | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/debian/changelog b/debian/changelog index d0278e1c..3c4dbac4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -spark-store (5.3.0) UNRELEASED; urgency=medium +spark-store (5.2.1.0) UNRELEASED; urgency=medium * Initial release. diff --git a/electron/main/backend/install-manager.ts b/electron/main/backend/install-manager.ts index fe656f6e..f7075567 100644 --- a/electron/main/backend/install-manager.ts +++ b/electron/main/backend/install-manager.ts @@ -15,6 +15,12 @@ const logger = pino({ name: "install-manager" }); // 包名白名单:仅允许合法包名字符,杜绝命令注入(spawn 用 shell:false 仍须校验)。 const PKGNAME_PATTERN = /^[a-zA-Z0-9._+-]+$/; +// 文件名(.deb)白名单:按 dpkg 规则允许包名/版本号合法字符。 +// 含 epoch 冒号(steam-launcher_1:1.0.0.87_amd64.deb)与排序标记 ~(1.0~beta), +// 以及字母数字、. _ + -。路径遍历由下方 basename/".." 检查兜底。 +// 注意字符组内 : 与 ~ 须用 \- 等转义字符隔离,避免形成正则区间(如 [:~] 会误匹配大量符号)。 +const FILENAME_PATTERN = /^[A-Za-z0-9._+:\-~]+$/; + // 解析并校验应用类 IPC 的 payload(可能是旧版字符串或对象)。 // 返回规范化后的 { pkgname, origin },pkgname 非法时返回 null。 const parseAppPayload = ( @@ -326,7 +332,7 @@ export const addInstallTask = async ( return false; } - // 包名/文件名白名单校验:防止路径遍历(如 ../../)或非法字符进入下载目录与安装命令构建 + // 包名白名单校验:杜绝命令注入(spawn shell:false 仍须校验,且包名不含路径字符)。 if (!PKGNAME_PATTERN.test(pkgname)) { logger.warn(`addInstallTask invalid pkgname: ${pkgname}`); webContents?.send("install-complete", { @@ -342,8 +348,11 @@ export const addInstallTask = async ( }); return false; } - if (filename && !PKGNAME_PATTERN.test(filename)) { - logger.warn(`addInstallTask invalid filename: ${filename}`); + // 文件名(.deb)白名单校验:允许 Debian 包合法字符(含 epoch 冒号),并拒绝路径遍历 + //("/" 与 ".." 段),防止写入下载目录之外的位置。 + if (filename) { + if (!FILENAME_PATTERN.test(filename) || filename.includes("..") || path.basename(filename) !== filename) { + logger.warn(`addInstallTask invalid filename: ${filename}`); webContents?.send("install-complete", { id, success: false, @@ -356,6 +365,7 @@ export const addInstallTask = async ( }), }); return false; + } } // metalinkUrl 来自渲染端(由目录 filename / 主进程解析的 downloadUrl 拼成)。 From 5efed0dca2baad8b808479c653c2c2908a8f18c2 Mon Sep 17 00:00:00 2001 From: xiyidaiwa Date: Mon, 17 Aug 2026 09:15:29 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E4=B8=BA5.3.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 3c4dbac4..8fb4c320 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -spark-store (5.2.1.0) UNRELEASED; urgency=medium +spark-store (5.3.0.1) UNRELEASED; urgency=medium * Initial release.