ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

KB5004442补丁导致OPC Classic DCOM访问被拒?注册表豁免与配置指南

KB5004442补丁导致OPC Classic DCOM访问被拒?注册表豁免与配置指南 简介微软KB5004442安全更新CVE-2021-26414强制调整了Windows DCOM Server安全机制导致依赖DCOM的OPC Classic通信面临潜在中断风险。这份PDF文档系统梳理了该更新的影响范围、关键时间节点与缓解措施适合工业自动化运维、IT安全管理员及OPC应用开发人员快速评估实际影响。内容首先厘清COM/DCOM、OPC Classic与安全更新的关系再分别说明客户端与服务器侧的不同处理方式客户端须通过CoInitializeSecurity将身份验证级别设为数据包完整性服务器侧通常依赖DCOMCNFG配置权限随后完整列出微软三阶段计划——2021年6月默认禁用、2022年6月默认启用可临时关闭、2023年3月后不可禁用并提供具体注册表路径、连接性测试步骤、受影响Windows版本清单以及迁移至OPC Tunneller或OPC UA的备选方案。资源以1个PDF文件提供包体仅398KB查阅方便。已有459人浏览学习可作为升级决策和系统兼容性排查的重要参考。1. KB5004442不是普通安全补丁它让DCOM和OPC Classic的关系发生根本级变化在机械加工、注塑、水处理这些产线上OPC ClassicOPC DA / OPC HDA至今仍是上位机读取 PLC、传感器、数控机床等设备运行状态数据的主力协议。Windows 补丁 KB5004442 对应 CVE-2021-26414表面看只是一次安全增强实际改变了 RPC 服务对远程 COM 启动与激活请求的默认处理结果。不少工厂打完补丁后SCADA 到 OPC Server 的通道全部拒绝访问事件日志里冒出 RPC_E_ACCESS_DENIED。没有把 DCOM 权限模型和 OPC Server 的 CLSID 配置理解透的人直接上手改注册表往往折腾一整天还改不回来。这篇笔记不做安全评审只从一线配置视角出发解释这个补丁让 DCOM 默认安全行为发生了什么变化给出经过现场验证的注册表与组件服务配置方法再列出最容易踩坑的故障场景。适合被补丁影响到的工业上位机工程师、自控工程师以及把 OPC 当作数据中间件的 IT 人员。2. DCOM安全模型与CVE-2021-26414为什么这个补丁会阻断正常的OPC通信2.1 DCOM的启动权限和激活权限是两条闸门Windows 的 COM/DCOM 对象不是像普通 DLL 那样想调就调。客户端通过 CLSID 找到组件由 RpcSs 服务代为创建进程、返回接口指针。这个过程中有两个独立检查点启动权限决定远程客户端有没有资格让 DCOM 服务器拉启进程激活权限则控制CoCreateInstance时能否把组件实例化出来。二者各自带 ACL缺一个就报拒绝访问。在注册表里这两类 ACL 多数存放在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole下的MachineAccessRestriction、DefaultLaunchPermission单个应用也可以在 AppID 键下单独覆盖。OPC Server 安装时会把组件的默认权限写进系统正常情况下远程 SCADA 凭据包含在允许列表中系统据此放行 DCOM 调用。平时大家感受不到它存在直到补丁把 ACL 的默认语义改掉。2.2 OPC Classic 的远程调用为什么依赖这两道闸门OPC DA 规范在 2.05a、3.0 时代的远程传输层就是 DCOM。这意味着不仅是数据内容调用动作本身创建 OPC 组、读取、写入每次都要过 DCOM 安全校验。OPC Server 运行在被监控设备所在的工控机OPC Client 运行在 SCADA 或数采服务器跨进程跨机器访问就是典型的 DCOM 远程激活场景。这也是为什么很多 PLC 集成项目会遇到 OPC Server 本机操作正常、远端却连不上的怪事本机调用走 LocalServer 或 Surrogate不经过 RPCSS 的远程授权层问题往往就出在“远程启动/激活”这两个判断上。更要留意 OPC Server 的身份配置。常见 OPC Server 以“启动用户”或指定账户方式运行。若远程客户端用的本地凭据在 OPC Server 机器上没有对应账号默认 DCOM 行为会把请求降级为匿名而匿名在补丁前的默认列表里往往是可以访问的。CVE-2021-26414 盯上的就是这类被默认放行的边界补丁之后系统在远程激活这层变得更保守大量传统配置不再放行。2.3 KB5004442 实际改了哪一个开关AllowInsecureRemoteActivation 的本质CVE-2021-26414 被归类为 Windows DCOM Server 安全功能绕过。攻击者可以向目标机器发送特制的 DCOM 请求在特定条件下绕过权限检查以更高权限调起 DCOM 组件。KB5004442 在 2021 年 6 月的更新里收紧了 RPCSS 的处理远程客户端若没有通过 DCOM 默认安全策略的验证就会在“不安全远程激活”这个分支上被直接拒绝。所谓“不安全远程激活”指客户端发起启动请求时没有携带足以证明自己身份的凭据上下文或者目标组件允许匿名激活。补丁默认拒绝这一类激活但考虑工业兼容性又给指定组件留了显式豁免入口注册表值AllowInsecureRemoteActivation。把这个值设为 1等于对某个 AppID 撤销该禁令。这就解释了生产环境下的典型现场打补丁前一切正常打补丁后立即白屏。补丁没有破坏 OPC 组件本身而是把原本允许的“不安全”远程连接路径默认堵死。要在不放弃安全基线的前提下恢复连接就得在 OPC Server 的 AppID 下做显式豁免。具体做法下一章展开。3. 让 OPC Server 存活三套可落地的 DCOM 配置方案3.1 先确定 OPC 服务器的 CLSID 与 AppID动手改之前必须先知道目标键在哪一层。OPC Server 在注册表通常有三处HKCR\CLSID\{组件GUID}、HKCR\AppID\{应用GUID}以及HKLM\SOFTWARE\Classes\AppID。CLSID 里能找到 AppIDAppID 下才有AllowInsecureRemoteActivation与 RunAs。可以在 PowerShell 里从 OPC 的类别标识CATID枚举 CLSID 和 AppID。OPC DA 的类别常见标识之一是{63D5F430-CFE4-11d0-B576-00C04FC2FA4F}下面脚本按这个类别反查# 按 OPC 的 CATID 枚举注册表找出对应的 CLSID 和 AppID $catId {63D5F430-CFE4-11d0-B576-00C04FC2FA4F} $path Registry::HKEY_CLASSES_ROOT\CLSID Get-ChildItem $path | ForEach-Object { $clsid $_.PSChildName $catPath Join-Path $_.PSPath Implemented Categories if (Test-Path $catPath) { $cats (Get-ChildItem $catPath).PSChildName if ($cats -contains $catId) { $appId (Get-ItemProperty (Join-Path $_.PSPath AppID) -ErrorAction SilentlyContinue).(default) [PSCustomObject]{ CLSID $clsid; AppID $appId } } } } | Format-Table -AutoSize这段脚本只查本机注册表不需要网络探测在 OPC Server 机器上执行就行。原理是OPC 组件通过实现类别把自己标识出来COM 客户端凭 CLSID 发起激活顺着链路反查能让我们把豁免精准落在正确的 AppID 上。机器里如果装了多套 OPC Server输出会列多行要人工核对是哪一套在服务产线。忌讳贪方便全量豁免那样等于把补丁的安全效果全部归零审计时解释不清。3.2 方案一把 AllowInsecureRemoteActivation 写入指定 AppID这是线上恢复 OPC 链路最直接的手段。假设上一步定位到的 AppID 是{12345678-ABCD-EF01-2345-6789ABCDEF01}在管理员终端导入注册表即可Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole\AppID\{12345678-ABCD-EF01-2345-6789ABCDEF01}] AllowInsecureRemoteActivationdword:00000001导入后我不会立刻测通信而是先建议值班窗口允许时重启 OPC Server 进程或直接重启工控机。原因在于 RPCSS 是系统关键服务在线重启有风险只重启 OPC 相关服务在多数场景够用但 COM Surrogate 的缓存状态可能导致结果看起来“没生效”。改完键值后贸然测遇到失败很容易把方向带偏。如果之后要收紧回去把值改为0或删除该键即可删除后默认行为立即回到安全拒绝状态。需要说明的是这个键之所以叫“不安全”是因为它放行的激活请求不一定携带强身份。把它当作受控例外而不是永久方案对等保、工控安全审计要求严格的客户尤其重要。如果只是临时止血建议同时在维护记录里标注“在哪台机器、为什么放行、什么时候复查”。3.3 方案二通过组件服务调整 DCOM 安全权限很多老工程师不爱碰注册表更喜欢图形界面。运行dcomcnfg展开“组件服务 → 计算机 → 我的电脑 → DCOM 配置”找到目标 OPC Server 项。右键属性进入“安全”页这里有启动/激活权限、访问权限、配置权限三类设置。选择“使用自定义”后在“启动/激活权限”编辑列表里加入远程 SCADA 服务账户或用户组并勾选“允许启动”和“允许激活”“远程访问”保持允许。这个方法不碰 Allow 开关但前提是组件本身已被系统判定为可安全激活。如果补丁后 RPCSS 对组件的安全定义已经改变单纯加用户未必能通过遍历检查此时还是先做 3.2 的豁免或者检查组件的“标识”页确认是不是身份配置问题。图形界面的好处是权限矩阵肉眼可见换人接手时容易看清坏处是二进制 ACL 不好导出对比。我一般会先把HKLM\SOFTWARE\Microsoft\Ole整体导出备份再在系统升级、重装后一键恢复。Windows 系统的 DCOM 配置在某种意义上就是黑匣子导出一份键值等于给自己留了后悔药。3.4 方案三机器级访问限制的折中做法如果目标 OPC 应用没有独立 AppID或者希望一次性为整机放行一部分网段有人会去调整MachineAccessRestriction。这个注册表值也在HKLM\SOFTWARE\Microsoft\Ole下内容是二进制安全描述符。通过“我的电脑”属性的“COM 安全”页可以编辑它把“网络远程访问”加入允许列表。我不推荐直接把 Everyone 或 ANONYMOUS LOGON 塞进该列表那等于把 DCOM 安全口子撕开。即便客户对内部工业网络有强隔离也要把这条放在最后考虑。机器级放开影响面太大一旦和杀毒软件、域策略叠加排障成本成倍上涨。工业现场图省事后面大概率要还债。3.5 防火墙配合别拿“关闭占用端口号”的思路来修 DCOM前面几个方法解决认证层但 DCOM 还依赖 RPC 动态端口。常见误区是看到 135 端口开放就照“Windows 关闭端口号”之类的教程把 135 或动态端口范围全封掉结果 OPC 链路越修越断。RPCSS 监听 135后续数据传输在 49152–65535 之间动态分配Windows 防火墙把这些端口拦下DCOM 调用在建连阶段就会失败报的是网络错误而不是权限错误很容易误判成注册表没改对。正确做法是在防火墙里为 OPC 客户端的 IP 范围建立专用入站规则放行 TCP 135 以及动态端口段如果交换机或网闸支持也可以为 DCOM 配置固定端口范围收敛。规则里尽量不选“所有程序”而是指向 OPC Server 的实际进程或者限定“仅允许安全连接”。强制加密会让 DCOM 要求客户端具备可验证身份这时候又回到 2.3 说的凭据校验问题配置要通盘考虑。4. 补丁后 OPC 远程连接的常见问题排查4个高发场景与应对顺序4.1 现象客户端报 RPC_E_ACCESS_DENIED0x80070005这是补丁后出现最多的报错。OPC Client 连接时直接拒绝访问甚至不给出具体权限项。原因基本可以锁定在 DCOM 授权列表里没有客户端身份或者组件被补丁标记为不安全。补丁把默认激活策略收紧后原先可用的匿名或 Everyone 权限不再生效。先按 3.1 的枚举结果找到 OPC AppID加入AllowInsecureRemoteActivation1验证连通性再把 SCADA 账号加入“启动/激活权限”。两处都正确却仍报错回头看防火墙动态端口策略。排错顺序我习惯是先本机、再权限、后网络不要一上来就怀疑补丁坏。4.2 现象事件日志出现 10005 或 10010系统日志里频繁出现“DCOM 服务器在要求的超时时间内未注册”一类事件。原因是 RPCSS 尝试用新的安全上下文启动 OPC Server 进程时进程起来了但在超时窗口内没有完成 DCOM 注册。常见于 OPC Server 以“指定用户”运行而该用户在补丁后无法通过“启动身份”检查。打开组件服务检查“标识”页是“交互式用户”还是“此用户”。指定账户要确认密码没有过期并且该账户有本地登录权限服务型 OPC Server 还要看服务账户是否在重启后正确加载了用户配置文件。改完标识后必须重启 OPC 相关服务或整机否则下次调用仍会走旧的失败路径。4.3 现象同一网段一部分能连、一部分不能连这多半不是玄学而是节点补丁状态不一致。没打补丁的机器保持宽松策略打了补丁的机器执行严格策略新旧工控机在一个产线共存时很容易出现。对策是按统一基线对所有节点做一次 DCOM 配置校验导出一份清单比对HKLM\SOFTWARE\Microsoft\Ole下的键值差异并统一补丁基线。不要只修报错的那台否则下个月另一台新上线设备会以同样的方式再翻一次车。集中维护时可以把AllowInsecureRemoteActivation的豁免项记在同一张表里避免同一网段出现“这台能连、那台不能连”的怪象。4.4 现象注册表值已设为 1 却仍未连通最常见的原因是 AppID 空间写错。CLSID、AppID 长得像手抄很容易张冠李戴另一个原因是 OPC Server 以 Surrogate Hostdllhost.exe方式运行组件实际在宿主进程里创建豁免对 Surrogate 自身不一定生效。排查时回到 3.1 的枚举结果逐字符核对 GUID 大小写和花括号。对 DLL Surrogate 场景还要切到 dllhost 进程视角查 DCOM 配置确认启动权限覆盖到了宿主进程。测试时可以用 OPC QuickClient 或厂商自带测试工具分别连本机和远程做一遍定位是本机注册问题还是远端 RPCSS 拒绝。分段排除比盲改注册表快得多。5. 验证补丁影响与长期收敛从 DCOM 豁免到 OPC UA 迁移5.1 验证当前豁免是否生效配置改完后验证不能只看客户端能连就收工。我会在 OPC Server 机器上执行一条命令确认豁免键值真实存在且没有拼错# 检查指定 AppID 的豁免状态返回 1 表示仍放行 Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Ole\AppID\{12345678-ABCD-EF01-2345-6789ABCDEF01} | Select-Object -ExpandProperty AllowInsecureRemoteActivation如果返回空或 0说明注册表写入位置不对或者被组策略覆盖。验证完后在客户端侧跑一次实际的OPCGroup远程读写把报错码和 Windows 事件日志的 DCOM 记录一并存档才算闭环。5.2 长期路径OPC UA 比 DCOM 豁免更省心补丁可以临时豁免但每来一次安全更新都要复查一遍 DCOM 配置不是长久之计。工业现场更稳的做法是往 OPC UA 迁移。OPC UA 走 TCP 或 HTTPS不依赖 DCOM也就没有AllowInsecureRemoteActivation这类黑匣子开关而且 OPC UA 的会话层加密和证书认证比 DCOM 的旧 ACL 清晰得多。现在很多数采平台已经能直接用 OPC UA 协议读取 PLC、传感器、数控机床等设备的运行状态数据不再需要中间层做协议转换。如果现场还有老式 OPC DA 设备常见做法是部署 OPC DA 到 OPC UA 的转换网关把 DCOM 通信收敛在设备侧一小段链路上对外统一暴露 UA 端点。迁移后防火墙只开放一个明确端口安全审计更容易写清楚。5.3 一张可抄的处置检查表检查项推荐状态说明AllowInsecureRemoteActivation1临时必须记录豁免原因与复查日期DCOM 启动/激活权限包含 SCADA 账号用组件服务维护避免手改二进制 ACL防火墙规则135 动态端口限生产网段不要把端口全关不要放行所有程序系统补丁基线全节点统一避免新旧策略混跑造成“一部分能连”OPC UA 迁移已列入计划最终用 UA 替换 DCOM减少豁免面我自己的经验是把AllowInsecureRemoteActivation当止血药而不是日常配置。补丁刚发布那阵我在一个汽车零部件厂被 0x80070005 卡了一整晚后来养成了改注册表前先导出、并给 AppID 写备注的习惯。这条习惯帮我省了很多次返工。希望帮到你。本文还有配套的精品资源点击获取
返回列表