Чаму нельга крычаць на свой HDD

Чаму нельга крычаць на свой HDD

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

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

Дадаць каментар