家好,我是周杰倫。
提到網絡攻擊技術,你腦子里首先想到的是什么?
是DDoS?
是SQL注入、XSS?
還是棧溢出、RCE(遠程代碼執行)?
這些最常見的網絡攻擊技術,基本上都是與網絡、軟件、代碼、程序這些東西相關。
這也好理解,計算機網絡安全,不跟這有關,還與什么有關系?
今天跟大家介紹一下,攻擊技術,除了這些,還有一些腦洞大開的方式,它們可能跟時間、震動、頻率、溫度等各種物理相關的元素相關,看完絕對讓你瞠目結舌!
這些不同于傳統軟件安全方向,而是從其他側面進行的網絡攻擊,稱作側信道攻擊,也叫邊信道攻擊。
請大家思考一個問題:如果計算機突然斷電,內存里的數據是不是瞬間就沒了?
內存大家都知道,計算機運行離不開這東西,程序指令和數據都存儲在這里,但你知道內存條存儲數據的原理嗎?
看到圖中那一塊塊黑色的東西了嗎?那就是內存條存儲數據的地方:內存顆粒。
在內存顆粒里面,是超大規模集成電路,里面是密密麻麻的存儲單元格,每一個單元格存儲一個比特位:
這個單元格中的核心部件是一個電容,電容有電壓,如果電壓在一定范圍內,這個單元格就是1,否則就是0。通過無數個這樣的單元格,構成了GB級的存儲空間。
但大家學過物理應該知道,電容是一個不穩定的元件,隨著時間的流逝,電荷會泄漏,如果不加以控制,內存條中的電壓最終就會變成0,內存中的數據也就不準確了。
因此,內存在工作的時候,需要定時的進行數據刷新,對電容進行充電,一般最多64ms就得充一次電,才能保存數據的準確性。
好了,內存的背景知識交代完畢,現在回到本節一開始提到的那個問題:計算機突然斷電了,內存中的數據瞬間就沒了嗎?
內存中的數據是通過電容這種電子元件在承載,電容充放電都是需要時間的,所以可以大膽猜測,即使斷電了,內存中的數據全部消失也是需要時間的。
國外有人腦洞大開,做了一項實驗,測試內存條斷電后,里面的數據隨著時間的流逝,消失的情況。
普通數據不方便觀察,用圖片最直接,實驗中將一張蒙娜麗莎的圖片載入內存中,然后斷電,然后計算不同時間后,這張圖的變化情況:
可以看到,在斷電后的5s內,圖片數據肉眼上看不到變化,30s后也影響不大,一分鐘后也能依稀可見,5分鐘后才徹底看不到。
而更重要的是,如果溫度降低時,電容中電荷遺漏的速度將更加緩慢。下面這個表格是測試內存條數據錯誤率在正常情況和冷凍情況下的比較。
如上圖所示,紅色框是不冷凍情況,藍色框是在零下50攝氏度情況,可以看到,在冷凍情況下,一分鐘后,數據的錯誤率是0,即便是在300秒(5分鐘)后,錯誤率也只有驚人的0.0095%。
所以,一種新的攻擊方式就出來了:使用內存冷凍的方式,可以從內存條中提取數據。
內存中有什么數據?很多程序的密碼密鑰可能都存在于內存之中,最典型的比如Windows的開機密碼。
以為電腦關機了就安全了?可不是這么回事哦!
熔斷與幽靈漏洞攻擊大家應該不會陌生,在2017年剛剛爆發出來的時候,占據了無數媒體的頭條,可見影響力之廣。
在講述這個漏洞之前,先請大家看一個故事。
學過計算機組成原理的朋友可能都知道,CPU有兩個重要的特性:分支預測和亂序執行。
在執行到判斷分支的時候(比如if判斷),CPU會根據它自己的“經驗”來判斷,一會兒可能會走入哪一個分支,從而提前執行一些這個分支的指令,這叫分支預測。
另外,CPU在執行一些指令的時候,可能并不是按照順序一條執行完再執行下一條,而是可能在會預執行一些CPU認為可以提前執行,對程序流程無關的指令,這個叫亂序執行。
但CPU認為可以提前執行,那就真的可以提前執行嗎,執行了可能對程序本身流程沒有影響,但會不會有什么副作用呢?
先留這個問題,一會兒再說,先來看另一個概念:緩存。
CPU執行程序需要頻繁與內存通信,讀取數據或者寫入數據。但內存的響應速度比CPU慢多了,于是CPU在其內部加了一塊緩存,將最近要用的數據放到這里來,避免每一次都從內存訪問,提高工作效率。
因此,同樣讀取一個數據,從內存讀和從緩存讀,時間上是有差異的。
熔斷與幽靈正是利用這一點,來進行了系統攻擊。
假如你想讀取操作系統內核的數據,但因為系統安全機制,應用程序是無法直接訪問內核空間的,但這個漏洞就可以幫你實現內核空間數據的讀取。
下面這段程序,先執行幾十次,每次傳入的x都小于16,每次都走入同一個分支,訓練CPU,讓它獲得一些“經驗”,讓它認為 < 16是大概率要執行的分支,然后啟用亂序執行,提前執行x < 16這個分支中的指令。
void bad_guy(int x) {
if (x < 16) {
temp &=array2[array1[x] * 512];
}
}
來看一下,在上面這個例子中,x < 16這個分支中會通過array1這個數組訪問內存,假設x突然來了一個很大的數,這樣通過array1[x]訪問的內存地址就溢出到了內核空間了。
亂序執行的后果,會提前計算array1[x] * 512,并將其作為下標訪問array2數組的內容,然后會將這個內容從內存條加載到CPU緩存中。
突然冷不丁地來一個大于16的參數,這下它提前執行的指令就白費了。
而隨后,CPU發現了這一次x是大于16的,不應該走到這個分支中來,上面描述的這一段活就白干了。
雖然是白干了,但它做了一件事:把array2數組對應下標的那一塊數據從內存搬到緩存了。
這時再依次訪問array2數組的每一個元素,就能知道剛才的下標,再進一步可以推斷出那個內核空間的值。
然后不斷變換x的輸入,可以知道任意內核地址空間的數據。
這就是熔斷與幽靈漏洞的核心思想:通過分支預測+亂序執行+緩存內存訪問時間差異來推斷內核數據。
熔斷與幽靈,其實是利用了CPU訪問內存和訪問緩存的時間差來透露信息,從而實現數據泄漏,也就是說,利用的核心是時間這個物理量。
而利用時間的另一個經典攻擊方式就是計時攻擊。
給大家舉個例子,如果要使用C語言編寫一個函數,用來判斷輸入的密碼是否正確,有人可能會這樣寫:
bool check_passwd(char* input) {
bool result=false;
const char* passwd="XiaoBaiGe2021";
if (input) {
if (strlen(input) !=strlen(passwd)) {
return false;
}
const char* p1=input;
const char* p2=passwd;
while (*p1 && *p2) {
if (*p1==*p2) {
p1++;
p2++;
} else {
break;
}
}
if (*p1=='\0' && *p2=='\0') {
result=true;
}
}
return result;
}
上面這個函數中,在正式的字符串比較之前,先進行了長度的比較,如果長度都不同,那就不用比較了,節省時間。
但這個看上去很聰明的做法,實際上可能會給攻擊者提供了信息參考。
通過輸入不同長度的字符串,發現程序驗證所花費的時間不同,攻擊者可能猜測出真正密碼的長度。
接下來的驗證過程中,開始逐位比較字符串的每一位,乍一看也沒毛病,但同樣的問題,如果第一位就比較錯誤,程序很早就退出,而如果比較的時間相對較長,則說明密碼的前幾位可能是正確的。
通過這些信息,然后進行不斷嘗試,密碼可以在短時間內破解出來,是不是覺得不可思議?這是曾經發生過的真實案例。
正則表達式在字符串校驗、文本提取、格式化解析等領域有非常廣泛的應用,基本上所有主流的編程語言都有對應的程序庫。
但你知道正則表達式的解析引擎是如何工作的嗎,你知道如果傳入一些特定的字符串,可能讓解析引擎陷入巨大的計算陷阱嗎?
正則表達式的解析引擎有一個重要的流派就是基于NFA,這是一種狀態機。隨著解析引擎的逐字符解析,狀態機可能會有不同的下一個狀態。由于每一個狀態都有許多個下一個狀態,解析引擎可能會在這條鏈路上不斷前行,直到找到一個匹配的。
比如在 《白帽子講Web安全》 一書中所提到的例子:
需要《白帽子講Web安全》高清PDF版的同學可以私信 【安全】 即可獲得領取方式
有一個這樣的正則表達式:^(a+)+$
如果輸入四個字符'aaaa',解析引擎的執行過程是這樣的:
它只有16條路徑,很快就能走完。
但如果輸入的字符a大量增加時,執行的路徑將會暴增。
可以看到,隨著后續字符串長度的增加,花費的時間開始呈2倍增長趨勢。如果輸入64個字符a,那將會是什么后果?
CPU飛轉,程序失去響應,服務拒絕攻擊DOS!
沒想到吧,你只是輸入了一個正則表達式字符串,就能讓服務器失去響應。
需要《白帽子講Web安全》高清PDF版的同學可以私信 【安全】 即可獲得領取方式
以上就是今天給大家介紹的一些側信道攻擊技術。
除了上面這些案例,通過CPU的利用率,CPU電信號的頻率等等信息,也能泄露出很多有價值的信息,側信道攻擊技術,不只是電影中的黑科技,而是可能真實發生的攻擊。
家好,我是小匠。常常有朋友問我,為什么關機了鍵盤跟鼠標燈怎么還亮著,是不是主機還沒有完全關閉?所以我抽時間做了一個解決問題的教程,因為主板不同所以操作可能也會有所不同,這次我是用技嘉的主板來做一個教程。
解決方法就是進入BIOS里面修改該設置即可,請看步驟:
第一步,當然是進入我們主板的BIOS里面,只要我們開機反復按DEL這個鍵,就會進入我們的BIOS里面,以下是我們剛進到BIOS的界面。
第二步,由于是英文的,大家也都看不懂,不熟悉的朋友可能不知每個選項的意思,所以首先我們選擇到第二個選項System里面,選擇System Language這里,我們按Entel(回車鍵)然后彈出好幾個選項,我們選擇中文簡體即可。
第三步,選擇中文簡體之后,界面就會變得比較通俗易懂,這樣我們就可以方便接下來的操作了。
第四步,調成中文模式之后,我們移動到電源管理這個選項里面去進行里面的一個調整。
第五步,進入到電源管理這個選項,我們移動到Erp這個選項,它目前是一個關閉的狀態。
第六步,我們按Entel(回車鍵)然后我們把關閉的選項,改成我們開啟的一個選項即可。
第七步,更改Erp為開啟的一個選項。
第八步,我們已經更改完成了,我們就按我們鍵盤上F10保存,回車選擇是就可以,這樣子我們關機之后,鍵盤鼠標會發光的也不會發光了。
那么這個Erp選項到底是什么功能呢?這主要是一個主機自身省電功能,開啟過后電源管理事件功能將無用、鼠標 開機功能、鍵盤開機功能、網絡喚醒功能等功能不能使用,其它沒有任何影響。也就是在你關機后盡可能的把電腦的耗電量降低到1W左右。
再附贈一張華碩的開啟選項~~
如果筆記本電腦是關機的狀態,不拔掉電源適配器,那么它的電源還在主機上工作,所以它也是需要耗電的。只是這個耗電量比較低,你關機一個月可能只能得到兩倍左右的電量。所以我們說筆記本不用,關機后一定要拔掉電源。第一個方面可以防止筆記本電池過度充電的風險。第二個也可以防止電源適配器在春季雷雨天氣被雷電損壞。筆記本無論關機與否都會耗電,但關機后短時間內會少耗電。
筆記本耗電的原因
同時電腦重新打開的程序太多,導致電池消耗快。
電腦灰塵太多,散熱不好,檢查散熱裝置的工作頻率是否正常。
電池老化,容量明顯降低,大大降低了電池的實際使用時間,必要情況下可以去維修中心更換電池。
可以將電腦設置為省電模式,并降低CPU的工作頻率以減少電池消耗。但治標不治本,長時間耗電快的情況可能會影響電源。
解決方法:
保養筆記本電池,不要長時間插電源。此外,不要等到電池耗盡關機后再充電。剩下10%左右要趕緊插上電源線,這是最常規的保養方法。
拔下外部設備,如移動硬盤或USB閃存驅動器。這種情況雖然不會太費電,但是也會影響電腦的電量。