Skip to content

Windows XP模式编译时_wputenv_s发生缓冲区越界访问 #47

@mingkuang-Chuyu

Description

@mingkuang-Chuyu

1. 基本信息

  • 反馈者:小学生菲利克斯
  • 操作系统:Windows 10
  • 目标产物:Windows XP模式 + x86
  • 受影响的VC-LTL版本:<= 5.0.6 均受到影响
  • 复现概率:尚不明确,其概率与函数持有的栈大小有关,崩溃也不是必然。
  • 影响范围:Windows XP模式且使用到 _wputenv_s的代码将受到影响,其他模式不受到影响。
  • dmp信息:win32.7z(QQ发送)

1.1. 临时规避方案

临时改用_wputenv,同时新版本5.0.7将修复此问题。

// 在老版本VC-LTL中 不要使用_wputenv_s,下面是等效的替换。
// _wputenv_s(L"Name", L"");
_wputenv(L"Name=");

1.2. 最小复现代码

int main()
{
   // 可观察到 返回值为 22,而非预期的 0。
   // 崩溃它不一定发生,除非开启ASAN。
    _wputenv_s(L"123", L"");
    return 0;
}

2. 问题原因

_wputenv内部为字符串分配缓冲区时,没有正确的 * sizeof(wchar_t),导致实际分配的缓冲区长度小于预期。从而发生越界访问。
具体代码点:https://github.com/Chuyu-Team/VC-LTL5/blob/v5.0.6/ucrtbase.msvcrt/putenv.cpp#L43

3. 问题修复

修正缓冲区长度,重新确认所有 * sizeof 位点有无异常。静态代码分析???

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions