Dashboard/Issues/OH-2026-CAST-001
SubmittedCWE-862 — Missing Authorization

WiFi Display IPC Stub 缺少鉴权检查

View Upstream Issuegitcode.com/openharmony/castengine_wifi_display/issues/388
CWE:CWE-862 — Missing Authorization
Date:2026-05-07
Reporter:Zirui

问题描述

1. InterIpcStub::OnRemoteRequest

// services/interaction/interprocess/inter_ipc_stub.cpp:49
int InterIpcStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
{
    SHARING_LOGD("trace.");
    switch (code) {
        case InterIpcMsg::INTER_IPC_MSG: {
            DoIpcCommand(data, reply);    // 直接处理任意 IPC 消息
            break;
        }
        case InterIpcMsg::SET_LISTENER_OBJ:
            SetListenerObject(data, reply);  // 注册远程对象,无鉴权
            break;
        case InterIpcMsg::GET_SUBSYSTEM:
            GetSystemAbility(data, reply);   // 返回子系统能力,无鉴权
            break;
        default:
            break;
    }
    return 0;
}

2. DomainRpcServiceStub::OnRemoteRequest

// services/interaction/domain/rpc/domain_rpc_service_stub.cpp:44
int DomainRpcServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
                                          MessageOption &option)
{
    SHARING_LOGD("trace.");
    switch (code) {
        case DomainServiceMsg::DOMAIN_MSG: {
            DoRpcCommand(data, reply);    // 处理域间 RPC 命令,无鉴权
            break;
        }
        case DomainServiceMsg::SET_LISTENER_OBJ:
            SetListenerObject(data, reply);  // 注册远程对象,无鉴权
            break;
        case DomainServiceMsg::GET_SUBSYSTEM:
            GetSystemAbility(data, reply);   // 返回子系统能力,无鉴权
            break;
        default:
            break;
    }
    return 0;
}

两个 IPC Stub 在处理远程请求时均缺少以下验证:

  • ReadInterfaceToken() 调用(无法验证调用者是否持有正确的接口描述符)
  • VerifyAccessToken() / CheckPermission() 调用(无法验证调用者权限)
  • GetCallingUid() / GetCallingPid() 调用(无法识别调用者身份)

对比:同仓库中其他 castengine 项目的正确做法

同仓库下的 castengine_cast_frameworkcastengine_cast_plus_stream 使用了正确的鉴权模式:

// cast_session_impl_stub.cpp (castengine_cast_framework) — 正确做法
int CastSessionImplStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
    MessageOption &option)
{
    RETURN_IF_WRONG_TASK // ✓ 包含 ReadInterfaceToken 检查
    // 每个 handler 还有 Permission::CheckMirrorPermission/CheckStreamPermission
}

触发条件

  1. 任意进程可通过 ServiceManager 获取 WiFi Display 服务的 IPC 代理
  2. 构造 IPC 消息发送到 InterIpcStubDomainRpcServiceStub,无需任何权限即可触发命令处理

影响

  • InterIpcStub::DoIpcCommand: 未授权进程可通过 IpcMsgDecoder 反序列化并执行任意 IPC 命令
  • SetListenerObject: 未授权进程可注册恶意远程对象,劫持投屏服务的回调通道
  • GetSystemAbility: 未授权进程可获取子系统能力对象,进一步扩大攻击面
  • DomainRpcServiceStub::DoRpcCommand: 域间 RPC 服务处理跨设备通信,未授权调用可能影响设备间投屏安全

建议修复

在两个 OnRemoteRequest 入口添加接口令牌验证和权限检查:

int InterIpcStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
{
+   std::u16string descriptor = InterIpcStub::GetDescriptor();
+   std::u16string remoteDescriptor = data.ReadInterfaceToken();
+   if (descriptor != remoteDescriptor) {
+       SHARING_LOGE("interface token check failed.");
+       return ERR_INVALID_STATE;
+   }
+
+   if (!IPCSkeleton::IsLocalCalling()) {
+       // 建议添加 VerifyAccessToken / CheckPermission 检查
+   }

    switch (code) {
        // ...
    }
    return 0;
}

DomainRpcServiceStub::OnRemoteRequest 同理。

涉及文件

  • services/interaction/interprocess/inter_ipc_stub.cpp (line 49)
  • services/interaction/domain/rpc/domain_rpc_service_stub.cpp (line 44)