feat(svc_power): 读级命令鉴权放宽到任意调用者 (agent-189, 用户定案) — STATUS/BATTERY/REBOOT_REASON/UPGRADE_STATUS/dac status 读级不再查 uid;动作级维持 os.meow.*/系统身份;authtest +16 断言 ALL PASS。svc_power e0494eb7→c6ddf3f8

This commit is contained in:
MeowOS committed 2026-08-31 04:55:49 +08:00
1 parent c8ffdfbad9
commit 555c4a458e
5 files changed
+53 -7

No files matched your search

+26 -6
View File
@@ -13,8 +13,10 @@
* 鉴权(II 期,MPK_SIGNATURE_DESIGN §6):IPC 服务端按【连接级身份】分级——`SO_PEERCRED` 取 pid →
* `readlink /proc/pid/exe` → 命中 `MeowAPPs/<pkg>/` 判定包名,或命中系统二进制 allowlist
* (/usr/bin/meow_*、/usr/data/meow/meow*、MeowPanel 后端)判定为系统身份;其余为 OTHER。
* 动作级策略:系统动作(shutdown/reboot/upgrade/back_hiby/set-default-*)仅放行 `os.meow.*` 包或系统身份;
* 读/状态类(status/battery/reboot_reason/upgrade_status/screen/dac)放行所有 root 调用方;非 root 一律拒。
* 命令分「读级/动作级」(用户定案 2026-08-31):读级(status/battery/reboot_reason/upgrade_status/
* dac status,只读无副作用)放宽到**任意调用者**(不查 uid/身份);动作级维持现状——系统动作
* (shutdown/reboot/upgrade/back_hiby/set-default-*)仅放行 `os.meow.*` 包或系统身份,非系统动作
* (screen/dac on|off)仍须 root;非 root 一律拒。
* `MSG_HELLO` 自报 app_id 不在此作权威(仅交叉校验,见 §6.1)。CLI=root 免鉴权。
*
* 通知转储归属(§3.2/§3.3 已定案):通知存储为 launcher 进程内存(meow_notif.c g_slots[]),服务跨进程
@@ -617,6 +619,21 @@ static int is_system_action(uint32_t cmd)
}
}
/* 读级命令(用户定案 2026-08-31):只读查询、无副作用——status/battery/reboot_reason/upgrade_status,
* 及 DAC 的 status(flag=2)。读级放宽到任意调用者(不查 uid/身份);screen/dac on|off 等有副作用 → 动作级。 */
static int is_read_level(const m_power_action_t *a)
{
switch (a->cmd) {
case POWER_STATUS: case POWER_BATTERY:
case POWER_REBOOT_REASON: case POWER_UPGRADE_STATUS:
return 1;
case POWER_DAC:
return a->flag == 2; /* 仅 dac status 为读;on/off(flag=0/1) 是动作 */
default:
return 0;
}
}
/* 是否可信系统身份:CALL_SYS(受信系统二进制)或 CALL_PKG 且包前缀 os.meow.*。 */
static int is_sys_identity(const caller_t *c)
{
@@ -717,12 +734,15 @@ static void handle_conn(int c)
memset(&a, 0, sizeof a);
if (rlen > sizeof a) rlen = sizeof a;
memcpy(&a, payload, rlen);
/* 动作级策略(设计 §6.3):非 root 一律拒;系统动作须 os.meow.* 包或受信系统身份;
* 读/状态类(STATUS/BATTERY/REBOOT_REASON/UPGRADE_STATUS/SCREEN/DAC)放行所有 root 调用方。 */
/* 动作级策略(设计 §6.3 + 用户定案 2026-08-31):读级(只读无副作用)放宽到任意调用者,
* 不查 uid/身份;动作级维持现状——系统动作(shutdown/reboot/upgrade/back_hiby/set-default-*)
* 须 os.meow.* 包或受信系统身份,非系统动作(screen/dac on|off)仍须 root。 */
int allow = 0;
if (caller.uid == 0) {
if (is_read_level(&a)) {
allow = 1; /* 读级:任意调用者直接放行 */
} else if (caller.uid == 0) {
if (is_system_action(a.cmd)) allow = is_sys_identity(&caller);
else allow = 1;
else allow = 1; /* 动作级非系统动作(screen/dac on|off):root */
}
if (!allow) {
m_power_status_t st;