HDDに向かって叫んではいけない理由

HDDに向かって叫んではいけない理由

ブエノスアイレスで開催されたコンピューター セキュリティ カンファレンス Ekoparty 2017 で、アルゼンチンのハッカー、アルフレド オルテガは、マイクを使用せずに施設内を秘密裏に盗聴するシステムという非常に興味深い開発を披露しました。 音 ハードドライブに直接記録される!

HDD は主に高強度の低周波音、足音、その他の振動を拾います。 人間の音声はまだ認識できませんが、科学者たちは この方向で研究を行っています (ジャイロスコープや HDD などから記録された低周波振動による音声認識)。

音は空気またはその他の媒体の振動です。 人は鼓膜を通して振動を知覚し、鼓膜の振動が内耳に伝わります。 マイクは大まかに耳のように設計されています。ここでも、振動は電気インパルスを励起する薄い膜によって記録されます。 もちろん、ハードドライブも周囲の空気の変動による微細な振動の影響を受けます。 これは HDD の技術的特性からも明らかです。通常、メーカーは最大許容振動レベルを示しており、ハード ドライブ自体もゴムやその他の絶縁材料で作られた防振容器に収めようとすることがよくあります。 このことから、HDD を使用して音声を録音できると簡単に結論付けることができます。 残っているのは、その方法を理解することだけです。

アルフレド・オルテガは、サイドチャネル・アタックのユニークなバージョン、すなわちタイム・アタックを提案しました。 この攻撃は、与えられた入力データに応じて、デバイス上で異なる操作が異なる時間に実行されるという前提に基づいています。 この場合の「入力データ」は読み取りヘッドやHDDプラッターの振動であり、環境の振動、つまり音と相関関係があります。 したがって、計算時間を測定し、データの統計分析を実行することにより、ヘッド/プラッターの振動、ひいては媒体の振動を測定することができます。 データ読み取りの遅延が長いほど、HDDの振動が強くなり、音が大きくなります。

ハードドライブの振動を測定するにはどうすればよいですか? 非常に簡単: システムコールを実行するだけです read () — そして完了するまでにかかる時間を記録します。 最新のオペレーティング システムでは、システム コールのタイミングをナノ秒の精度で読み取ることができます。

セクタから情報を読み取る速度はヘッドとプラッターの位置に依存し、これは HDD ケースの振動と相関します。 それだけです。

統計分析は、単純な Kscope ユーティリティを使用して実行されます。 彼らが言うように、独創的なものはすべてシンプルです。

HDDに向かって叫んではいけない理由
Kscope ユーティリティ (stat() システムコール)

Kscope は、システム コールの実行時間のわずかな違いを視覚化するための小さなユーティリティです。 ソースGitHub で公開.

別のリポジトリ内 HDD時間 ハード ドライブ上でタイム アタック用に構成されたユーティリティのバージョンが存在します。つまり、システム コールを分析するように構成されています。 read ().

HDDを使った録音デモンストレーション、Kscopeユーティリティの操作


もちろん、この方法では音声を理解することはできませんが、HDD は振動センサーとして非常に適しています。 たとえば、硬い靴を履いている人や裸足の人がコンピュータのある部屋に入ってきた場合に登録できます (おそらく、攻撃者が柔らかいスニーカーを履いている場合、または床に厚いカーペットが敷かれている場合、HDD は振動を記録できません。これは確認する価値があります)。 コンピュータは、ガラスの破片やその他の強い音響強度の出来事を記録できます。 つまり、ハードドライブは一種の不正侵入検知システムとして機能する可能性があります。

HDDキラー

ちなみに、同様の手法を使用してハードドライブを無効にすることができます。 ここでのみ、HDD から振動を除去するのではなく、逆に、HDD に供給される振動を生成します。 HDD の周波数と共鳴する周波数でスピーカーからサウンドを再生すると、システムはすぐに I/O エラーでデバイスの電源をオフにします (Linux カーネルは 120 秒後に HDD の電源を完全にオフにします)。 ハードドライブ自体が回復不能な損傷を受ける可能性があります。

HDDに向かって叫んではいけない理由
Linux カーネルは、Edifier r120u USB スピーカーのスピーカーを通じて共振周波数でサウンドを配信してから 19 秒後にハード ドライブをオフにしました。 スピーカーは約 100 分の 20 の電力 (XNUMX mW 未満) でオンになり、振動を高めるためにテーブルに向けて HDD から XNUMX cm 離れた場所に設置されます。 からのフレーム ビデオ HDDキラーのデモンストレーション付き

HDD に対するこのような「攻撃」が、日常生活の中でまったく偶然に発生することがあるのは興味深いことです。 たとえば、2016 年 10 月、ING 銀行のデータセンターは消防訓練後に XNUMX 時間の業務停止を余儀なくされました。 数十台のハードドライブが故障しました 高圧下でシリンダーから不活性ガスが放出される大きな音が原因です。 音は非常に大きかった (130 dB 以上) が、ハード ドライブに向かって叫ぶことさえできません。これにより、HDD へのアクセスの遅延が増加します。

データセンター内のハードドライブに向かって人間が叫ぶデモ。 レイテンシ測定


共鳴音を生成するために、Alfredo Ortega は Python スクリプトを作成しました。 HDDキラー (ビデオデモンストレーション).

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

コメントを追加します