From 5fac5e380d77893c4af47eba367bf12bc0f290cf Mon Sep 17 00:00:00 2001 From: MeowOS Date: Mon, 31 Aug 2026 19:30:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(nyai):=20=E5=AF=BC=E5=87=BA=20exec=20?= =?UTF-8?q?=E7=BB=9D=E5=AF=B9=E8=B7=AF=E5=BE=84=E7=9B=B8=E5=AF=B9=E5=8C=96?= =?UTF-8?q?=20+=20gzip=20stderr=20=E9=87=8D=E5=AE=9A=E5=90=91=20(agent-?= =?UTF-8?q?=E7=AD=BE=E5=90=8D=E4=BA=A7=E7=AD=BE=E9=93=BE=E8=B7=AF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cmd_export 原先对 app.json 的 exec(绝对路径,如 /usr/data/mnt/sd_0/MeowAPPs//) 误用 sanitize_member 剥前导 '/' 拼到包目录下,导致 access(/usr/data/...) 必然失败, 所有真实 app 导出被拒(exec 文件不存在或不可执行),卡死「导出→产签」链路。 新增 exec_rel_to_pkg(): 按 ①src/ 前缀 ②/MeowAPPs// 段(根路径不一致的沙箱/CI) ③相对路径 ④绝对但定位不到包目录→拒, 正确相对化 exec。 - install/upgrade 解包命令把 2>/dev/null 只绑到 tar,gzip stderr(footer trailing garbage / 损坏 crc error)会漏到用户输出;改 gzip 也重定向。 - 同链验证: 宿主 meow_sign/meow_verify_host/qemu-mipsel 验签矩阵通过; 真机(10.78.193.50) 无签 os.meow.*拒装/已签安装OK+.mpk.src/篡改拒装/降级拒装 全过; 装后已卸并恢复原状。 (devdocs 本地不入库; 产签实走记录+README 见 patch_v2/meow_sign/README.md §8) --- patch_v2/meow_sign/README.md | 13 ++++++++++++ patch_v2/meowpkg/nyai | Bin 112428 -> 112812 bytes patch_v2/meowpkg/nyai.c | 38 +++++++++++++++++++++++++++++++---- patch_v2/meowpkg/nyai_host | Bin 73816 -> 73872 bytes 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/patch_v2/meow_sign/README.md b/patch_v2/meow_sign/README.md index e90aa85..46bc393 100644 --- a/patch_v2/meow_sign/README.md +++ b/patch_v2/meow_sign/README.md @@ -130,3 +130,16 @@ static const uint8_t g_meow_pub[MEOW_PUB_KEY_COUNT][32] = { | `../meow_verify/meow_signing_pub.h` | **固件内嵌公钥数组**(仅公钥,可入库) | | `../meow_verify/meow_sig.h` | 签名块格式 + 被签消息构造(verifier/signer 共用) | | `.keys/` | 私钥目录(**已 gitignore,绝不入库**) | + +## 8. 端到端实走(真机已验证,2026-08-31) + +> 完整「产签→验签→真机安装→导出保留签名」的可复现步骤、逐命令预期输出、6 个失败矩阵项、常见错误速查与本次修复,见 +> `devdocs/plan/MPK_SIGNATURE_DESIGN.md` 的「产签实走记录 / 操作步骤(端到端)」节。此处只记三个**最容易踩的坑**: + +1. **`.mpk` 文件内文件须在 tar 根**:`app.json`/`meow`/资源须并列于 tar 根(**无** `/` 顶层包裹目录)。 + 打包用 `tar -C .`(导出生成本就是 `tar -C src .`),否则设备安装报 `解压/校验 app.json 失败`。 +2. **包名 = 文件名茎**:`meow_sign sign` 从 `.mpk` 文件名茎推导包名并写入 footer;`.mpk` 必须 == `app.json.package`。 + 改文件名/包名 → 验签 `package mismatch`。 +3. **`exec` 可为绝对路径,导出须相对化**:真实 app 的 `app.json.exec` 是绝对路径(`launcher` 直接 `execve`)。 + `nyai export` 须把 `exec` 相对化到包目录(已修 `nyai.c` 的 `exec_rel_to_pkg`)再存在性检查/白名单打包; + 否则所有真实 app 导出报「exec 文件 … 不存在或不可执行」。 diff --git a/patch_v2/meowpkg/nyai b/patch_v2/meowpkg/nyai index 73cb40827a7e22092c6a5df5e4f0cd466a85f16b..c2599fea7384a10122fc11049047abc226bda416 100755 GIT binary patch delta 27382 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 delta 26976 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 z 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 XcjBmV)>dT-p+;`w>}e%wClCKWv8~GN diff --git a/patch_v2/meowpkg/nyai.c b/patch_v2/meowpkg/nyai.c index 11793fd..5b35b98 100644 --- a/patch_v2/meowpkg/nyai.c +++ b/patch_v2/meowpkg/nyai.c @@ -840,7 +840,7 @@ static int install_mpk_file(const char *mpk_path) rm_rf(stg); if (mkdir_p(stg)!=0) { fprintf(stderr,"nyai: install: 无法建临时目录 %s\n", stg); return 1; } char cmd[1024]; - snprintf(cmd,sizeof cmd,"gzip -dc '%s' | tar -x -C '%s' 2>/dev/null && [ -f '%s/app.json' ]", mpk_path, stg, stg); + snprintf(cmd,sizeof cmd,"gzip -dc '%s' 2>/dev/null | tar -x -C '%s' 2>/dev/null && [ -f '%s/app.json' ]", mpk_path, stg, stg); printf("Preparing to unpack %s ...\n", pkg); if (system(cmd)!=0) { fprintf(stderr,"nyai: install: 解压/校验 app.json 失败(%s 可能损坏或非 .mpk)\n", mpk_path); @@ -1065,6 +1065,36 @@ static int sanitize_member(const char *in, char *out, int n) snprintf(out,n,"%s", p); return 0; } + +/* 把 app.json 的 exec 路径相对化到包目录下(导出前存在性检查 + 白名单打包用)。 + * 约定(MEOW_APP_SDK 现有惯例,launcher 以绝对路径直接 execve): + * - exec 以本包目录 src/ 为前缀 → 取其后相对部分(同一 meow_root,如真机 src=.../MeowAPPs/os.meow.hello → hello); + * - exec 含 "/MeowAPPs//" 段 → 取该段后的相对路径(根路径与 src 不一致时仍可定位,如沙箱/CI 测试); + * - exec 为相对路径(无前导 /)→ 沿用 sanitize_member 语义(剥 ./、禁 ../、禁 shell 元字符); + * - 绝对路径但定位不到包目录段 → 非本包程序,返回 -1(拒绝导出)。 + * 返回 0 成功,-1 非法。 */ +static int exec_rel_to_pkg(const char *src, const char *exec, const char *pkg, char *out, int n) +{ + if (!exec || !*exec) return -1; + const char *rel = NULL; + size_t sl = strlen(src); + if (strncmp(exec, src, sl) == 0 && exec[sl] == '/') { + rel = exec + sl + 1; + } else if (pkg && *pkg) { + char marker[272]; snprintf(marker, sizeof marker, "/MeowAPPs/%s/", pkg); + const char *m = strstr(exec, marker); + if (m) rel = m + strlen(marker); + } + if (rel) { + size_t rl = strlen(rel); + if (rl == 0 || rl >= (size_t)n) return -1; + if (has_dotdot_comp(rel) || unsafe_path(rel)) return -1; + memcpy(out, rel, rl); out[rl] = 0; + return 0; + } + if (exec[0] != '/') return sanitize_member(exec, out, n); + return -1; +} /* 从 JSON 数组串(含 '[' ']')提取字符串成员;返回项数,负=格式错 */ static int json_array_strings(const char *arr, char items[][256], int max) { @@ -1147,9 +1177,9 @@ static int cmd_export(const char *pkg, const char *out) char appj[BUF]; snprintf(appj,sizeof appj,"%s/app.json", src); appmeta m; if (load_app_meta(appj,&m)!=0) { fprintf(stderr,"nyai: export: %s/app.json 不合法(缺 name 或 exec)\n", pkg); return 1; } - /* 导出前体检:exec 文件存在且可执行 */ + /* 导出前体检:exec 文件存在且可执行。exec 可为绝对(包目录下,相对化)或相对路径。 */ char exec_rel[BUF]; - if (sanitize_member(m.exec, exec_rel, sizeof exec_rel)!=0) { + if (exec_rel_to_pkg(src, m.exec, pkg, exec_rel, sizeof exec_rel)!=0) { fprintf(stderr,"nyai: export: exec 字段非法: %s\n", m.exec); return 1; } char exepath[BUF]; snprintf(exepath,sizeof exepath,"%s/%s", src, exec_rel); @@ -1246,7 +1276,7 @@ static int cmd_upgrade(const char *pkg, const char *file) if (rename(dst,bak)!=0) { fprintf(stderr,"nyai: upgrade: 备份失败: %s\n", strerror(errno)); return 1; } if (mkdir_p(dst)!=0) { rename(bak,dst); return 1; } char cmd[1024]; - snprintf(cmd,sizeof cmd,"gzip -dc '%s' | tar -x -C '%s' 2>/dev/null && [ -f '%s/app.json' ]", mpk,dst,dst); + snprintf(cmd,sizeof cmd,"gzip -dc '%s' 2>/dev/null | tar -x -C '%s' 2>/dev/null && [ -f '%s/app.json' ]", mpk,dst,dst); printf("Upgrading %s ...\n", pkg); if (system(cmd)!=0) { fprintf(stderr,"nyai: upgrade: 解压失败,回滚\n"); rm_rf(dst); rename(bak,dst); return 1; } char appj[BUF]; snprintf(appj,sizeof appj,"%s/app.json", dst); diff --git a/patch_v2/meowpkg/nyai_host b/patch_v2/meowpkg/nyai_host index 7620043bda0f8352366a1f475718c5aa266c148b..42fa0d2e277b8ccc6e0efe171ca6defd065792fa 100755 GIT binary patch delta 15368 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 delta 15038 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