SubmittedCWE-862 — Missing Authorization
WiFi Display IPC Stub 缺少鉴权检查
View Upstream Issuegitcode.com/openharmony/castengine_wifi_display/issues/388问题描述
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_framework 和 castengine_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
}
触发条件
- 任意进程可通过 ServiceManager 获取 WiFi Display 服务的 IPC 代理
- 构造 IPC 消息发送到
InterIpcStub或DomainRpcServiceStub,无需任何权限即可触发命令处理
影响
- 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)