工業控制系統中安全組態工程保護技術實現
在工控系統中,為了防止核心的工藝代碼的泄露,技術人員往往會對組態工程文件加上密碼。當打開一個有密碼保護的組態工程文件時會需要輸入安全密碼。但是由于組態軟件的設計問題,導致組態工程加密措施并不安全,有些形同虛設,非法的操作者甚至能直接繞過所需的密碼直接打開組態工程文件。
不安全的設計
在前一段時間,對市面上的常見的組態軟件(包括三菱,組態王,施耐德,西門子等上位機軟件)進行安全測試時發現不僅國內的組態軟件存在組態工程密碼繞過問題,一些國外的大廠也存在類似的問題,包括硬編碼的密碼,組態工程密碼沒有作為密鑰加密組態工程文件,不安全的算法實現等。
對于硬編碼密碼的漏洞(如CNVD-2019-30119),廠商快速完成了修復,移除了硬編碼密碼,但是組態工程文件沒有得到“真正”的保護。大多數存在漏洞的組態軟件僅僅將用戶輸入的密碼與真正的密碼(或者密碼hash)進行對比,而沒有使用輸入的密碼加解密組態工程文件,這就導致無論輸入什么密碼,都可以通過逆向手段找到關鍵的跳轉語句,修改指令讓校驗流程始終走向正確的分支(如下圖所示)。對于這類的安全問題,解決方法只能是花費大量的時間和精力重新設計加密機制,并且需要敦促用戶使用更新補丁。這便造成了很多廠商認為這類問題無關緊要,不愿花更多資源投入到漏洞的修復當中。

更安全的工程加密機制
毫無疑問,組態工程文件加密的算法實現一定是需要讓組態工程密碼參與到數據的加解密運算中,否則使用密碼的任何加密存儲形式(sha1 ,md5,sha256等hash算法)都是沒有作用的。在設計組態工程加密的機制要考慮以下原則:
加密算法必須保證非常可靠,能夠防止攻擊者從加密的密文反向推出明文或者密鑰。在這里,可以選擇AES(Advanced Encryption Standard)這類非常成熟的加密算法。
足夠長度的salt是必須的,將salt值附加到密碼后面作為加解密密鑰以此來保證密鑰強度,這樣可以有效抵御字典暴力攻擊。
考慮到用戶如果忘記密碼,軟件生產商必須有能力從用戶的組態工程文件中恢復密碼(當然留下后門密碼肯定是不可取的),所以必須將正確的加密密鑰通過非對稱算法(如RSA2048)加密存到工程文件中,一旦證明了該組態工程文件是該用戶所有的,軟件生產廠商可以使用擁有的私鑰去解密密文從而恢復密碼。
算法選擇應該盡量選擇現成加密庫的算法,例如OpenSSL,減少開發商編寫代碼的成本。
加密流程如下圖所示:

一旦存在有些粗心的用戶忘記了自己的組態工程密碼,只要能證明該組態工程文件為自己所有,那么用戶就可以通過開發商找回密碼。具體找回密碼流程如下圖所示:

工程密碼保護
對于組態工程密碼來說,當用戶輸入正確的組態工程密碼后,上位機軟件會用該密碼解密組態工程文件,并需要將密碼一直存在于內存中,直到用戶關閉組態工程文件才會將內存中保存的工程密碼(期間用戶可能修改密碼)作為密鑰加密組態工程文件并進行保存。整個生命周期如下圖所示:

可以看出,正確的密碼一直保存在內存中,直到工程被關閉。所以,對于內存中的密鑰也需要一定的保護措施,防止其他惡意軟件在組態工程文件打開的情況下通過讀取進程內存空間的方法竊取到敏感的密鑰信息。Windows系統已經內置了一些的函數保護敏感的內存信息(如CryptProtectMemory/CryptUnProtectMemory),Linux平臺上的開發者也可以選擇開源的第三方安全組件實現內存敏感信息加密。
總結
組態工程加解密實現的方法有很多種,本文提供的方法只是一個簡單的例子,讀者可以舉一反三,探索出適合自己的加解密方式。工業控制系統安全不僅需要用戶提高安全意識,同時也需要軟硬件生產廠商高度重視,為用戶提供更好的服務。
【本文是51CTO專欄作者“綠盟科技博客”的原創稿件,轉載請通過51CTO聯系原作者獲取授權】