在公用事業機構中,IT/OT邊界並非網路圖上的一條清晰分界線。它更像是一層可滲透的薄膜,資料可以雙向流動:COBOL批次程式產生PLC使用的設定點設定檔;RPG程式讀取SCADA歷史資料用於計費和監管報告;傳統的C語言橋接程式將大型機輸出轉換為分散式控制系統可理解的格式;JCL作業流根據運行所依賴的時間交換,大型機輸出轉換為分散式控制系統可理解的格式;JCL作業流根據運行資料表所依賴的時間,資料排程跨越,資料排程跨越點邊界的節點。管理這種資料流的軟體既非純粹的IT軟體,也非純粹的OT軟體。它是公用事業機構運作的連結組織,也是現代化團隊在轉型專案啟動時最缺乏分析能力的程式碼類別。
能源產業正經歷歷史上最重大的數位轉型之一。隨著公用事業公司利用智慧電網、互聯變電站、工業控制系統 (ICS) 和高級自動化技術實現基礎設施現代化,營運技術 (OT) 網路之間的互聯程度也達到了前所未有的高度。這種互聯並沒有消除遺留程式碼層,反而使其變得更加關鍵,因為每個新的智慧電網終端和雲端分析平台都依賴於幾十年前編寫的應用程式所提供的資料。如果不了解這些應用程式在營運資料鏈中的作用,就貿然對其進行現代化改造,這並非真正的現代化,而是一場破壞,其影響遠不止於資料中心,還會波及到實體基礎設施。
「SCADA 鄰近」的真正意義
「SCADA相關軟體」一詞指的是與營運技術系統對接的IT端軟體,而非SCADA軟體本身、PLC韌體或RTU嵌入式程式碼,而是負責向這些系統輸入資料和接收資料的業務應用層。這一類別規模龐大,但分析不足,並且與企業應用組合中的其他軟體有著本質差異。
在典型的公用事業環境中,與SCADA系統相關的代碼包括:
速率和設定值計算程式。這些 COBOL 和 PL/I 程式用於計算負載設定值、電壓目標值、壓力閾值和運行限值,並以設定檔或直接資料饋送的形式交付給 SCADA 系統。這些程序編碼了法規遵循要求、工程規範和實體安全限值。錯誤的計算結果不會在報告中產生錯誤的數值,但會導致控制系統根據錯誤的運行設定值採取行動。
歷史數據使用者。這些RPG和COBOL程式從SCADA歷史資料庫讀取運行數據,用於計費、監管報告和效能分析。這些程序依賴歷史資料庫產生的特定資料格式、時間戳約定和工程單位定義。歷史資料庫輸出格式的更改,或IT端使用者程式的更改,都可能導致計費計算或監管申報出現隱性錯誤。
協議橋接程序。這些自訂 C 程式用於在主機輸出格式和 DCS(分散式控制系統)及 SCADA 系統所使用的檔案或網路介面之間進行轉換。這些橋接程式實現了特定的協議,例如 Modbus、DNP3、IEC 61850 和廠商專有格式,並且對訊息結構、位元組順序和時序等方面做了硬編碼,而這些假設在文件中並不存在。
批次處理到即時資料路徑。 JCL作業流程用於在特定時間視窗內調度和排序跨 IT/OT 邊界的資料交換。例如,公用事業公司的夜間批次運行可能會產生配置數據,這些數據必須在早晨運行開始前提供給 SCADA 系統。這種時間依賴性隱含在調度程式配置和控制室的運作預期中,並未在應用程式程式碼的任何位置進行記錄。
警報和事件處理程序。這些程式接收來自SCADA系統的警報記錄,應用分類和路由邏輯,產生工單,並產生合規性記錄。警報分類邏輯(即哪些事件需要哪些合規報告,以及需要在哪些時間範圍內提交)通常嵌入在程序代碼中,這些代碼已經累積了數十年的法規變更。
這段程式碼由工程師和IT開發人員共同擁有,但他們都無法完全理解。當現代化改造專案提出「我們可以改變什麼?」的問題時,對於SCADA相關程式碼,答案幾乎總是「比你想像的要少,而且需要比你計劃的更多的分析」。
為什麼標準現代化分析在這裡失效
大多數企業現代化分析框架都假設被分析的程式碼只控制資料和業務邏輯,程式變更只會產生不同的資料結果,而不會對物理世界造成任何影響。 SCADA 相關代碼在以下四個方面打破了這個假設。
數據錯誤的物理後果
在標準的計費系統中,錯誤的計算會導致錯誤的帳單。這種錯誤是可發現的、可逆的,且影響範圍有限。但在與SCADA系統相關的程式碼中,錯誤的計算可能會導致錯誤的設定值,即控制系統透過調整物理參數(例如壓力、電壓、流量和溫度)來控制的目標值。其後果並非僅僅是資料庫中出現錯誤的數字,而是物理過程超出了其預期參數範圍運行,其後果可能包括效率低下、設備損壞甚至安全事故。
資料錯誤與實際後果之間的這種不對稱性,是SCADA相關程式碼無法像標準業務程式碼一樣進行風險評估的根本原因。從產生有效輸出的角度來看「運行正常」的更改,可能仍然會產生操作上錯誤的輸出,儘管這些輸出在資料類型的合法範圍內,語法上也有效,但對於其所代表的操作環境而言,卻是物理上錯誤的。
靜態分析無法建模的時間依賴性
與SCADA系統相鄰的IT端程式通常存在一些時間限制,這些限制在實際運作中至關重要,但靜態分析工具卻無法察覺。例如,產生配置資料的程式必須在SCADA系統的輪詢週期讀取資料之前完成;匯總歷史資料的批次作業必須在監管報告要求的時間間隔結束時間戳之前完成;轉送警報的橋接程序必須在控制室操作規程規定的回應時間內處理事件。
這些時序約束存在於實用程式的操作流程、調度器配置以及編寫程式的開發人員的隱性理解中,而非原始程式碼本身。專注於程式碼結構和資料流的靜態分析工具無法洞察程式碼之外存在的時序要求。
實際意義在於:對SCADA相關程式碼進行現代化分析時,必須明確記錄每個相關程式的運行時間上下文。這不僅需要程式碼分析,還需要具備運作知識,與控制室操作員進行訪談,審查合規性計劃,分析調度程式作業的依賴關係。
安全功能識別
IEC 61511(製程工業領域的功能安全)和 IEC 61508(電氣/電子/可程式電子安全相關係統的功能安全)定義了執行安全功能的軟體的認證要求。根據這些標準獲得認證的程式碼並非簡單的可重構以提升可維護性的遺留程式碼。認證針對的是特定的程式碼工件,即認證機構評估的特定二進位檔案的特定版本。即使是為了修復在業務應用中無關緊要的品質問題而更改程式碼,也會使認證失效,並且需要在更改後的程式碼部署到安全功能之前重新進行認證。
許多電力公司擁有與SCADA系統相關的程序,這些程序執行安全相關的計算、過壓檢測、變壓器保護設定值計算和緊急停機邏輯等功能,而IT現代化團隊可能並不了解這些程序是否符合安全認證要求。針對SCADA相關程式碼,首先要分析的問題是:這些程式碼中是否有任何功能執行安全功能?如果有,具體是哪些功能?它們需要通過哪些認證?修改這些程式碼需要哪些步驟?
硬體與協定耦合
協定橋接程式和嵌入式介面程式碼直接依賴它們所實現的硬體和協定版本。一個使用特定功能碼、暫存器對映和逾時值來實現 Modbus RTU(針對特定供應商的特定型號 RTU)的程序,並非通用地實現了 Modbus,而是實現了該特定組合,其假設可能不適用於任何其他配置。
在分析這段程式碼以進行現代化改造時,其依賴關係不僅在於 COBOL 或 C 原始碼,還在於 RTU 設備型號、韌體版本、實體佈線拓撲結構以及網路配置。即使程式原始碼保持不變,任何這些因素的變更都可能導致介面失效。而程式原始碼的變更也可能導致看似無關的介面失效,因為橋接器的設計初衷是為了彌補廠商特定的協定缺陷,而這些缺陷往往沒有在任何地方記錄下來。
IT/OT邊界:程式碼的所在
普渡模型(ISA-99 / IEC 62443)定義了工業控制系統網路的概念架構,分為五個層次,從第 0 層的實體過程到第 4 層的企業業務系統。公用事業環境中與 SCADA 相關的遺留代碼通常位於第 3 層和第 4 層,即製造營運和企業網路區域,但其資料流會雙向跨越到第 2 層(SCADA 監控層)。
IT/OT邊界(位於第3層和第2層之間)是安全和營運風險最高的地方。國家級駭客會在攻擊發生前數月就預先部署在OT網路中,而勒索軟體組織現在會部署針對ICS(工業控制系統)設計的惡意載荷,旨在鎖定人機介面(HMI)並導致生產中斷。最常見的入口點並非嵌入式SCADA軟體,而是IT/OT邊界層,IT端程式碼和OT端系統透過介面交換數據,而這些介面的設計初衷是為了確保運作可靠性,而非抵禦攻擊。
了解跨越此邊界的具體程序及其功能,是現代化規劃和安全態勢提升的前提。例如,從 SCADA 歷史資料庫讀取資料並將結果寫入計費資料庫的程序,其跨越邊界的方向是單向的;而計算設定值並將其寫入 PLC 讀取的配置目錄的程序,其跨越邊界的方向則是反向的。兩者都與 SCADA 系統相鄰。然而,它們都不會出現在 SCADA 網路掃描或 IT 應用清單中,因此常常被系統性地忽略。
SCADA相關程式特有的程式碼模式
工程單位計算規則
工程單位 (EU) 計算將原始感測器值(通常是來自類比數位轉換器的整數計數)轉換為具有特定單位、量程和精度的物理測量值。壓力變送器的 4-20mA 電流迴路產生原始計數;EU 計算將其轉換為 PSI 或 bar,並進行正確的零點和量程校準。
這段計算程式碼具有一些區別於標準業務邏輯的特點:
科博爾
CALCULATE-PRESSURE-EU.
* RAW-COUNT ranges 0-4095 (12-bit ADC)
* SENSOR-ZERO-OFFSET = 819 (4mA = 20% of 4095)
* SENSOR-SPAN = 3276 (16mA span = 80% of 4095)
* RANGE-LOW-PSI = 0
* RANGE-HIGH-PSI = 500
COMPUTE EU-PRESSURE-PSI =
(RAW-COUNT - SENSOR-ZERO-OFFSET) /
SENSOR-SPAN *
(RANGE-HIGH-PSI - RANGE-LOW-PSI)
+ RANGE-LOW-PSI
IF EU-PRESSURE-PSI < RANGE-LOW-PSI OR
EU-PRESSURE-PSI > RANGE-HIGH-PSI
MOVE 'RANGE-VIOLATION' TO ALARM-STATUS
PERFORM GENERATE-ALARM
END-IF.
此計算中的常數, SENSOR-ZERO-OFFSET, SENSOR-SPAN, RANGE-LOW-PSI, RANGE-HIGH-PSI這些參數對應於物理儀器的規格。如果它們是硬編碼的(在舊代碼中很常見),那麼物理儀器的任何更改都需要修改代碼。如果這些參數是錯誤的(由於儀器重新校準、更換或初始配置錯誤),那麼程式產生的所有記錄中的 EU 值都會系統性地不正確。靜態分析可以找到這些常數的定義位置;只有運行驗證才能確認它們對於目前的儀器配置是否正確。
警報生成和分類邏輯
在公用事業環境中,警報產生代碼是與SCADA系統密切相關的代碼中,監管要求最嚴格的代碼之一。北美電力可靠性委員會(NERC)針對電力公司的關鍵基礎設施保護(CIP)標準、美國核管理委員會(NRC)針對核設施的要求以及美國環保署(EPA)針對供水和污水處理公司的報告要求,都明確規定了哪些事件必須產生警報、警報訊息必須包含哪些內容以及必須在什麼時間範圍內報告。
科博爾
CLASSIFY-ALARM.
EVALUATE TRUE
WHEN EU-PRESSURE-PSI > HIGH-HIGH-LIMIT
MOVE 'HH' TO ALARM-PRIORITY
MOVE 'NERC' TO REPORTING-FLAG
PERFORM GENERATE-NERC-EVENT
WHEN EU-PRESSURE-PSI > HIGH-LIMIT
MOVE 'HI' TO ALARM-PRIORITY
MOVE 'LOG' TO REPORTING-FLAG
WHEN EU-PRESSURE-PSI < LOW-LIMIT
MOVE 'LO' TO ALARM-PRIORITY
MOVE 'LOG' TO REPORTING-FLAG
WHEN EU-PRESSURE-PSI < LOW-LOW-LIMIT
MOVE 'LL' TO ALARM-PRIORITY
MOVE 'NERC' TO REPORTING-FLAG
PERFORM GENERATE-NERC-EVENT
END-EVALUATE.
此代碼中的警報限制 HIGH-HIGH-LIMIT, HIGH-LIMIT, LOW-LIMIT, LOW-LOW-LIMIT這些參數是具有監管意義的運作參數。這些限值的變化既會影響控制系統的運行,也會影響電力公司的監管報告義務。任何涉及警報分類代碼的現代化改造項目,其變更控制流程都必須經過監管事務部門的審查,而不僅僅是工程部門的簽署認可。
協議橋接實現
傳統協定橋接程式是SCADA相關程式碼中最難現代化改造的程式之一,因為它們的依賴關係最難列舉。這類程式針對特定裝置實作了特定協定版本,並在程式碼中對未公開的廠商特定行為進行了補償。
c
/* Legacy Modbus RTU bridge -- written for Modicon 984 PLCs, circa 1998 */
/* NOTE: 984 series uses 1-based register addressing, not 0-based */
/* Function code 03 only -- 984 does not support FC 04 */
/* Max 60 registers per request -- 984 firmware limitation */
#define MODBUS_FC03_READ_HOLDING 0x03
#define MAX_REGS_PER_REQUEST 60 /* 984 firmware limit, not Modbus spec */
#define REGISTER_OFFSET 1 /* 984 uses 1-based addressing */
int read_holding_registers(int start_reg, int count, uint16_t *buffer) {
/* Compensate for 984 1-based addressing */
uint16_t adjusted_start = (uint16_t)(start_reg + REGISTER_OFFSET);
if (count > MAX_REGS_PER_REQUEST) {
/* 984 will return error if count exceeds 60 */
/* Split into multiple requests silently */
return read_registers_chunked(adjusted_start, count, buffer);
}
/* ... */
}
這段程式碼隱含了四個關於特定PLC型號的假設,而這些假設並非Modbus規範的一部分:暫存器尋址從1開始、僅支援功能碼03、最多60個暫存器以及針對較大請求的分塊處理。這些假設均未出現在Modbus文件中。它們是Modicon 984的特定廠商行為,記錄在1998年的一份硬體手冊中,該手冊可能已無法取得。如果在未理解這些假設的情況下對該橋接器進行現代化改造,或者將PLC更換為使用標準0開始尋址的新型號,則每次讀取寄存器都會傳回一個寄存器位址偏移量的錯誤值。
現代化之前的分析:必須生產什麼
在修改、重構或取代任何與 SCADA 相關的程式碼之前,分析必須產生一組超出標準企業現代化分析所提供的成果。
運行功能清單。每個與SCADA系統相關的程式都必須按其運作功能進行分類:例如,EU計算、設定點交付、歷史資料使用者、警報產生、協定橋接、批次到即時轉換路徑等。此分類決定了變更流程的參與人員,僅由IT工程師參與,還是由包括控制工程師、維運人員和合規人員在內的跨職能團隊參與。
IT/OT邊界交叉圖。所有跨越IT/OT邊界的資料流都必須記錄在案:哪個程式產生數據,資料格式如何,產生時間表如何;哪個OT系統使用資料;以及如果資料不正確、延遲或缺失會造成什麼後果。此圖是SCADA相鄰層的運作風險概況。
安全功能識別。每個程序都必須根據 IEC 61511、IEC 61508、NERC CIP 或其他適用標準進行評估,以確定其是否執行安全功能。被識別為安全功能代碼的程序需要單獨的變更控制、監管通知,並且可能需要重新認證,這些程序的現代化時間表與標準業務代碼截然不同。
硬編碼運行參數註冊表。所有代表運行參數、感測器校準值、警報限值、協議約束、時間閾值的硬編碼常數都必須被識別,並記錄其運行含義,且必須根據當前儀器規範進行驗證。此註冊表將成為配置管理流程的輸入,該流程將硬編碼常數替換為外部管理的配置。
時序依賴關係文件。每個程式的時序上下文、程式必須完成的操作視窗、強制執行這些視窗的調度器依賴項以及依賴程式完成的操作流程,都必須明確記錄下來。這份文檔是驗證現代化實現的規範依據。
協定和介面規範。每個協議橋接程序都必須進行分析,以識別廠商特定的行為、協議版本假設和設備特定的補償機制。最終產生一份規範文檔,可用於驗證替換實現,確認所有補償機制都已保留,即使是原始規範中未包含的機制。
哪些現代化方法行之有效,哪些方法無效?
絞殺圖模式,需謹慎應用。絞殺圖模式是指在原始功能的基礎上逐步建立新功能,並逐步進行路由,最終逐步停用舊功能。此模式適用於執行 IT 端資料處理(例如歷史資料使用、計費計算)的 SCADA 相關程式碼。在過渡期間,舊程式繼續運作;新實作會產生並行輸出,並在舊程式停用前驗證其等效性。
絞殺圖不適用於即時路徑。對於位於即時資料路徑中的程序,由於新舊程式並行運行會產生衝突的運行影響,因此無法安全地並行運行,切換過程必須瞬時完成,並且在任何生產切換之前都必須進行離線驗證。執行平行設定點計算程序,如果其計算值與目前程式不同,則會向控制系統發送衝突的設定點。
在程式碼變更之前進行配置外部化。對於包含硬編碼運行參數的程序,最安全的現代化改造第一步是將這些參數外部化到設定檔或資料庫中,而無需更改計算邏輯。這樣,參數就變得可見、可管理且可審計,而無需觸及具有實際運作意義的計算程式碼。外部化參數的風險遠低於重構計算邏輯。
安全功能代碼:應進行分析和文件記錄,而非重構。已通過安全認證的代碼應在現代化規劃階段進行分析和文件記錄,但對其的任何更改都應推遲到經過監管協調的專門重新認證計劃中進行,而不是作為一般現代化計劃的一部分。在大規模現代化過程中使安全認證失效的風險,與任何典型的現代化收益相比都是不值得的。
SMART TS XL 支援SCADA相關遺留程式碼分析
SMART TS XL“ 靜態程式碼分析 適用於SCADA相鄰邊界的IT側,即運行在大型主機和中型機系統上的COBOL、JCL、RPG、PL/I和C程序,這些程式產生、轉換或使用的資料會跨越到OT環境。對於此類程式碼,結構分析會產生現代化改造前分析所需的操作功能清單和硬編碼參數註冊表。
應用程式依賴關係映射建構了 IT/OT 邊界交叉圖:它涵蓋了所有寫入 SCADA 系統所使用檔案介面的程式、所有產生具有運行時間意義的資料的 JCL 作業步驟,以及從 OT 來源到 IT 用戶的歷史資料路徑中的所有程式。當公用事業公司的計費 COBOL 程式透過中間 C 橋接程式讀取歷史資料時,依賴關係映射會將 COBOL 到 C 的依賴關係和 C 到歷史資料的依賴關係表示為一條連接鏈,從而使完整的 IT/OT 交叉過程清晰可見,而不僅僅通過運行事件才能發現。
影響分析功能對於與SCADA系統相關的程式碼特別關鍵,因為它可以在任何建議變更實施之前,列出其可能產生的影響範圍。如果對與警報產生代碼、設定點交付代碼和歷史資料寫入代碼共享(透過副本)的EU計算程序進行修改,則必須在修改計算之前了解所有三個次要影響。在標準業務代碼中,錯誤的變更會導致錯誤的資料。在與SCADA系統相關的程式碼中,它會導致錯誤的運作參數。
JCL擴展功能揭示了批次層的時序結構:哪些作業按什麼順序運行,哪些數據集輸出為哪些後續步驟提供數據,以及哪些作業流受運行要求的時間限制。這是 SCADA 鄰近現代化改造所需的時序依賴性文件的結構性證據基礎。
企業級搜尋功能使得大規模實現硬編碼參數註冊表成為可能:只需幾秒鐘,即可在數百萬行代碼中,查找環境中所有 COBOL、C、RPG 和 JCL 代碼中特定工程單位常數、警報限值和硬編碼協議地址的每一次出現。對於管理數十萬行 SCADA 相關遺留程式碼的公用事業公司而言,這項搜尋功能意味著手動審計只需數小時即可完成,而無需耗時數月。
團隊規劃 遺產現代化 公用設施系統, SMART TS XL 它提供IT端的結構分析,使現代化團隊能夠與了解運作環境的OT端控制工程師高效協作。 IT/OT邊界的跨越並非僅靠IT團隊或OT團隊就能安全完成,只有當雙方都對各自系統的結構有準確的了解時,才能安全跨越。
為什麼這段程式碼需要特別關注
公用事業公司對其與SCADA系統相關的遺留程式碼進行現代化改造,並非僅僅是更新舊軟體。他們正在改變連接業務系統和實體基礎設施的軟體層。一旦出錯,後果不僅限於資料錯誤、服務中斷或經濟損失,還會波及到依賴公用事業正常運作的民眾所依賴的實體系統。
這段程式碼的特殊之處,例如資料錯誤的物理後果、靜態分析無法察覺的時序依賴性、安全認證限制以及硬體與協定的耦合,並非反對對其進行現代化改造的理由,而是要求我們在進行任何更改之前對其進行全面理解的理由。本指南中的分析框架正是幫助我們理解這段程式碼的關鍵所在。由此展開的現代化改造方案更加安全,因為變更範圍是基於證據而非假設來定義的,時序依賴性是被記錄下來的而非隱含的,安全功能代碼是被識別出來的而非被意外修改的,IT/OT邊界的跨越也是被繪製出來的,而不是在部署後通過運行事故才發現的。