
На конференції з комп'ютерної безпеки Ekoparty 2017 у Буенос-Айресі аргентинський хакер Альфредо Ортега показав дуже цікаву розробку - систему прихованого прослуховування приміщень без використання мікрофона. Звук !
HDD вловлює в основному низькочастотні звуки високої інтенсивності, кроки та інші вібрації. Людську мову розпізнати поки не можна, хоча вчені (розпізнавання мови за низькочастотними вібраціями, які знімаються, наприклад, з гіроскопа або HDD).
Звук – це коливання повітря чи іншого середовища. Людина сприймає їх через барабанну перетинку, яка передає коливання у внутрішнє вухо. Мікрофон влаштований приблизно як вухо – тут також коливання реєструються тонкою мембраною, яка збуджує електричний імпульс. Жорсткий диск, зрозуміло, теж схильний до мікроскопічних вібрацій через коливань навколишнього повітря. Це відомо навіть за технічними характеристиками HDD: виробники зазвичай вказують максимально допустимий рівень вібрацій, а жорсткий диск часто намагаються помістити в захищений від вібрацій контейнер з гуми або іншого ізоляційного матеріалу. З цього легко зробити висновок, що HDD можна реєструвати звуки. Залишилось лише придумати, як.
Альфредо Ортега запропонував своєрідний варіант атаки сторонніми каналами (side-channel attack), а саме атаки за часом. Ця атака ґрунтується на припущенні, що різні операції виконуються у пристрої за різний час, залежно від поданих вхідних даних. В даному випадку «вхідними даними» є коливання головки, що зчитує, і пластини HDD, які корелюють з вібраціями середовища, тобто зі звуком. Таким чином, вимірюючи час обчислень та проводячи статистичний аналіз даних, можна виміряти коливання головки/пластини і, отже, вібрації середовища. Чим більша затримка в зчитуванні даних — тим сильніше коливання HDD і, отже, гучніший звук.
Як виміряти коливання жорсткого диска? Дуже просто: достатньо лише запустити системний виклик read () - І зареєструвати час, за який він виконується. Сучасні операційні системи дають змогу зчитувати таймінг системних викликів з точністю до наносекунди.
Швидкість читання інформації з сектора залежить від положення головки та пластини, що корелює з вібраціями корпусу HDD. От і все.
Статистичний аналіз здійснюється за допомогою простенької утиліти Kscope. Як то кажуть, все геніальне просто.

Утиліта Kscope (stat() syscall)
Kscope - невелика утиліта для візуалізації крихітних відмінностей у часі виконання системних викликів. Вихідний код.
В окремому репозиторії лежить версія утиліти, налаштована на атаку за часом на жорсткий диск, тобто налаштована на аналіз системного виклику read ().
Демонстрація звукозапису за допомогою HDD, робота утиліти Kscope

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

Ядро Linux відключило жорсткий диск після 120 секунд подачі звуку на частоті резонації через динамік USB-колонки Edifier r19u. Динамік включений приблизно на чверть потужності (менше 100 мВт) і розташовується за 20 см від HDD, спрямований на стіл для посилення вібрацій. Кадр із з демонстрацією роботи HDD-кілера
Цікаво, що такі «атаки» на HDD іноді відбуваються випадково у звичайному житті. Наприклад, у вересні 2016 року дата-центр ING Bank був змушений призупинити роботу на 10 годину після пожежних навчань. через гучний звук інертного газу, що випускається з балонів під великим тиском. Звук був дуже гучним (понад 130 дБ), а навіть кричати на жорсткі диски не можна - це збільшує затримку доступу до 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
