Dashboard/Issues/OH-2026-TELREG-002
SubmittedCWE-476 — NULL Pointer Dereference

EventListenerHandler 多个 Work* 函数在 napi_open_handle_scope 失败后继续执行

View Upstream Issuegitcode.com/openharmony/telephony_state_registry/issues/254
CWE:CWE-476 — NULL Pointer Dereference
Date:2026-05-07
Reporter:Zirui

漏洞概述

EventListenerHandler 中 13 个 Work* 回调函数在调用 napi_open_handle_scope(env, &scope) 后检查 scope == nullptr,但仅打印错误日志而不返回,继续使用可能无效的 env 调用 NAPI API(napi_create_objectnapi_set_element 等)。当 napi_open_handle_scope 失败时(例如 JS 引擎已关闭或 env 无效),后续 NAPI 调用行为未定义,可能导致崩溃。

漏洞详情

问题代码模式(13 处重复)

文件: frameworks/js/napi/src/event_listener_handler.cpp

// 示例:WorkCallStateUpdated (line 769)
void EventListenerHandler::WorkCallStateUpdated(uv_work_t *work, std::unique_lock<std::mutex> &lock)
{
    std::unique_ptr<CallStateContext> callStateInfo(static_cast<CallStateContext *>(work->data));
    const napi_env &env = callStateInfo->env;
    napi_handle_scope scope = nullptr;
    napi_open_handle_scope(env, &scope);
    if (scope == nullptr) {
        TELEPHONY_LOGE("scope is nullptr");  // ← 仅打印日志
    }
    // ← 缺少 return,继续执行
    napi_value callbackValue = nullptr;
    napi_create_object(callStateInfo->env, &callbackValue);  // ← 可能崩溃
    ...
}

对比:同文件正确实现

// NapiReturnToJS (line 168) — 正确处理
napi_status NapiReturnToJS(napi_env env, napi_ref callbackRef, napi_value callbackVal, ...)
{
    napi_handle_scope scope = nullptr;
    napi_open_handle_scope(env, &scope);
    if (scope == nullptr) {
        TELEPHONY_LOGE("scope is nullptr");
        napi_close_handle_scope(env, scope);
        lock.unlock();
        return napi_ok;  // ← 正确:提前返回
    }
    ...
}

受影响函数(13 个)

行号函数名
775WorkCallStateUpdated
794WorkCallStateExUpdated
812WorkSignalUpdated
837WorkNetworkStateUpdated
869WorkSimStateUpdated
891WorkCellInfomationUpdated
910WorkCellularDataConnectStateUpdated
927WorkCellularDataFlowUpdated
945WorkCfuIndicatorUpdated
964WorkVoiceMailMsgIndicatorUpdated
983WorkIccAccountUpdated
1044WorkCCallStateUpdated

触发条件

  1. JS 引擎正在关闭或 env 已失效时收到 telephony 状态更新回调
  2. napi_open_handle_scope 返回失败(scope 为 nullptr)
  3. 后续 NAPI 调用使用无效的 scope/env,行为未定义

影响

  • 应用进程崩溃(SIGSEGV)
  • 竞态条件:应用退出过程中收到异步回调时触发
  • 影响所有注册了 telephony 状态监听的应用

修复建议

在每个 Work* 函数的 scope == nullptr 检查后添加 return

    napi_open_handle_scope(env, &scope);
    if (scope == nullptr) {
        TELEPHONY_LOGE("scope is nullptr");
+       napi_close_handle_scope(env, scope);
+       return;
    }

涉及文件

  • frameworks/js/napi/src/event_listener_handler.cpp (13 处,lines 775-1046)