SubmittedCWE-457 — Use of Uninitialized Variable
NativeWindow API va_arg 指针未校验
View Upstream Issuegitcode.com/openharmony/graphic_graphic_surface/issues/980CWE:CWE-457 — Use of Uninitialized Variable
Repository:graphic_graphic_surface
Date:2026-05-11
Reporter:Zirui
漏洞概述
HandleNativeWindowSetSurfaceAppFrameworkType 通过 va_arg 从 variadic argument 获取 char* 指针。虽然代码检查了 nullptr,但如果调用者传入一个非空但无效的指针(悬空、已释放、或未初始化),std::string 构造函数会读取未初始化内存,可能导致信息泄露或崩溃。
漏洞详情
问题代码
文件: surface/src/native_window.cpp
static void HandleNativeWindowSetSurfaceAppFrameworkType(OHNativeWindow *window, va_list args)
{
char* appFrameworkType = va_arg(args, char*); // L397
if (appFrameworkType != nullptr) { // L398: 仅检查 nullptr
std::string typeStr(appFrameworkType); // L399: 未校验指针内容有效性
window->surface->SetSurfaceAppFrameworkType(typeStr);
}
}
问题分析
该函数作为 NativeWindow 公共 API 的内部 handler,通过 va_list 接收参数。调用链为:
OH_NativeWindow_SetSurfaceAppFrameworkType(window, type)
→ Dispatch(window, args)
→ HandleNativeWindowSetSurfaceAppFrameworkType(window, args)
风险路径:
- 调用者传入未初始化的
char*(非 nullptr) →std::string构造函数读取随机内存 - 调用者传入指向已释放内存的
char*→ 读取已释放内存(use-after-free) - 调用者传入非 null-terminated 的
char*→std::string读取越界
影响:
std::string构造函数从无效指针读取 → 段错误/崩溃- 如果读取的内存恰好不触发崩溃 → 可能将内部内存内容传入
SetSurfaceAppFrameworkType,造成信息泄露 - 由于是公共 API,攻击者可通过构造恶意参数触发
触发条件
- 调用
OH_NativeWindow_SetSurfaceAppFrameworkType(window, invalid_ptr)其中invalid_ptr非空但无效 - 需要 NativeWindow 句柄的访问权限(通常需要应用沙箱内的权限)
修复建议
static void HandleNativeWindowSetSurfaceAppFrameworkType(OHNativeWindow *window, va_list args)
{
char* appFrameworkType = va_arg(args, char*);
if (appFrameworkType == nullptr) {
return;
}
+ // 防御性校验:确保指针指向有效的 null-terminated 字符串
+ size_t len = strnlen(appFrameworkType, MAX_FRAMEWORK_TYPE_LEN);
+ if (len == 0 || len >= MAX_FRAMEWORK_TYPE_LEN) {
+ BLOGE("Invalid appFrameworkType: invalid length");
+ return;
+ }
std::string typeStr(appFrameworkType);
window->surface->SetSurfaceAppFrameworkType(typeStr);
}
涉及文件
surface/src/native_window.cpp(lines 395-402)surface/include/native_window.h(API 声明)
参考
- CWE-457: Use of Uninitialized Variable
- CWE-20: Improper Input Validation