
簡介這份資源圍繞微軟 KB5004442 安全更新展開系統(tǒng)梳理了 CVE-2021-26414 漏洞對 Windows DCOM Server 及 OPC Classic 通信機制的影響適合工業(yè)自動化工程師、IT運維人員及 OPC 應(yīng)用開發(fā)者作為合規(guī)評估與排障參考。內(nèi)容涵蓋漏洞背景、DCOM 安全機制變更時間表、對客戶端與服務(wù)器端的差異化影響、CoInitializeSecurity 權(quán)限設(shè)置要點以及 2022 年 6 月 14 日與 2023 年 3 月 14 日兩個關(guān)鍵節(jié)點的應(yīng)對建議并附有具體注冊表路徑與測試步驟。資料為 1 個 PDF 文件壓縮包約 398KB方便直接查閱。已有 459 人學(xué)習(xí)適合需要評估現(xiàn)有 OPC Classic 環(huán)境是否受此更新影響、提前規(guī)劃軟件升級或臨時緩解措施的技術(shù)人員可在短時間內(nèi)掌握更新要點并據(jù)此安排后續(xù)驗證工作。1. KB5004442 不是一次普通安全更新它直接決定 OPC Classic 還能不能聯(lián)網(wǎng)2022 年 6 月之后如果你所在的工廠還在用 OPC Classic 采集 PLC、DCS 數(shù)據(jù)并且 Windows 服務(wù)器裝了 KB5004442 更新那你大概率會撞上一個詭異現(xiàn)象OPC 客戶端能啟動、能加載但一建立遠程連接就超時事件日志里冒出一堆 10036、10037。這不是網(wǎng)絡(luò)問題也不是 OPC 軟件本身壞了而是 Windows DCOM 安全機制被微軟強制提高了一個等級——從「連接時驗一次身」變成了「每個數(shù)據(jù)包都要驗身」。KB5004442 正是針對 CVE-2021-26414 這個 DCOM Server 安全功能旁路漏洞的修復(fù)補丁它給所有依賴 DCOM 的 OPC Classic 應(yīng)用劃了一條硬底線激活 DCOM 服務(wù)器時身份驗證級別不得低于數(shù)據(jù)包完整性RPC_C_AUTHN_LEVEL_PKT_INTEGRITY。如果你負責(zé)產(chǎn)線上的 OPC 通信或者你正在維護老的 SCADA 系統(tǒng)這篇文章就是為你寫的。2. DCOM 安全更新為什么會掐斷 OPC 通信認證級別、CoInitializeSecurity 與 CVE-2021-264142.1 先捋清 COM、DCOM 和 OPC Classic 的關(guān)系OPC Classic包括 DA、HDA、AE本質(zhì)上是基于微軟 COM 組件模型的一套接口規(guī)范。COM 組件在同一臺機器上可以通過指針調(diào)用但一旦跨進程、跨機器Windows 就會自動把 COM 調(diào)用包裝成 DCOM——分布式 COM。換句話說OPC 客戶端和 OPC 服務(wù)器都是 COM 組件它們之間的遠程通信走的是 DCOM 通道安全策略完全由 Windows DCOM 機制說了算。這就帶來一個連鎖反應(yīng)Windows 的安全更新只要動 DCOM 的默認行為OPC Classic 的通信就跟著遭殃。KB5004442 就屬于這一類——它不是針對 OPC 的但它改了所有 DCOM 激活請求的最低認證門檻。OPC 行業(yè)的老應(yīng)用普遍只做了「首次連接認證」甚至完全沒設(shè)認證級別正好被這個更新卡住。我接觸過的不少項目里WinCC、InTouch 連舊版 Matrikon OPC 服務(wù)器都屬于這種情況。2.2 這次更新到底改了什么從默認認證到強制數(shù)據(jù)包完整性CVE-2021-26414 的核心問題是DCOM 服務(wù)器在激活過程中沒有強制校驗客戶端的認證級別攻擊者可以用低級別認證繞過安全機制在未經(jīng)授權(quán)的情況下激活 DCOM 對象。微軟的修復(fù)思路很直接——在 DCOM 服務(wù)器端加一道閘凡是激活請求認證級別必須達到 RPC_C_AUTHN_LEVEL_PKT_INTEGRITY值等于 5或更高。這個「認證級別」不是網(wǎng)絡(luò)術(shù)語里的密碼強度它描述的是 DCOM 調(diào)用過程中安全包對數(shù)據(jù)的保護程度。級別從 0 到 6 遞增0 是無認證1 是連接級認證只驗一次連接2 是調(diào)用級認證每次調(diào)用驗一次3 是數(shù)據(jù)包級認證每個數(shù)據(jù)包驗一次4 是數(shù)據(jù)包完整性每個數(shù)據(jù)包驗簽確保沒被篡改5 是數(shù)據(jù)包機密性在完整性基礎(chǔ)上還加密6 是數(shù)據(jù)包機密性舊版保留值。KB5004442 要求的最低級別是 4也就是數(shù)據(jù)包完整性。注意3 和 4 的區(qū)別很關(guān)鍵3 只驗證數(shù)據(jù)包來源4 還要做完整性校驗防止中間人篡改。微軟選 4 而不是 3是因為 CVE-2021-26414 的利用路徑正是通過篡改 DCOM 激活流量來繞過安全策略。所以問題不是「OPC 軟件沒做認證」而是很多老應(yīng)用用的認證級別是 1連接級或 3數(shù)據(jù)包級要么完全沒觸發(fā)強制檢查要么達不到新的最低要求。系統(tǒng)日志里會出現(xiàn) 10036、10037、10038 這些新事件就是系統(tǒng)在告訴你有應(yīng)用試圖用低于 4 的認證級別激活 DCOM 服務(wù)器被攔下來了。2.3 CoInitializeSecurity客戶端的「一次性」安全配置函數(shù)對 OPC Classic 客戶端來說權(quán)限設(shè)置通常通過 CoInitializeSecurity 函數(shù)完成。這個函數(shù)有個特殊的脾氣每個進程實例只能調(diào)用一次第二次調(diào)用會直接失敗并返回錯誤。也就是說客戶端程序如果在初始化時把認證級別定死了后續(xù)任何代碼都無法再修改。這里要分兩種情況看客戶端調(diào)用了 CoInitializeSecurity并且傳入了認證級別參數(shù)。這種情況下如果傳入的級別低于 4更新啟用后就會被服務(wù)器拒絕??蛻舳藳]有調(diào)用 CoInitializeSecurity。此時操作系統(tǒng)會按照默認 DCOM 設(shè)置替它調(diào)用一次認證級別來自 DCOMCNFG 里的默認值。如果默認設(shè)置正確比如默認認證級別是「數(shù)據(jù)包完整性」客戶端不會受影響。我自己排查過的一個案例某 OPC 客戶端軟件是 C 寫的代碼里明確調(diào)用了 CoInitializeSecurity傳入的是 RPC_C_AUTHN_LEVEL_CONNECT級別 1。在 2021 年 6 月前完全正常但注冊表強制啟用后所有遠程 OPC 連接全部失敗。這類問題只能找軟件廠商出補丁相當于從源碼層面改認證級別。2.4 服務(wù)器端為什么 DCOMCNFG 反而更安全服務(wù)器端的邏輯和客戶端不一樣。多數(shù) OPC Classic 服務(wù)器比如 Matrikon OPC Server不直接在代碼里調(diào) CoInitializeSecurity而是通過 DCOMCNFG 工具配置安全權(quán)限。這就意味著服務(wù)器端的認證級別是管理員在圖形界面里設(shè)的改起來相對容易。但要注意DCOMCNFG 里有兩套設(shè)置一個是「默認 DCOM 設(shè)置」——影響所有未單獨配置的 COM 應(yīng)用另一個是對每個具體 OPC 服務(wù)器對象的「自定義 DCOM 設(shè)置」——優(yōu)先級更高。KB5004442 啟用后系統(tǒng)強制的是服務(wù)器的激活A(yù)ctivation認證級別而不是調(diào)用的認證級別。很多人只改了調(diào)用Call級別沒改激活A(yù)ctivation級別結(jié)果依然是連接失敗。服務(wù)器端受影響相對小但配置錯了照樣翻車。3. 事件日志里找答案10036、10037、10038 三類 DCOM 錯誤怎么讀3.1 服務(wù)器的 10036激活請求被策略拒絕啟用新安全功能后如果 DCOM 服務(wù)器端檢測到有客戶端用低于數(shù)據(jù)包完整性的認證級別來激活它系統(tǒng)日志里會寫入事件 ID 10036。這條事件記錄在服務(wù)器上消息長這樣服務(wù)器端身份驗證級別策略不允許用戶 %1%2 SID (%3) 從地址 %4 激活 DCOM 服務(wù)器。請將激活身份驗證級別至少提升為在客戶端應(yīng)用程序中 RPC_C_AUTHN_LEVEL_PKT_INTEGRITY。其中 %1 是域名%2 是用戶名%3 是用戶 SID%4 是客戶端 IP 地址。這條日志最有價值的字段是 %4——它直接告訴你「是誰從哪里來的請求被拒了」。遇到這條事件優(yōu)先去查對應(yīng)客戶端程序用了什么認證級別而不是先懷疑服務(wù)器權(quán)限配置。實際操作中我一般會用 PowerShell 把近期相關(guān)的 10036 事件拉出來看Get-WinEvent -FilterHashtable { LogName System Id 10036 StartTime (Get-Date).AddDays(-7) } | Select-Object TimeCreated, Message | Format-List這段命令的意思是在系統(tǒng)日志里篩選過去 7 天中事件 ID 為 10036 的記錄然后列出每條的時間和完整消息內(nèi)容。-FilterHashtable比-FilterXPath寫起來更簡潔適合現(xiàn)場快速排查。如果你要精確到某個 IP可以在 Message 字段里用Where-Object再做一次過濾比如加一個Where-Object { $_.Message -like *192.168.* }。3.2 客戶端的 10037 和 10038分清「顯式設(shè)置」和「默認設(shè)置」的差別10037 和 10038 都寫在客戶端那臺機器上但它們代表的場景完全不同。10037 是客戶端程序在代碼里顯式指定了認證級別而且這個級別低于 510038 是客戶端程序沒有顯式指定由系統(tǒng)按默認激活認證級別代勞而這個默認值低于 5。10037 的消息里會帶 %5表示客戶端顯式設(shè)置的認證級別值10038 的 %5 則是系統(tǒng)使用的默認認證級別值。這兩條事件都在客戶端日志里找Get-WinEvent -FilterHashtable { LogName System Id 10037, 10038 } | Select-Object Id, TimeCreated, {NApplication;E{$_.Properties[0].Value}}, {NPID;E{$_.Properties[1].Value}}, {NCLSID;E{$_.Properties[2].Value}}, {NAuthLevel;E{$_.Properties[4].Value}} | Format-Table -AutoSize這里的Properties數(shù)組順序?qū)?yīng)事件消息里的占位符第 0 個是應(yīng)用程序路徑第 1 個是 PID第 2 個是 CLSID第 4 個在 10037 里是顯式認證級別、在 10038 里是默認認證級別。用這種方式格式化輸出比直接看原始消息更清晰尤其是一次抓幾十條事件的時候??吹?CLSID你可以去注冊表里反查它對應(yīng)哪個 COM 組件從而確定是哪個 OPC 客戶端軟件干的。3.3 用事件日志時間線還原故障全過程排查 OPC 連接故障時不要只看單條事件。我習(xí)慣把三臺機器客戶端、服務(wù)器、域控如果涉及的事件日志時間線對齊來看客戶端先出現(xiàn) 10037 或 10038緊接著服務(wù)器出現(xiàn) 10036說明是認證級別被拒如果客戶端沒有事件、服務(wù)器也沒有事件但連接就是斷了那問題多半在網(wǎng)絡(luò)層面或 DCOM 端口配置上跟這次安全更新無關(guān)。有個細節(jié)值得注意10036、10037、10038 這三類事件僅在特定 Windows 版本上可用。比如 Windows Server 2022 是 2021 年 9 月 27 日之后、Windows 10 2004/20H2/21H1 是 2021 年 9 月 1 日之后。如果你在 Windows Server 2016 上找不到這些事件先確認補丁是否裝到位——沒有這些事件 ID不等于安全強化沒生效可能只是舊系統(tǒng)還沒引入事件記錄功能。4. 三階段時間表與注冊表操作從測試啟用到永久強制4.1 第一階段2021 年 6 月 8 日到 2022 年 6 月 13 日默認禁用手動啟用測試KB5004442 在 2021 年 6 月 8 日發(fā)布時新安全功能默認處于關(guān)閉狀態(tài)微軟給了一個注冊表項來手動開啟。這個階段的目的是讓大家在非生產(chǎn)環(huán)境測試影響。你要做的不是直接改生產(chǎn)系統(tǒng)而是先搭一套測試環(huán)境把注冊表項打開然后跑一遍完整的 OPC 通信鏈路驗證。注冊表操作路徑如下項目值注冊表路徑HKLM\SOFTWARE\Microsoft\Ole\AppCompat值名稱RequireIntegrityActivationAuthenticationLevel類型REG_DWORD值數(shù)據(jù)0 禁用1 啟用用命令行設(shè)置reg add HKLM\SOFTWARE\Microsoft\Ole\AppCompat /v RequireIntegrityActivationAuthenticationLevel /t REG_DWORD /d 1 /f/v指定值名稱/t聲明類型是 DWORD/d 1表示寫入數(shù)值 1 即啟用/f強制覆蓋已存在的同名值。執(zhí)行完必須重啟系統(tǒng)注冊表項才會被 DCOM 運行時讀取。我當時測試的時候只運行了命令沒重啟結(jié)果折騰了半小時以為是命令寫錯路徑實際上就是沒生效——這個坑后面細說。4.2 第二階段2022 年 6 月 14 日到 2023 年 3 月 13 日默認啟用注冊表可關(guān)從 2022 年 6 月 14 日開始Windows 默認啟動新安全功能但你仍然可以通過把注冊表值設(shè)為 0 來臨時禁用。微軟留這個窗口期是為了給軟件廠商爭取時間發(fā)布兼容更新。對一線運維來說這個階段最穩(wěn)妥的做法是先啟用安全功能跑一段時間收集所有告警和事件日志確認哪些 OPC 組件不兼容然后聯(lián)系廠商要補丁。如果你在產(chǎn)線上一時半會兒等不到廠商更新可以臨時禁用注冊表項恢復(fù)通信但禁用期間系統(tǒng)暴露在 CVE-2021-26414 風(fēng)險之下。我建議設(shè)置一個明確的恢復(fù)時間點并在服務(wù)器上留好操作記錄免得三個月后忘了自己關(guān)過這個開關(guān)。reg add HKLM\SOFTWARE\Microsoft\Ole\AppCompat /v RequireIntegrityActivationAuthenticationLevel /t REG_DWORD /d 0 /f注意這臺機器上如果有多個依賴 DCOM 的應(yīng)用禁用注冊表會影響所有應(yīng)用不只是 OPC。禁用前確認有沒有其他更嚴格的安全策略在網(wǎng)關(guān)或防火墻上兜底。4.3 第三階段2023 年 3 月 14 日之后永久強制注冊表開關(guān)失效2023 年 3 月 14 日之后微軟徹底移除了禁用開關(guān)——注冊表項即使設(shè)成 0 也不再生效。到這個節(jié)點唯一的選擇只剩三條路從 OPC 客戶端/服務(wù)器廠商獲取兼容更新版本用 OPC Tunneller 之類的軟件把 OPC Classic 通信封裝成獨立的 TCP 隧道繞過 DCOM遷移到 OPC UA直接告別 DCOM 依賴。我之前在某個水處理項目里就遇到這種情況客戶有 30 多個 OPC 采集點用的舊版采集器不支持數(shù)據(jù)包完整性認證廠商已經(jīng)停止維護。最后我們評估下來用 OPC UA 網(wǎng)關(guān)做協(xié)議轉(zhuǎn)換把老的 OPC DA 封裝成 UA 服務(wù)花了三天完成切換。這筆賬要早點算拖到強制階段再動手就只能停機窗口里趕工。4.4 驗證注冊表生效不只是看值設(shè)置完注冊表并重啟后怎么確認新安全功能真的在起作用一個有效的辦法是直接在測試環(huán)境里故意用一個低認證級別的客戶端去連服務(wù)器。如果沒有生效連接會成功如果生效了系統(tǒng)日志里會立刻出現(xiàn) 10036。你也可以用 PowerShell 檢查注冊表當前值Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Ole\AppCompat -Name RequireIntegrityActivationAuthenticationLevel輸出結(jié)果里RequireIntegrityActivationAuthenticationLevel的值為 1 代表啟用0 或未定義代表禁用。注意Get-ItemProperty如果值不存在會報錯這是正常的不代表注冊表有問題——很多機器上根本沒有這個鍵默認就是禁用狀態(tài)。5. 避坑記錄KB5004442 在 OPC 現(xiàn)場的五個常見翻車點5.1 改完注冊表不重啟白忙活一場現(xiàn)象注冊表值已經(jīng)改成 1但跑 OPC 連接測試還是正?;蛘哌€是報錯跟沒改一樣。原因DCOM 配置在系統(tǒng)啟動時被 Ole32.dll 加載注冊表變更不會實時熱加載。很多人改完注冊表之后直接跑測試結(jié)果操作的還是舊配置。解決改注冊表后必須重啟系統(tǒng)。測試環(huán)境可以接受生產(chǎn)環(huán)境建議先規(guī)劃停機窗口。重啟后用第 4.4 節(jié)的方法確認值已生效再做連接測試。5.2 只改 DCOMCNFG 的調(diào)用認證級別忘了激活級別現(xiàn)象DCOMCNFG 里已經(jīng)把「身份驗證級別」改成了「數(shù)據(jù)包完整性」但 OPC 客戶端連服務(wù)器還是被拒事件日志照樣出 10036。原因KB5004442 強制檢查的是 DCOM 激活A(yù)ctivation階段的認證級別不是調(diào)用Call階段。DCOMCNFG 的常規(guī)設(shè)置頁里那個身份驗證級別下拉框大部分時間影響的是調(diào)用階段激活級別在高級設(shè)置里很多人根本沒注意到。解決在 DCOMCNFG 里找到目標 OPC 服務(wù)器的組件打開屬性 → 高級把「默認模擬級別」下方或安全選項卡里的激活身份驗證級別同步設(shè)置為「數(shù)據(jù)包完整性」值為 5。如果是自定義配置每個 OPC 服務(wù)器對象都要單獨檢查不能只改默認值。5.3 誤以為所有 OPC 通信都走 135 端口漏改防火墻現(xiàn)象注冊表啟用后OPC 客戶端能 ping 通服務(wù)器但 DCOM 連接就是建立不起來事件日志里也沒有 10036。原因DCOM 建立連接的初始協(xié)商走 TCP 135 端口但實際數(shù)據(jù)通道會動態(tài)分配一個隨機端口默認范圍 1024-65535。很多現(xiàn)場防火墻只放行了 135導(dǎo)致協(xié)商成功但數(shù)據(jù)通道被攔。也不是每次通都失敗——Windows 會緩存端口分配表現(xiàn)得很隨機。解決用Dcomcnfg.exe打開組件服務(wù)右鍵「我的電腦」→ 屬性 → 默認屬性把「默認 DCOM 端口范圍」固定成一個窄段比如 55000-55050然后在防火墻上放行 TCP 55000-55050。這個操作要在所有 OPC 服務(wù)器上重復(fù)做。注意固定端口范圍本身有安全風(fēng)險端口段越窄越安全但也要留夠并發(fā)連接數(shù)。5.4 把 10038 當成程序 Bug實際是系統(tǒng)默認級別過低現(xiàn)象客戶端事件日志出現(xiàn) 10038消息說「默認激活身份驗證級別為 %5」但程序本身是自己開發(fā)的代碼里沒設(shè)置過認證級別。原因10038 表示程序沒有顯式調(diào)用 CoInitializeSecurity系統(tǒng)按默認值代替程序執(zhí)行。默認激活認證級別來自 DCOMCNFG 的「默認屬性」頁如果那里的身份驗證級別設(shè)的是「連接」值 1甚至「無」值 0就會觸發(fā) 10038。解決先在 DCOMCNFG 默認屬性里把身份驗證級別設(shè)為「數(shù)據(jù)包完整性」觀察 10038 是否消失。如果消失了說明問題在系統(tǒng)默認配置如果還在說明有代碼在某個間接路徑上調(diào)了 CoInitializeSecurity——這時候就得翻代碼或者找廠商。5.5 把注冊表值寫成字符串導(dǎo)致類型不匹配現(xiàn)象手動用注冊表編輯器添加值輸入了 1但 reg query 查出來類型顯示為 REG_SZ系統(tǒng)不認。原因DCOM 運行時讀取的是 DWORD 類型你在注冊表編輯器里新建值的時候選的類型不對或者直接復(fù)制了網(wǎng)上別人發(fā)的 REG_SZ 寫法。解決用reg add命令創(chuàng)建明確指定/t REG_DWORD。如果已經(jīng)建錯了先刪除錯的值再重建reg delete HKLM\SOFTWARE\Microsoft\Ole\AppCompat /v RequireIntegrityActivationAuthenticationLevel /f reg add HKLM\SOFTWARE\Microsoft\Ole\AppCompat /v RequireIntegrityActivationAuthenticationLevel /t REG_DWORD /d 1 /f第一條命令/f表示不確認直接刪除第二條命令重建。完成后務(wù)必用reg query驗證類型reg query HKLM\SOFTWARE\Microsoft\Ole\AppCompat /v RequireIntegrityActivationAuthenticationLevel6. 遷移到 OPC UA 之前的最后一搏三步驗證法判斷老系統(tǒng)是否還有救在決定是否遷移到 OPC UA 之前我建議你把下面這套驗證流程完整跑一遍。它能幫你快速判斷現(xiàn)有 OPC Classic 系統(tǒng)在 KB5004442 強制階段下還有沒有救同時避免拍腦袋上遷移方案導(dǎo)致項目延期。第一步確認所有 OPC 客戶端的 CoInitializeSecurity 行為。寫一個小工具用 Get-Process 列出所有運行中的 OPC 客戶端進程然后用 Get-WinEvent 檢查最近 30 天內(nèi)有沒有出現(xiàn)過 10037 事件。如果客戶端進程一次 10037 都沒有說明它的認證級別可能是由系統(tǒng)默認值決定的你還有機會通過調(diào) DCOMCNFG 默認屬性解決如果頻繁出現(xiàn) 10037說明代碼里寫死了低認證級別得等廠商更新。第二步在非生產(chǎn)環(huán)境完整模擬強制階段。設(shè)置注冊表值為 1重啟然后把 DCOMCNFG 里所有相關(guān)組件的激活認證級別和調(diào)用認證級別全部改為「數(shù)據(jù)包完整性」跑一遍采集鏈路、寫操作、報警上報AE的完整測試。這一步要特別注意 OPC DA 的寫操作——有些采集器讀數(shù)據(jù)走 DCOM 沒問題但寫操作走了另一條路徑認證級別要求不同容易被忽略。第三步檢查 OPC 服務(wù)器端是否有替代通信通道。如果服務(wù)器本身支持 OPC UA現(xiàn)在很多廠家在同一個服務(wù)里同時提供 DA 和 UA 接口直接切 UA 端口就行成本最低。如果不支持考慮 OPC Tunneller——這類軟件的原理是在兩臺機器上分別裝一個代理代理之間用普通 TCP 通信兩端各自身邊的 OPC 組件只做本機 COM 調(diào)用完全不跨機器走 DCOM。好處是改動最小壞處是引入了私有協(xié)議依賴。我在一個汽車零部件工廠里用過這種方式把 20 多臺老設(shè)備的采集切換時間控制在了一個周末。三套方案對比下來最直接的判斷標準是客戶端是否有可用更新。有更新優(yōu)先打補丁沒有更新優(yōu)先看服務(wù)器端是否自帶 UA兩者都不行再上 Tunneller。遷移到 OPC UA 是長期最優(yōu)解但工程改造量最大涉及的不僅是通信層連上位機組態(tài)軟件的連接配置都要重做。這輪排查里唯一不能做的事是繼續(xù)指望注冊表開關(guān)。微軟在 2023 年 3 月 14 日之后已經(jīng)把這條路焊死了。從那以后我每次接手帶 OPC Classic 的項目第一件事就是先查服務(wù)器 Windows 版本和補丁日期確認是否已經(jīng)進入強制階段再決定是做兼容測試還是直接規(guī)劃 UA 遷移。這個習(xí)慣幫我避開了好幾次產(chǎn)線停機事故希望也能幫到你。本文還有配套的精品資源點擊獲取