dede怎么做網(wǎng)站日記搜索點(diǎn)擊軟件
? ? ? ? 工控系統(tǒng)通常是由互聯(lián)設(shè)備所構(gòu)成的大型復(fù)雜系統(tǒng),這些設(shè)備包括類似于人機(jī)界面(HMI)、PLC、傳感器、執(zhí)行器以及其他使用協(xié)商好的協(xié)議進(jìn)行相互通信的設(shè)備。所有交互背后的驅(qū)動力都是軟件,軟件為工控系統(tǒng)中幾乎所有部分的運(yùn)行提供支撐。很多工控系統(tǒng)安全漏洞都?xì)w結(jié)于軟件問題也證明了軟件的無所不在。
? ? ? 據(jù)統(tǒng)計(jì),超過40%的工控系統(tǒng)網(wǎng)絡(luò)安全漏洞都被歸結(jié)為由“不正確的輸入驗(yàn)證”所導(dǎo)致,不正確的輸入驗(yàn)證是指程序員假設(shè)對數(shù)據(jù)進(jìn)行了某種限制,但是事實(shí)并非如此。在使用數(shù)據(jù)之前應(yīng)確保所使用的數(shù)據(jù)正是程序員所期望的數(shù)據(jù),但現(xiàn)實(shí)情況中工控系統(tǒng)軟件安全的現(xiàn)狀與期望值還有很大差距,不正確的輸入驗(yàn)證并不是導(dǎo)致軟件出錯(cuò)的唯一方式,工控系統(tǒng)應(yīng)用程序還可能因?yàn)榘踩珕栴}出錯(cuò)。除了硬件上的漏洞(如芯片設(shè)計(jì)與布局等)、協(xié)議中的漏洞和系統(tǒng)配置中的漏洞之外,工控系統(tǒng)應(yīng)用程序中也存在大量漏洞。
????????(1)緩沖區(qū)溢出的漏洞緩沖區(qū)溢出漏洞在計(jì)算機(jī)安全史中可以追潮到很久之前。緩沖區(qū)是內(nèi)存中用于填充數(shù)據(jù)的一塊連續(xù)區(qū)域,緩沖區(qū)的常見用法是存儲字符串,如“Hello world!”。緩沖區(qū)具有固定的長度,如果想將更多的數(shù)據(jù)填充到緩沖區(qū),那么緩沖區(qū)就會“溢出”到相鄰的內(nèi)存區(qū)域。這些都是內(nèi)存,但是特殊的內(nèi)存區(qū)域可能存儲了重要的內(nèi)容,例如當(dāng)前函數(shù)執(zhí)行完成后將要執(zhí)行下一條指今的內(nèi)存地址。
????????程序經(jīng)過編譯后包含不同的段,其中很多段都包含了接收外部系統(tǒng)(文件、網(wǎng)絡(luò)、鍵盤等)填充數(shù)據(jù)的緩沖區(qū)。一些比較有趣的段是棧段、堆段、未初始化的靜態(tài)變量段向下生長(用于靜態(tài)初始化的變量)以及環(huán)境段。每個(gè)段的作用各不相同,因此程序和操作系統(tǒng)對不同段的處理方式也不一樣。有大量文獻(xiàn)介紹如何向這些段注入數(shù)據(jù)以控制應(yīng)用程序的后續(xù)執(zhí)行,因此這種攻擊形式又稱為軟件攻擊。
????????現(xiàn)代系統(tǒng)以及編譯器所具有的特性使棧攻擊變得難度更高,但是很多工控系統(tǒng)軟件并未使用棧保護(hù)機(jī)制。因?yàn)楹芏嗉夹g(shù)是近些年提出的,而工控系統(tǒng)的安全性往往落后于前沿安全技術(shù)。
????????(2)整型溢出:上溢、下溢、截?cái)嗯c符號失配
????????整型是編程中基本的數(shù)據(jù)類型。整型數(shù)據(jù)中僅僅包含數(shù)字,而數(shù)字可以解釋為任何內(nèi)容:可以是一個(gè)單純的數(shù)字、一個(gè) ASCI 字符,也可以是應(yīng)用于某些數(shù)據(jù)的比特掩碼或內(nèi)存地址。因此,如果要對整型的不正確使用進(jìn)行漏洞利用,那么理解整型如何工作是非常重要的。首先需要認(rèn)識到,不同于數(shù)學(xué)中的整數(shù),計(jì)算機(jī)中的整型數(shù)據(jù)不能一直增長到無窮大?;贑PU的架構(gòu),整型通常是固定長度的。現(xiàn)代的個(gè)人計(jì)算機(jī)大多基于64位體系結(jié)構(gòu),但是較早期的系統(tǒng)(工控系統(tǒng)中的大部分系統(tǒng)仍然如此)基于32位體系結(jié)構(gòu),部分小型嵌入式系統(tǒng)甚至還在使用基于16位體系結(jié)構(gòu)的系統(tǒng)。無論整型數(shù)據(jù)長度是多少,其原理都是一樣的,那就是固定長度的整型數(shù)據(jù)只有有限的表示能力,存在可以表示的最大數(shù)以及可以表示的最小數(shù)。對于32位無符號整型(非負(fù)整數(shù))而言,所能存儲的最大值是。轉(zhuǎn)換為二進(jìn)制形式,就是32個(gè)1,這也就是4GB所包含的字節(jié)數(shù),正好是32位操作系統(tǒng)中內(nèi)存容量的最大值。
????????鑒于這種類型的漏洞非常微妙并且非常底層,可以想象到在工控系統(tǒng)應(yīng)用程序中很可能存在這些漏洞。整型相關(guān)的漏洞難以發(fā)現(xiàn)和調(diào)試,它們可能存在于應(yīng)用程序中多年而未被發(fā)現(xiàn)。應(yīng)對輸入進(jìn)行測試,看看意外輸入是否會引起異常。了解二進(jìn)制如何表示有助于選擇“有趣”的值進(jìn)行測試。
????????(3)指針操縱
????????借助指針都實(shí)現(xiàn)各種有趣的數(shù)據(jù)結(jié)構(gòu)和優(yōu)化,但是如果指針處理不當(dāng),則可能導(dǎo)致崩潰。我們在討論EBP、EIP 和 ESP等存儲器時(shí),其中的P就是指這種類型的“指針”。盡管通用指針也可以存儲在內(nèi)存中,而不僅僅存儲在CPU寄存器中,但是內(nèi)存地址可以指向內(nèi)存中的任何地方。有些地址可以指向正在運(yùn)行的程序內(nèi)存區(qū)域,有些地址可以指向多個(gè)程序使用的共享庫內(nèi)存區(qū)域,還有些地址可以指向不屬于任何程序的內(nèi)存區(qū)域。如果在C語言中使用過指針,并出現(xiàn)了一個(gè)分段錯(cuò)誤,那么很可能是因?yàn)椤伴g接引用”了一個(gè)無效指針(也就是說,試圖獲取存儲在指針中的地址的值,即內(nèi)存中的值),它們很容易讓整個(gè)程序崩潰。
????????攻擊者還可以借助某個(gè)數(shù)值來繞過安全保護(hù)(通過跳轉(zhuǎn)到函數(shù)中間;該安全保護(hù)在敏感的值)。也可以借助某個(gè)數(shù)值使其指向攻擊者控制的數(shù)據(jù)緩沖區(qū),從而導(dǎo)致任意代碼執(zhí)行漏洞。更高級的語言,如Python、PHP、C#等往往沒有指針?biāo)鶐淼膯栴}(盡管這些語言并不一定具備對抗上述問題的能力),因?yàn)檫@些語言自身對指針進(jìn)行了隱藏以防止程序員直接訪問。這正是它們經(jīng)常被提到的優(yōu)勢之一。這種便利的特性被稱為托管代碼(Managed Code),這意味著由開發(fā)語言自己管理內(nèi)存的分配和釋放。但是許多工控系統(tǒng)應(yīng)用軟件,特別是為嵌入式系統(tǒng)編寫的軟件,大多采用C語言。
????????(4)格式化字符串
????????格式化字符串是用于指示數(shù)據(jù)格式的具有特殊結(jié)構(gòu)的字符串。與之前提到的某些漏洞一樣,格式化字符串漏洞源于直接使用了用戶提供的數(shù)據(jù),而不對其進(jìn)行驗(yàn)證。在這種情況下,用戶據(jù)就成了格式化字符串的參數(shù)。
????????一旦攻擊者知道緩沖區(qū)在哪里(無論是某一個(gè)內(nèi)存地址的絕對地址還是相對地址),攻擊者就可以將執(zhí)行流導(dǎo)向那里。如果緩沖區(qū)中包含惡意指令,那么在某種程度上就能夠?qū)崿F(xiàn)對機(jī)器有效漏洞利用,從而導(dǎo)致該機(jī)器完全處于攻擊者的控制之下。攻擊者也可以通過覆蓋指針將執(zhí)流重定向到含有惡意指令的緩沖區(qū)。盡管攻擊者可以在目標(biāo)機(jī)器上執(zhí)行任意指令,但對于工控系統(tǒng)攻擊僅僅更改變量的值就足夠了。修改一個(gè)字節(jié)的信息就足以使進(jìn)程崩潰,完成一次Dos 攻擊。
? ? ? ?在IT場景中,程序如果崩潰就會立即重啟,被攻擊的目標(biāo)可能只是略微覺得有些尷尬,停機(jī)一段時(shí)間就沒事了。但在工控系統(tǒng)中,DoS攻擊是一個(gè)大問題。它可能導(dǎo)致的不只是經(jīng)濟(jì)損失,還可能是環(huán)境破壞甚至人身傷亡。DOS攻擊還能阻止操作人員查看甚至控制設(shè)備。所以永遠(yuǎn)不要低估比特和字節(jié)的價(jià)值。
????????格式化字符串主要是(雖然不限于)C、C+編程語言的問題,但在工控系統(tǒng)的開發(fā)中C語言大受歡迎,因此工控系統(tǒng)軟件易于發(fā)現(xiàn)大量已公布的格式化字符串漏洞。
????????(5)目錄遍歷
? ? ? ? 出于這樣或那樣的原因,有很多程序需要訪問文件系統(tǒng),有些程序可能需存儲。目錄遍歷漏洞就是典型漏洞中的一種。無論出于哪種原因,程序員都需要使用字符串來指示文件的路徑。當(dāng)用戶輸入的數(shù)據(jù)對于路徑字符可能造成影響時(shí),是因?yàn)樵L問大多數(shù)文件系統(tǒng)時(shí)遇到了特殊的字符和字符串。
????????工業(yè)控制系統(tǒng)中有大量人機(jī)界面和其他設(shè)備開始使用基于Web的訪問方式,盡管.NET和Java在人機(jī)界面的實(shí)現(xiàn)中很常見,但是PHP仍然是最受歡迎的服務(wù)器端 web編程語言之一。如果攻擊者自己也購買了一套應(yīng)用程序或設(shè)備,對應(yīng)用程序、設(shè)備固件進(jìn)行了深入研究,實(shí)現(xiàn)了對關(guān)鍵文件的篡改,并最終對用戶的應(yīng)用程序或設(shè)備固件進(jìn)行了替換,使得程序或設(shè)備在執(zhí)行其所有正常功能的同時(shí),還在后臺執(zhí)行其他任務(wù)。該文件就可能一直運(yùn)行,而沒有人注意到數(shù)據(jù)已經(jīng)泄露或者已經(jīng)被植入了黑客稍后會用到的后門。
????????任何能夠?qū)е鹿粽叽a在目標(biāo)系統(tǒng)上運(yùn)行的漏洞都是危險(xiǎn)的。設(shè)計(jì)行之有效的過濾器對數(shù)據(jù)進(jìn)行清洗、保證其安全性是非常困難的,這也是為什么作為程序員根本不在這方面花費(fèi)精力的原因。即便是在遠(yuǎn)程的數(shù)據(jù)中發(fā)現(xiàn)了一些可疑的東西,把這些數(shù)據(jù)全部扔掉,并在日志中將其記錄為潛在威脅。但令人擔(dān)憂的是,許多程序員并不會采取這樣的做法。
????????(6)DLL劫持
????????作為軟件設(shè)計(jì)工作的一部分,通常會對常用組件進(jìn)行分解,從而實(shí)現(xiàn)組件的多處復(fù)用。這一原則無論對于代碼片段,還是對于操作系統(tǒng)級別的軟件,抑或是介于兩者之間的其他軟件都是適用的。減小程序規(guī)模、提高代碼模塊化的常用方法之一是使用動態(tài)鏈接庫(Dynamic?Linked Library,DLL)文件。DLL文件在很大程度上就像一個(gè)完整的程序,其中包含一系列可以調(diào)用的函數(shù)。但是,DLL文件不能獨(dú)立運(yùn)行,必須借助其他程序才能加載。借助DLL文件能夠?qū)?yīng)用程序的部分功能進(jìn)行分離,從而在不對程序進(jìn)行改動的情況下實(shí)現(xiàn)對整個(gè)程序的更新。DLL的許多優(yōu)點(diǎn)使得 DLL 文件用起來非常方便,但若未對 DLL進(jìn)行正確處理,DLL的使用可能會給應(yīng)用程序帶來非常嚴(yán)重的安全漏洞。
????????從攻擊者的角度來看,DLL劫持是一種獲得程序訪問權(quán)限的好方法,并且同緩沖區(qū)溢出、格式化字符串等方法相比,DLL劫持更加可靠、穩(wěn)定。在這種情況下,程序可以有意加載攻擊者的代碼并直接對其進(jìn)行調(diào)用,程序只需要將執(zhí)行流程轉(zhuǎn)交給惡意代碼就可以了。除了根據(jù)搜索順序提前創(chuàng)建DLL文件之外,如果攻擊者能夠覆蓋DLL文件,那么顯然也可以執(zhí)行惡意代碼。在部分保護(hù)不夠嚴(yán)密的系統(tǒng)中,覆蓋DLL文件的難點(diǎn)在于,除非手動包含原始代碼,否則可能會對原始代碼造成破壞。但是如果先加載真正的DLL文件,再將函數(shù)調(diào)用傳遞給惡意代碼,那么保證原文件中代碼的正確執(zhí)行就容易多了。這實(shí)際上是一種中間人攻擊。應(yīng)用程序的功能都會實(shí)現(xiàn),程序的預(yù)期效果也都會達(dá)到,然而,攻擊者的代碼也會在中間悄然運(yùn)行,可以記錄信息、修改參數(shù),以及其他自己想做的事情。
????????(7)暴力攻擊
????????暴力通常意味著嘗試每一個(gè)可能的選項(xiàng),從中找出最終能夠奏效的選項(xiàng)。此方法通常用于口令破解。在某種程度上,DoS攻擊也可以應(yīng)用暴力攻擊,因?yàn)樗鼈儍A向于持續(xù)發(fā)送一段代碼,或者不斷消耗內(nèi)存直到目標(biāo)崩潰。
????????從歷史記錄來看,由于需要耗費(fèi)大量時(shí)間,暴力攻擊并不是一個(gè)可行性較高的選項(xiàng)。然而現(xiàn)在隨著 CPU 速度的不斷提高以及分布式計(jì)算、并行計(jì)算、云計(jì)算的廣泛應(yīng)用,暴力攻擊已經(jīng)成為一個(gè)更為可行的選擇。如果用戶的PLC只使用8字符的口令,那么即便用一臺低端的筆記本計(jì)算機(jī)也可以在一兩天內(nèi)窮舉完所有的口令。應(yīng)對暴力攻擊的對抗措施之一是使用更大的狀態(tài)空間,也就是增大可能值的集合。這可能涉從16位值到64位值的轉(zhuǎn)換。有時(shí),這就足夠了。但是如果采用隨機(jī)數(shù)生成器(RNG)生成值,那么RNG算法中的弱點(diǎn)可能導(dǎo)致所生成的隨機(jī)數(shù)被預(yù)測到,從而導(dǎo)致狀態(tài)空間的規(guī)模大幅削減。
????????在許多情況下,特別是針對登錄進(jìn)程的攻擊,暴力攻擊會在線進(jìn)行,有時(shí)則可以取出數(shù)據(jù)進(jìn)行離線攻擊,這樣的話系統(tǒng)管理員對于攻擊行為無從知曉,這正是破解WPA2密碼的方式。
如有有人在對無線信道進(jìn)行嗅探時(shí)攔截到一個(gè)特殊值(握手信息),然后使用離線破解軟件(如aircrack-ng或reaver)可以握手信息發(fā)起暴力攻擊。無論何時(shí),只要經(jīng)過散列、加密或編碼的值,并且該值是安全方面的敏感信息,那么就存在通過暴力攻擊發(fā)現(xiàn)原值的風(fēng)險(xiǎn)。對于Dos攻擊,只是重復(fù)進(jìn)行TCP連接,甚至只是ping一個(gè)端口,就可能足以降低設(shè)備的運(yùn)行速度或?qū)е略O(shè)備中斷運(yùn)行一一曾經(jīng)有過僅僅通過Windows令行下的ping命令就使得PLC設(shè)備無法使用的例子。
????????除非系統(tǒng)設(shè)計(jì)者采用專門的設(shè)計(jì)來阻止暴力攻擊,否則在系統(tǒng)中的某個(gè)位置就很可能存在暴力破解漏洞,很多工控系統(tǒng)軟件均是如此。
?????