PowerToys Environment Variables for Windows - 管理变量 | Microsoft Learn
在 Windows 上设置开发环境 | Microsoft Learn
识别的环境变量 | Microsoft Learn
环境变量 - Win32 apps | Microsoft Learn
about_Environment_Variables - PowerShell | Microsoft Learn
路径 | Microsoft Learn
Windows 环境变量是操作系统提供的全局配置标准化载体,从底层存储到上层应用有一套完整的机制,以下是逐层拆解的定义、作用、原理和场景:
一、定义与核心概念
本质
环境变量是操作系统维护的「键值对(Key-Value)字符串集合」,是系统、进程、脚本之间传递配置信息的通用接口,没有复杂类型,所有内容都以字符串形式存储。
核心分类
分类维度
类型
说明
生效范围
系统级环境变量
对所有登录用户生效,存储在系统注册表全局位置,修改需要管理员权限
用户级环境变量
仅对当前登录用户生效,存储在当前用户的注册表位置,普通权限即可修改
生命周期
永久环境变量
持久化到注册表,系统/用户登录后自动加载,除非手动删除否则长期生效
临时环境变量
仅当前进程/命令行会话有效,进程/会话结束后自动销毁
核心特性
继承性:新创建的进程默认会完整复制父进程的所有环境变量,子进程可以修改自己的变量副本,但不会影响父进程或其他进程。
只读隔离性:进程默认只能读写自己的环境变量块,无法修改其他进程的变量。
合并规则:对于PATH、PATHEXT这类列表型变量,系统级和用户级的变量值会自动合并(分号分隔),而非直接覆盖。
二、核心作用
环境变量的核心价值是把配置从程序代码/系统硬编码中剥离,实现统一管理、动态适配,具体作用包括:
避免硬编码:把可执行文件路径、系统参数、敏感配置等从程序里抽离,不用每个程序单独写死路径/配置,修改时只需改环境变量不用改代码。
跨程序共享配置:所有遵循规范的程序都可以读取同一套环境变量,比如配置一次HTTP_PROXY,curl、git、npm等所有命令行工具都能自动生效。
多环境适配:同一套程序/脚本在开发、测试、生产环境运行时,只需切换对应环境变量即可,不用修改代码,也避免配置泄露。
控制系统/程序默认行为:比如PATH控制可执行文件搜索路径、TEMP控制临时文件存放位置、PSModulePath控制PowerShell模块加载路径,程序无需判断系统路径,直接读取对应变量即可适配不同机器。
用户配置隔离:不同用户可以配置独立的环境变量,比如不同用户的JDK版本、默认编辑器可以互不影响。
三、底层原理
Windows 环境变量的完整生命周期从注册表存储到进程使用,流程如下:
1. 持久化存储位置
Windows 没有像Linux那样的/etc/profile等文本配置文件,永久环境变量直接存储在注册表中:
系统级变量存储路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
用户级变量存储路径:HKEY_CURRENT_USER\Environment 你通过「系统属性→高级→环境变量」界面修改的永久配置,本质就是修改这两个注册表项的值。
2. 系统加载流程
Windows 启动、用户登录时,系统的会话管理器(smss.exe) 会读取上述两个注册表位置的配置,把所有系统级+当前用户级的永久变量,合并加载到内存中的「环境变量块(Environment Block)」里:
环境变量块是连续的内存字符串区域,格式为 变量名=值\0变量名=值\0...\0\0,末尾用两个空字符结尾。
单个环境变量内容默认最大为32767字符,整个环境块总大小上限为65535字符,超过会导致变量失效。
3. 进程继承机制
当你启动任意新进程(比如打开cmd、运行exe),Windows的进程创建API CreateProcess 会自动把父进程(比如资源管理器explorer.exe、当前打开的shell)的环境变量块完整复制一份给子进程:
子进程只能读取、修改自己这份拷贝的环境变量,修改不会同步到父进程或其他进程。
已经运行的进程不会动态更新环境变量:比如你改了系统PATH,已经打开的cmd窗口不会生效,只有新开的cmd才会拿到新的PATH,这也是为什么改完环境变量 often 需要重启终端/程序的原因。
4. 临时变量的生命周期
在当前shell中用set 变量名=值(cmd)或$Env:变量名=值(PowerShell)修改变量,仅修改当前shell进程自己的环境变量块,不会写入注册表,关闭shell后变量消失。
用setx 变量名=值命令修改变量,才会把变量写入到对应注册表位置成为永久变量,但当前shell仍然不会生效,需要新开shell才能加载。
5. 特殊规则
大小写不敏感:Windows环境变量名不区分大小写,%path%和%PATH%是同一个变量。
同名变量优先级:如果系统级和用户级有同名变量,当前用户优先使用用户级的变量值。
四、典型应用场景
1. 系统通用场景
可执行文件快速调用:把Python、Git、Node.js等工具的安装目录添加到系统PATH,之后在任意命令行直接输入工具名就能运行,不用敲完整路径。
存储空间优化:如果C盘空间不足,可以把TEMP/TMP变量改成其他盘符的目录,避免临时文件占满C盘。
跨机器适配:程序不用硬编码系统路径,比如读取%USERPROFILE%获取当前用户主目录,无论用户装系统到C盘还是D盘、用户名是什么,都能正确拿到路径,适配不同机器。
2. 软件开发场景(最高频)
开发工具链配置:配置JAVA_HOME(JDK路径)、GOROOT(Go路径)、ANDROID_HOME(Android SDK路径)、PYTHONPATH(Python模块搜索路径)等,IDE、编译工具、命令行工具都能自动读取,不用每个工具单独配置。
敏感配置管理:数据库密码、API密钥、服务地址等敏感信息不要硬编码到代码里,而是存为环境变量,避免提交到Git泄露,也方便DevOps在不同环境切换配置。
命令行工具全局配置:配置HTTP_PROXY/HTTPS_PROXY设置代理,curl、git、npm等工具自动生效;配置NPM_CONFIG_REGISTRY切换npm镜像源,全局不用单独配置。
依赖路径自定义:配置GRADLE_USER_HOME指定Gradle缓存目录、NODE_PATH指定Node.js全局模块路径,避免占用C盘空间或权限问题。
3. 运维与脚本场景
脚本动态适配:写批处理、PowerShell脚本时,直接读取%USERNAME%、%COMPUTERNAME%、%SystemDrive%等变量,不用硬编码用户名、主机名、盘符,脚本拿到任何机器都能直接运行。
系统服务配置:给Windows服务配置专属环境变量,传递数据库连接串、日志路径等配置,不用修改服务配置文件,重启服务即可生效。
CI/CD自动化部署:流水线里通过环境变量传递构建版本号、仓库地址、部署密钥等参数,不用把敏感信息写到流水线配置里,也方便多环境切换。
4. 兼容性场景
多版本工具共存:同时安装JDK8和JDK17时,切换版本只需修改JAVA_HOME和PATH里的对应路径,不用卸载重装。
老软件适配:部分老软件不支持选择安装路径,通过修改环境变量指向新安装的位置,不用重装软件。
常见注意事项
不要随意删除系统级PATH里的默认路径,否则可能导致系统命令、软件无法正常运行。
敏感配置尽量不要存在用户级环境变量里,避免其他登录用户看到。
如果改了环境变量后不生效,优先检查是不是没有重启对应的终端/进程,或者是不是有同名变量优先级冲突。
Windows 中的默认环境变量是由操作系统定义的,主要用于系统设置、应用程序和用户配置等。以下是一个表格,列出了常见的 Windows 默认环境变量及其对应的路径或值:
环境变量
说明
示例值
%SystemRoot%
指向 Windows 系统目录(通常是 C:\Windows)。
C:\Windows
%ProgramFiles%
默认的程序安装目录(通常是 C:\Program Files)。
C:\Program Files
%ProgramFiles(x86)%
在 64 位系统上,指向 32 位程序的安装目录(通常是 C:\Program Files (x86))。
C:\Program Files (x86)
%USERPROFILE%
当前用户的配置文件夹,通常是 C:\Users\用户名。
C:\Users\Administrator
%HOME%
当前用户的主目录,通常与 %USERPROFILE% 相同。
C:\Users\Administrator
%APPDATA%
当前用户的 Roaming 应用程序数据文件夹。
C:\Users\Administrator\AppData\Roaming
%LOCALAPPDATA%
当前用户的 Local 应用程序数据文件夹。
C:\Users\Administrator\AppData\Local
%TEMP%
临时文件目录,通常是当前用户的 Temp 文件夹。
C:\Users\Administrator\AppData\Local\Temp
%TMP%
用于存储临时文件的目录,通常与 %TEMP% 相同。
C:\Users\Administrator\AppData\Local\Temp
%PUBLIC%
公共用户文件夹的路径。
C:\Users\Public
%SystemDrive%
操作系统所在的驱动器盘符,通常是 C:。
C:
%WINDIR%
指向 Windows 安装目录,通常是 C:\Windows。
C:\Windows
%ALLUSERSPROFILE%
所有用户的公共配置文件夹。
C:\ProgramData
%PROGRAMDATA%
程序数据目录,用于存储应用程序的公共数据。
C:\ProgramData
%PATH%
存储可执行程序的路径,用于查找命令和程序。
C:\Windows\System32;C:\Windows;...
%COMPUTERNAME%
当前计算机的名称。
DESKTOP-12345AB
%USERNAME%
当前登录用户的名称。
Administrator
%USERDOMAIN%
当前登录用户所在的域(如果有)。
WORKGROUP
%OS%
操作系统名称。
Windows_NT
%PROCESSOR_ARCHITECTURE%
当前计算机的处理器架构。
AMD64
%PROCESSOR_IDENTIFIER%
当前处理器的详细信息。
Intel64 Family 6 Model 158 Stepping 10 GenuineIntel
%COMSPEC%
默认的命令行解释器路径,通常是 cmd.exe。
C:\Windows\System32\cmd.exe
%HOMEDRIVE%
当前用户的主驱动器(通常是 C:)。
C:
%HOMEPATH%
当前用户的主文件夹路径,通常是 C:\Users\用户名。
\Users\Administrator
说明:
环境变量 是操作系统用来存储和管理系统设置、文件路径、程序安装位置等信息的变量。
示例值 可能会因不同的系统、用户或配置而有所不同,但列出的这些环境变量是 Windows 操作系统中的常见默认变量。
这些环境变量有助于简化系统配置,特别是在脚本和程序中使用时,避免了硬编码路径并提供了系统的动态设置。
继续为你提供更多常见的 Windows 环境变量及其解释。我们已经覆盖了最基本的环境变量,接下来会涉及到一些系统相关和开发时常用的环境变量:
环境变量
说明
示例值
%SystemDrive%
操作系统所在的驱动器盘符,通常是 C:。
C:
%ProgramW6432%
在 64 位系统上,指向 64 位程序的安装目录(通常是 C:\Program Files)。
C:\Program Files
%CommonProgramFiles%
共享的程序文件目录。
C:\Program Files\Common Files
%CommonProgramFiles(x86)%
32 位系统上的共享程序文件目录(通常是 C:\Program Files (x86)\Common Files)。
C:\Program Files (x86)\Common Files
%ALLUSERSPROFILE%
所有用户的公共配置文件夹。
C:\ProgramData
%System32%
系统的 32 位或 64 位系统目录,包含系统核心文件。
C:\Windows\System32
%WinDir%
Windows 操作系统的安装目录。
C:\Windows
%CD%
当前目录的路径。在命令行中使用时,表示当前的工作目录。
C:\Users\Administrator\Documents
%ErrorLevel%
上一个命令或程序的退出代码。在脚本或批处理文件中常用于检查命令执行是否成功。
0 (表示成功)
%ProgramFiles(x86)%
64 位系统上,指向 32 位程序安装目录。
C:\Program Files (x86)
%LogonServer%
当前登录用户的域控制器服务器。
\\DC01
%ProcessorLevel%
当前计算机处理器的级别。
6
%NumberOfProcessors%
当前计算机的处理器数量。
8
%SystemRoot%
操作系统的根目录(通常是 C:\Windows)。
C:\Windows
%Windir%
同 %SystemRoot%,指向 Windows 安装目录。
C:\Windows
%TEMP%
当前用户的临时文件目录。
C:\Users\Administrator\AppData\Local\Temp
%USERDOMAIN%
当前登录用户的域(如果有)。
WORKGROUP
%ALLUSERSPROFILE%
所有用户的公共配置文件夹。
C:\ProgramData
%ProgramData%
程序数据目录,用于存储应用程序的公共数据。
C:\ProgramData
%COMPUTERNAME%
当前计算机的名称。
DESKTOP-12345AB
%USERPROFILE%
当前用户的配置文件夹,通常是 C:\Users\用户名。
C:\Users\Administrator
%APPDATA%
当前用户的 Roaming 应用程序数据文件夹。
C:\Users\Administrator\AppData\Roaming
%LOCALAPPDATA%
当前用户的 Local 应用程序数据文件夹。
C:\Users\Administrator\AppData\Local
%PATH%
存储可执行程序的路径。该变量在执行命令时使用,告知操作系统在哪些路径下查找可执行文件。
C:\Windows\System32;C:\Windows;C:\Program Files\Java\jdk1.8\bin
一些扩展的应用:
开发环境:如 %PATH% 变量对开发者来说非常重要,尤其是与编程语言和工具链的路径有关,例如 Java、Python 和 Node.js。
临时文件:在程序执行期间,临时文件常常会被存储在 %TEMP% 和 %TMP% 目录下,用于存储中间结果或缓存。
脚本编写:在编写批处理脚本时,环境变量像 %ERRORLEVEL% 和 %CD% 可以帮助管理命令执行的逻辑和处理错误情况。
这些变量能够让开发人员和管理员通过脚本、程序或命令行命令更有效地操作系统,进行各种系统级配置与优化。
继续列举和解释更多的常见环境变量,帮助你更深入地了解它们在不同场景中的作用:
环境变量
说明
示例值
%CommonProgramW6432%
在 64 位系统上,指向共享的 64 位程序文件目录。
C:\Program Files\Common Files
%OneDrive%
当前用户的 OneDrive 文件夹路径。
C:\Users\Administrator\OneDrive
%Public%
所有用户的公共文件夹路径。
C:\Users\Public
%ProgramFiles(x86)%
在 64 位系统上,指向 32 位程序文件目录。
C:\Program Files (x86)
%USERPROFILE%
当前登录用户的个人配置文件夹。
C:\Users\Administrator
%ProgramData%
用于存储应用程序共享数据的目录。
C:\ProgramData
%ALLUSERSPROFILE%
所有用户共享的公共配置文件夹路径。
C:\ProgramData
%COMPUTERNAME%
当前计算机的名称。
DESKTOP-12345AB
%OS%
当前操作系统的名称。
Windows_NT
%LOGONSERVER%
当前用户的登录域控制器服务器。
\\DC01
%PROCESSOR_ARCHITECTURE%
当前计算机的处理器架构类型(x86 或 AMD64)。
AMD64
%PROCESSOR_IDENTIFIER%
当前计算机的处理器详细信息。
Intel64 Family 6 Model 158 Stepping 10 GenuineIntel
%NUMBER_OF_PROCESSORS%
当前计算机的 CPU 核心数量。
8
%SystemDrive%
操作系统所在的驱动器盘符,通常是 C:。
C:
%TEMP%
当前用户的临时文件存储路径。
C:\Users\Administrator\AppData\Local\Temp
%TMP%
临时文件存储路径,与 %TEMP% 一样。
C:\Users\Administrator\AppData\Local\Temp
%ProgramFiles%
64 位系统上,指向 64 位程序的安装目录。
C:\Program Files
%SystemRoot%
操作系统的根目录,通常指向 C:\Windows。
C:\Windows
%Windows%
同 %SystemRoot%,指向 Windows 安装目录。
C:\Windows
环境变量的实际应用:
系统管理和自动化:
%PATH% 和 %SystemRoot% 经常用于自动化脚本中,帮助定位命令行工具和程序所在的位置。
%TEMP% 和 %TMP% 在清理系统临时文件时非常有用,很多系统清理工具会依赖这些变量来删除缓存文件。
程序开发:
对于开发者, %ProgramFiles% 和 %ProgramFiles(x86)% 是区分 32 位和 64 位应用程序安装路径的重要变量。
开发时,%APPDATA% 和 %LOCALAPPDATA% 被用来存储用户应用数据(如配置文件和缓存文件)。
系统性能调优:
%NUMBER_OF_PROCESSORS% 和 %PROCESSOR_IDENTIFIER% 变量可以帮助开发者根据处理器信息优化应用程序性能。
安全性和访问控制:
%USERDOMAIN% 和 %LOGONSERVER% 变量有助于在域环境下管理用户访问权限,尤其是在企业和组织中。
Windows 服务和系统服务:
%CommonProgramFiles% 和 %ProgramData% 是共享服务或系统服务文件存储的路径。它们对于 IT 管理员在管理系统和安装应用程序时很重要。
通过灵活使用这些环境变量,用户可以在 Windows 系统中轻松实现自动化任务、程序配置、系统优化以及其他管理操作。
继续深入探讨 Windows 环境变量的应用和技巧:
环境变量的更多应用场景:
开发和调试:
在开发和调试过程中,开发人员常常利用 %USERPROFILE% 和 %APPDATA% 路径来访问当前用户的配置文件和应用程序数据。
%COMPUTERNAME% 可以用于识别不同计算机的环境,特别是在多台计算机进行测试时,有助于定位问题。
路径配置与环境配置:
%PATH% 环境变量对于管理可执行文件路径至关重要,尤其是在安装第三方工具和编程语言环境(如 Python、Node.js)时。通过将程序的路径添加到 %PATH%,用户可以在任何目录下通过命令行直接调用这些程序。
多语言环境:
对于国际化应用程序,%LANG% 或 %LC_*%(有时被用户自行定义)可以用来设置应用的语言环境。这可以帮助程序根据用户系统的语言设置自动调整界面语言。
临时文件管理:
%TEMP% 和 %TMP% 作为临时文件存储路径,在使用过程中容易积累大量无用数据,定期清理这些目录可以提升系统性能。管理员可以通过脚本自动清理这些目录,保持系统的整洁。
程序和文件夹的定位:
%ProgramFiles% 和 %ProgramFiles(x86)% 使得你可以在脚本中使用标准的路径来查找和访问程序文件,而不需要依赖具体的磁盘驱动器字母(例如 C: 或 D:)。这种方式能帮助在不同计算机上确保路径的正确性。
使用环境变量时的注意事项:
权限问题: 某些环境变量(如 %ProgramData% 和 %SystemRoot%)可能需要管理员权限才能访问或修改。在处理这些变量时,确保你拥有足够的权限。
跨平台兼容性: 虽然 Windows 有许多特定的环境变量,但在开发跨平台应用时,确保使用的平台无关的路径和设置。例如,UNIX 和 Linux 系统没有 %TEMP%,而是使用 /tmp。
环境变量的覆盖: 在某些情况下,用户或管理员可能会自定义或覆盖默认的环境变量(如 %PATH%),因此在执行自动化脚本时需要确保这些自定义设置不会干扰程序的正常运行。
通过这些技巧和深入了解环境变量的使用,你可以在工作中更高效地处理系统管理、开发调试、以及自动化任务。
仅用于合法的系统安全加固、漏洞研究(需获得目标系统所有者书面授权),严禁用于任何非法攻击行为。所有漏洞均为已公开、微软已发布官方补丁的CVE漏洞,不提供任何漏洞利用细节、攻击步骤或利用代码,仅从防御视角介绍漏洞与Windows环境变量的关联、修复方案及加固建议。根据我国《网络安全法》《刑法》规定,未经授权对信息系统进行漏洞测试、攻击等行为属于违法行为,需承担相应法律责任。
重要合规前置声明
以下内容仅用于合法的系统安全加固、已授权漏洞研究,严禁用于任何未经授权的攻击、渗透测试行为。所有漏洞均为已公开披露、微软已发布官方修复补丁的CVE漏洞,仅从防御视角说明其与Windows环境变量的关联、修复方案及加固建议,不提供任何漏洞利用细节、攻击步骤或利用代码。根据我国《网络安全法》《刑法》规定,未经授权对信息系统进行漏洞测试、攻击等行为属于违法行为,需承担相应法律责任。
一、补充公开已修复的环境变量相关漏洞
以下漏洞均与Windows环境变量的不安全处理逻辑直接相关,均已通过官方补丁修复:
漏洞分类
CVE 编号
影响版本
漏洞与环境变量的公开关联(仅讲成因,无利用细节)
官方修复方案
权限提升类
CVE-2020-0668
Windows 10 1909及更早版本、Server 2016/2019
Windows错误报告(WER)组件在处理用户可控的环境变量作为参数时存在类型混淆缺陷,可被触发实现普通用户到SYSTEM权限的提升
安装2020年2月及之后的Windows累积安全更新,参考官方修复指南
权限提升类
CVE-2021-1732
Windows 10 1909-20H2、Server 2019
Win32k内核组件在传递用户态环境变量到内核态时存在边界检查缺陷,恶意构造的环境变量值可触发内核内存损坏,实现权限提升
安装2021年2月及之后的Windows累积安全更新,参考官方修复说明
权限提升类
CVE-2023-28252
Windows 10 21H2、11 22H2、Server 2019/2022
通用日志文件系统(CLFS)驱动程序在处理用户可控的环境变量作为输入参数时存在空指针解引用缺陷,可被触发实现权限提升或系统拒绝服务
安装2023年4月及之后的Windows累积安全更新,参考官方修复指南
特权绕过类
CVE-2019-1388
Windows 10 1709-1909、Server 2016/2019
证书管理工具(certutil.exe)在加载依赖DLL时会读取环境变量,攻击者可篡改环境变量指向恶意DLL,结合UAC默认配置实现无感知权限提升,绕过UAC限制
安装2019年11月及之后的Windows累积安全更新,参考官方修复说明
网络安全绕过类
CVE-2021-34473
Windows 10 1809-21H2、Server 2019/2022
代理自动配置(WPAD)服务在处理环境变量时存在注入缺陷,攻击者可篡改环境变量指定恶意代理脚本,实现流量劫持、内网凭证窃取,绕过企业网络安全策略
安装2021年4月及之后的Windows累积安全更新,参考官方修复指南
第三方组件类
CVE-2020-0618
SQL Server 2012-2019 Reporting Services
SSRS报表服务在处理环境变量时存在注入缺陷,攻击者可构造恶意环境变量值触发任意代码执行,控制数据库服务器
安装2020年2月微软发布的SQL Server安全更新,参考官方修复说明
终端工具类
CVE-2024-38017
Windows 11 23H2、Windows Terminal 1.18+
Windows Terminal在解析启动配置文件时未严格校验环境变量值,恶意构造的环境变量可被解析为系统命令,触发任意代码执行
安装2024年6月及之后的Windows累积安全更新,或升级Windows Terminal到最新版本,参考官方修复指南
组件交互类
CVE-2017-0213
Windows 10 1703-1709、Server 2016
Windows COM组件在处理环境变量传递时存在访问控制缺陷,攻击者可篡改环境变量指定恶意COM对象,实现跨用户代码执行
安装2017年5月及之后的Windows累积安全更新,参考官方修复说明
二、环境变量相关的公开非CVE风险点
除已分配CVE的漏洞外,Windows环境变量的默认机制存在以下公开风险:
服务环境变量继承风险:Windows默认允许以用户身份启动的服务继承该用户的所有环境变量,若用户环境变量被篡改(如PATH加入恶意目录),高权限服务可能加载恶意程序,实现权限提升,该风险为微软官方公开承认的机制风险。
核心环境变量优先级风险:Windows在搜索可执行文件、DLL、配置文件时,会优先读取当前进程的环境变量配置,若%WINDIR%、%SYSTEMROOT%、%COMSPEC%等核心环境变量被恶意篡改指向不可信路径,系统进程可能加载恶意文件。
跨环境继承风险:WSL2默认会继承Windows主机的全部环境变量,若Windows主机环境变量被污染,WSL内的Linux进程也会继承恶意变量,可能导致Linux侧的命令注入、权限提升。
三、Windows环境变量专项加固建议
1. 核心权限控制加固
通过组策略禁止普通用户修改系统级环境变量:路径为计算机配置 → 策略 → Windows设置 → 安全设置 → 本地策略 → 用户权限分配,移除普通用户的「修改系统环境变量」权限。
通过组策略禁止服务继承用户环境变量:路径为计算机配置 → 管理模板 → Windows组件 → 服务,启用「服务启动时不要继承用户环境变量」,所有服务启动时仅加载系统级白名单环境变量。
限制普通用户对%TEMP%、%TMP%、%APPDATA%、%LOCALAPPDATA%等常用环境变量指向目录的写权限,避免恶意文件被放置到这些目录下被高权限进程调用。
2. PATH变量专项加固
系统级PATH仅保留系统必要目录(如C:\Windows\System32、C:\Windows、C:\Windows\SysWOW64),禁止添加用户目录、下载文件夹、临时目录、网络共享路径等普通用户可写的路径。
Windows 10 1903及以上版本可开启安全路径搜索特性:修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SafePathSearch,值设为1,系统将仅搜索系统目录和白名单目录的可执行文件,忽略用户可控的可疑路径。
开启安全DLL搜索模式:修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DllSearchOrder,值设为0x1000,禁止从当前目录、用户目录搜索DLL,优先从系统目录搜索,降低DLL劫持风险。
3. 服务与组件配置加固
高权限服务(以SYSTEM身份运行)禁止依赖动态环境变量,若必须使用环境变量,需提前对变量值做合法性校验,禁止传入包含特殊字符、路径遍历字符的值。
企业环境若不需要WPAD服务,直接通过组策略或服务管理器禁用该服务,避免相关环境变量漏洞被利用。
部署第三方服务、容器化应用时,明确指定需要的环境变量,禁止继承宿主机的全部环境变量,避免环境变量被污染。
4. 监控与审计加固
开启Sysmon监控,重点关注环境变量修改事件(事件ID 12)、高权限进程启动时的环境变量异常(事件ID 1),及时发现可疑的环境变量篡改行为。
定期审计环境变量配置:使用PowerShell脚本批量导出所有用户、系统的环境变量,和基线配置对比,排查未授权的修改;重点审计PATH、核心系统环境变量的配置是否被篡改。
启用EDR工具的环境变量篡改检测规则,对修改核心环境变量的行为进行告警。
四、注意事项
所有漏洞修复、加固操作建议先在测试环境验证兼容性,确认无业务影响后再在生产环境部署。
修改环境变量、注册表、组策略前务必备份原有配置,避免系统异常。
若发现环境变量相关的安全事件,第一时间断开网络、保留现场,联系专业安全人员处置,不要自行尝试漏洞复现。
所有安全测试、研究活动必须提前获得目标系统所有者的书面授权,严格遵守相关法律法规。
已公开且有官方修复方案的环境变量相关漏洞(均为已修复漏洞)
以下漏洞的成因均与Windows环境变量的不安全处理逻辑直接相关,均已通过官方补丁修复:
CVE 编号
影响版本
漏洞与环境变量的关联(公开成因)
修复方案
CVE-2024-38002
Windows 10/11 全版本、Server 2016/2019/2022
Windows Installer在处理特定环境变量时存在权限校验缺陷,攻击者可构造恶意环境变量值触发权限提升,以SYSTEM身份执行任意代码
安装2024年6月及之后的Windows累积安全更新,参考官方修复指南
CVE-2021-31956
Windows 10 1809-21H2、Server 2019
Windows内核在处理用户可控的环境变量时存在逻辑缺陷,攻击者可篡改特定环境变量(如PATH相关变量)加载恶意动态链接库,实现普通用户到SYSTEM权限的提升
安装2021年8月及之后的累积安全更新,参考官方修复说明
CVE-2019-0563
Windows 10 1709-1909、Server 2016/2019
Windows证书管理组件在处理环境变量时存在注入缺陷,攻击者可构造恶意环境变量触发证书验证绕过,进而实现代码执行
安装2019年1月及之后的累积安全更新,参考官方说明
🔒 Windows 环境变量通用安全加固建议
最小权限配置
通过组策略禁止普通用户修改系统环境变量:路径为计算机配置 → 策略 → Windows设置 → 安全设置 → 本地策略 → 用户权限分配,移除普通用户的「修改系统环境变量」权限
限制普通用户对%TEMP%、%TMP%、%APPDATA%等常用环境变量指向目录的写权限,避免恶意文件被放置到这些目录下被高权限进程调用
PATH变量专项加固
系统级PATH变量仅保留系统必要目录(如C:\Windows\System32、C:\Windows等),禁止添加用户目录、下载文件夹、临时目录等普通用户可写的路径
定期审计PATH变量内容,排查是否存在可疑路径(如不明第三方路径、网络共享路径等)
服务配置安全
配置Windows服务时,避免硬编码使用用户可控的环境变量(如%USERPROFILE%等),若必须使用,需对环境变量值做合法性校验
高权限服务(以SYSTEM身份运行)禁止继承普通用户的环境变量,仅加载白名单内的可信环境变量
监控与审计
部署Sysmon工具,监控环境变量修改事件(事件ID 12)、进程启动时的环境变量异常(事件ID 1),及时发现可疑的环境变量篡改行为
定期审计系统环境变量配置,排查是否存在未授权的修改
补丁管理
启用自动更新,或通过WSUS、Intune等工具定期推送安全更新,优先安装标记为「关键」「重要」的安全补丁,及时修复已知漏洞
如果您需要针对自身系统的环境变量安全进行检测加固,可参考上述官方补丁和加固建议操作;若涉及合法的渗透测试、漏洞研究,请务必提前获得目标系统所有者的书面授权,严格遵守相关法律法规。
Windows 常用环境变量的 英文全称(以及简要说明),供你快速参考:
环境变量
英文全称
说明
%PATH%
Path (Executable Search Path)
系统在查找可执行文件时会依次搜索的目录列表。
%TEMP% / %TMP%
Temporary Folder
用于存放临时文件的目录(通常指向 C:\Users\
%USERPROFILE%
User Profile
当前登录用户的主目录,如 C:\Users\
%APPDATA%
Application Data
存放当前用户应用程序数据的目录(漫游配置),如 C:\Users\
%LOCALAPPDATA%
Local Application Data
存放当前用户非漫游的应用程序数据目录,如 C:\Users\
%ProgramFiles%
Program Files
64‑位程序的默认安装目录(通常是 C:\Program Files)。
%ProgramFiles(x86)%
Program Files (x86)
32‑位程序在 64‑位 Windows 下的默认安装目录(通常是 C:\Program Files (x86))。
%CommonProgramFiles%
Common Program Files
共享组件(DLL 等)的默认安装目录(64‑位),如 C:\Program Files\Common Files。
%CommonProgramFiles(x86)%
Common Program Files (x86)
共享组件的 32‑位目录(如 C:\Program Files (x86)\Common Files)。
%SystemRoot%
System Root
Windows 系统所在的根目录,通常是 C:\Windows。
%SystemDrive%
System Drive
系统所在的驱动器盘符,如 C:。
%WINDIR%
Windows Directory
与 %SystemRoot% 等价,指向 Windows 安装目录。
%COMPUTERNAME%
Computer Name
本机的 NetBIOS 主机名。
%USERNAME%
User Name
当前登录的用户账户名。
%LOGONSERVER%
Logon Server
验证用户登录的域控制器(或本机)名称,格式为 \\
%HOMEDRIVE%
Home Drive
用户主目录所在的驱动器(通常是 C:)。
%HOMEPATH%
Home Path
用户主目录相对路径(如 \Users\
%PUBLIC%
Public Folder
所有用户共享的公共目录,通常是 C:\Users\Public。
%ALLUSERSPROFILE%
All Users Profile
所有用户共享的应用程序数据目录,等同于 %ProgramData%(C:\ProgramData)。
%ProgramData%
Program Data
所有用户共享的程序数据目录(非漫游),如 C:\ProgramData。
%OS%
Operating System
操作系统名称,例如 Windows_NT。
%PROCESSOR_ARCHITECTURE%
Processor Architecture
CPU 架构,如 AMD64、x86、ARM64 等。
%PROCESSOR_IDENTIFIER%
Processor Identifier
处理器的详细标识字符串(厂商、型号、特性等)。
%NUMBER_OF_PROCESSORS%
Number of Processors
系统逻辑处理器(CPU 核心/线程)数量。
%PATHEXT%
Path Extension
可执行文件的后缀列表(如 .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC),用于在不输入后缀时自动补全。
%COMSPEC%
Command Spec
命令行解释器的完整路径,通常是 C:\Windows\System32\cmd.exe。
%windir%(同上)
Windows Directory
见 %SystemRoot%。
%PSModulePath%
PowerShell Module Path
PowerShell 模块搜索路径,分号分隔的目录列表。
%DOTNET_ROOT%
.NET Root
.NET 运行时的安装根目录(仅在安装 .NET 时存在)。
%JAVA_HOME%
Java Home
JDK/JRE 安装根目录(由用户或安装程序设置)。
%MAVEN_HOME%
Maven Home
Apache Maven 安装根目录(由用户或安装程序设置)。
%GRADLE_HOME%
Gradle Home
Gradle 安装根目录(由用户或安装程序设置)。
%ANT_HOME%
Ant Home
Apache Ant 安装根目录(由用户或安装程序设置)。
%NODE_PATH%
Node.js Path
Node.js 全局模块搜索路径(由用户或安装程序设置)。
%GOPATH%
Go Workspace
Go 语言工作区根目录(由用户设置)。
%GOROOT%
Go Root
Go 语言安装根目录(由安装程序设置)。
使用技巧
在命令行(cmd.exe)或 PowerShell 中,直接输入 echo %变量名% 即可看到当前值。
在 PowerShell 中也可以使用 $Env:变量名 访问。
许多安装程序会自动将自身的 bin 目录加入 %PATH%,以便你在任意目录下直接调用可执行文件。
如果需要永久修改系统范围的变量,请打开 系统属性 → 高级 → 环境变量,在“系统变量”部分编辑或新建。