#周辺機器から入る3つの道
机の上の機器も、攻撃の入口になります。この講座では、よく知られた3つの道を、練習用の機器で起こします。
| 道 | 例 |
|---|---|
| USB メモリ | 拾った USB メモリに、マルウェアが入っている |
| キーボードを装う機器 | USB メモリに見える機器が、キーボードとしてコマンドを打ち込む(BadUSB) |
| Bluetooth のキーボード | 近くの人が、ペアリングしていないキーボードになりすます |
USB の守りは、クライアント版(roamswitch パッケージ)の機能です。USB ストレージの制御 と BadUSB の防止 を、仮想の USB 機器で確かめます。Bluetooth の設定の点検 Bluetooth の制御と点検 は、Server Edition でも使えます。
クライアント版は、Server Edition と同じマシンには入りません。入れると Server Edition が外れます。また、登録していないネットワークでは外出先保護(Lockdown)になり、SSH などの共有サービスを止めます。SSH で入っている VM では、接続が切れます。VM の画面(コンソール)から操作してください。出力の時刻は UTC です。日本時間は 9 時間足して読みます。
#練習用の USB 機器を作る
VM には、本物の USB 機器を挿せません。そこで、Linux の dummy_hcd を使います。同じマシンの中に、仮想の USB の差し込み口を作るモジュールです。そこへ、USB メモリやキーボードとしてふるまう機器(ガジェット)をつなぎます。カーネルからは、本物の USB 機器と同じに見えます。
カーネルのモジュールを読み込み、パッケージを入れる操作です(変更を伴う操作です)。使い捨ての Ubuntu 24.04 の VM で試してください。
Ubuntu のカーネルには dummy_hcd が入っていないため、カーネルのソースから1つだけ作ります。ClamAV とクライアント版も入れます(リポジトリの登録は、Linux Server の導入 と同じです)。
sudo apt install build-essential linux-headers-$(uname -r) dosfstools roamswitch clamav clamav-daemon
mkdir -p ~/dhcd && cd ~/dhcd
curl -fsSL -o dummy_hcd.c https://raw.githubusercontent.com/torvalds/linux/v$(uname -r | cut -d. -f1,2)/drivers/usb/gadget/udc/dummy_hcd.c
echo "obj-m := dummy_hcd.o" > Makefile
make -C /lib/modules/$(uname -r)/build M=$PWD modules
sudo mkdir -p /opt/fakeusb && sudo cp dummy_hcd.ko /opt/fakeusb/
sudo systemctl stop clamav-freshclam && sudo freshclam && sudo systemctl restart clamav-daemon練習の USB メモリの中身を作ります。EICAR は、ウイルス対策ソフトの動作確認に使う、公開の無害な文字列です。
sudo truncate -s 64M /opt/fakeusb/stick.img
sudo mkfs.vfat -n PRACTICE /opt/fakeusb/stick.img
sudo mkdir -p /mnt/img /mnt/stick && sudo mount -o loop /opt/fakeusb/stick.img /mnt/img
printf '%s' 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' | sudo tee /mnt/img/eicar.com >/dev/null
echo hello | sudo tee /mnt/img/readme.txt >/dev/null
sudo umount /mnt/img機器を抜き挿しするスクリプトです。/usr/local/bin/fakeusb に置き、sudo chmod 755 で実行できるようにします。USB の番号は、練習用の 1209:0001(USB メモリ)と 1209:0002(キーボード)です。
#!/bin/sh
# fakeusb storage|keyboard plug|unplug : a virtual USB device on dummy_hcd (practice only)
set -e
G=/sys/kernel/config/usb_gadget
kind=$1; act=$2
modprobe libcomposite
mountpoint -q /sys/kernel/config || mount -t configfs none /sys/kernel/config
lsmod | grep -q '^dummy_hcd' || insmod /opt/fakeusb/dummy_hcd.ko
case "$kind" in
storage) d=$G/practice_stick; pid=0x0001; prod="Practice Stick"; modprobe usb_f_mass_storage;;
keyboard) d=$G/practice_kbd; pid=0x0002; prod="Practice Keyboard"; modprobe usb_f_hid;;
*) echo "usage: fakeusb storage|keyboard plug|unplug"; exit 2;;
esac
if [ "$act" = unplug ]; then
[ -e $d/UDC ] && echo "" > $d/UDC 2>/dev/null || true
echo unplugged; exit 0
fi
if [ ! -d $d ]; then
mkdir -p $d && cd $d
echo 0x1209 > idVendor; echo $pid > idProduct; echo 0x0100 > bcdDevice; echo 0x0200 > bcdUSB
mkdir -p strings/0x409
echo "Practice" > strings/0x409/manufacturer; echo "$prod" > strings/0x409/product; echo "PRACTICE0001" > strings/0x409/serialnumber
mkdir -p configs/c.1/strings/0x409; echo "practice" > configs/c.1/strings/0x409/configuration; echo 100 > configs/c.1/MaxPower
if [ "$kind" = storage ]; then
mkdir -p functions/mass_storage.0
echo 1 > functions/mass_storage.0/lun.0/removable
echo /opt/fakeusb/stick.img > functions/mass_storage.0/lun.0/file
ln -s functions/mass_storage.0 configs/c.1/
else
mkdir -p functions/hid.usb0; cd functions/hid.usb0
echo 1 > protocol; echo 1 > subclass; echo 8 > report_length
python3 -c 'import sys; sys.stdout.buffer.write(bytes.fromhex("05010906a101050719e029e71500250175019508810295017508810395057501050819012905910295017503910395067508150025650507190029658100c0"))' > report_desc
cd $d; ln -s functions/hid.usb0 configs/c.1/
fi
fi
cd $d
# one UDC: unbind the other gadget first
for o in $G/*; do [ "$o" != "$d" ] && [ -n "$(cat $o/UDC 2>/dev/null)" ] && echo "" > $o/UDC; done
echo dummy_udc.0 > UDC
echo plugged挿してみます。
sudo fakeusb storage plug
sleep 3
lsusb | grep 1209plugged
Bus 003 Device 002: ID 1209:0001 Generic pid.codes Test PIDlsusb に、練習の USB メモリが出ました。挿した直後は、まだ出ないことがあります。そのため、3 秒待ってから見ます。抜くときは sudo fakeusb storage unplug です。
#知らない USB メモリを止めて、許可してから調べる
クライアント版は、登録していないネットワークにつながると、外出先保護(Lockdown)になります。Lockdown では、USB の守りの設定がオフでも、許可していない USB メモリとキーボードを保留します。カーネルの設定 authorized_default も 0 にして、新しい USB 機器を、許可するまで使えない状態でつなぎます。
許可したものは、設定ファイル ~/.config/roamswitch/config.json の allowed_usb_devices に入ります。普段はアプリの画面から登録します。この演習では画面のアプリを使わないので、ファイルに直接書きます。
設定ファイルを書き、サービスを再起動する操作です(変更を伴う操作です)。
最初に、いま使っているキーボード(この VM では 05ac:8105)を許可リストに入れます。許可リストに無いキーボードは、前からつないであったものでも、保留の対象になるためです。再起動の前にすり替えられたおそれがある、という考え方です(コードの注記)。
mkdir -p ~/.config/roamswitch
cat > ~/.config/roamswitch/config.json <<'J'
{
"language": "ja",
"allowed_usb_devices": [
{"deviceIdentifier": "05ac:8105", "displayName": "Virtual USB Keyboard", "dateAdded": "2026-11-05 09:00"}
]
}
J
chmod 600 ~/.config/roamswitch/config.json
sudo systemctl restart roamswitch練習の USB メモリを挿して、様子を見ます。
sudo fakeusb storage plug
sleep 3
sudo dmesg | tail -1
cat /run/roamswitch/state.json
cat /sys/bus/usb/devices/usb3/authorized_default
cat /sys/bus/usb/devices/3-1/authorized
lsblk -S
roamswitch notifications | head -8plugged
[ 68.808435] usb 3-1: Device is not authorized for usage
{"active_level":"lockdown","air_gap":false,"fanotify_ready":true,"network_trusted":false,"usb_zero_trust":true}
0
0
=====================================================
🔔 通知履歴(過去1週間)
=====================================================
2026-11-12T02:17:59.422185220+00:00
⏸ 未承認の USB ストレージを保留しました
外出先保護 (Lockdown) のため「Practice Practice Stick (VID:1209 PID:0001)」を保留しました。使うときは承認画面で許可してください。読み方です。
active_levelがlockdownです。登録していないネットワークにいるためですauthorizedが 0 です。カーネルは機器を見つけましたが、使えるようにしていませんlsblk -Sに何も出ません。ディスクとして現れていないので、マウントもできません
承認を待つ要求は、/run/roamswitch/approvals.json にあります。アプリはこれを読んで、「許可」「拒否」の画面を出します。
python3 -c "
import json
for a in json.load(open('/run/roamswitch/approvals.json')): print(a['kind'], a['device_id']); print(a['title']); print(a['body'])"usb_storage 1209:0001
未登録の USB メモリを許可しますか?
「Practice Practice Stick」(VID:1209 PID:0001)が接続されました。詳細: Practice
許可リストに無いため、いったんマウントを保留しています。「許可」でこのデバイスを使用可能にして許可リストに登録します。心当たりがなければ「拒否」してください。許可リストに入れると、保留が解けます。USB メモリをマウントすると、ClamAV が中を読むだけのスキャンをします(usb_mount_scan_enabled、既定でオン)。見つかったときは、重大の通知を出します。ファイルの削除も、取り出しもしません。
設定ファイルを書き換える操作です(変更を伴う操作です)。
許可リストに足す小さな関数を作り、練習の USB メモリを足します。設定の変更は、再起動しなくても数秒で効きます。
allow_usb() { python3 - "$1" "$2" <<'P'
import json,os,sys
p=os.path.expanduser('~/.config/roamswitch/config.json')
c=json.load(open(p))
c['allowed_usb_devices'].append({"deviceIdentifier":sys.argv[1],"displayName":sys.argv[2],"dateAdded":"2026-11-05 09:40"})
json.dump(c,open(p,'w'),ensure_ascii=False,indent=2)
P
}
allow_usb 1209:0001 "Practice Stick"
sleep 6
cat /sys/bus/usb/devices/3-1/authorized
lsblk -S
sudo mount -o ro /dev/sda /mnt/stick && ls /mnt/stick
sleep 15
roamswitch notifications | sed -n 4,9p1
NAME HCTL TYPE VENDOR MODEL REV SERIAL TRAN
sda 0:0:0:0 disk Linux File-Stor Gadget 0700 PRACTICE0001 usb
eicar.com
readme.txt
2026-11-12T02:18:15.670933390+00:00
🦠 USB メモリでマルウェアが見つかりました
/mnt/stick (/dev/sda) で 1 件のマルウェアが見つかりました。
eicar.com (Eicar-Test-Signature)
これらのファイルは開かずに、USB メモリを取り外してください(通知のみ。削除や取り出しはしていません)。authorized が 1 になり、sda が現れました。マウントから1秒ほどで、ClamAV が EICAR を見つけました。eicar.com は消えずに残っています。 許可リストは、1209:0001 のような型番(VID:PID)で機器を見ます。型番は、どの機器でも名乗れます。そこで、許可したときの機器の指紋(製造元、製品名、シリアル番号などから作る値)も覚えます。指紋は /var/lib/roamswitch/usb_fingerprints.json にあります。
練習の USB メモリのシリアル番号だけを変えて、挿し直します。
sudo umount /mnt/stick
sudo fakeusb storage unplug
sleep 5
echo PRACTICE9999 | sudo tee /sys/kernel/config/usb_gadget/practice_stick/strings/0x409/serialnumber
sudo fakeusb storage plug
sleep 6
cat /sys/bus/usb/devices/3-1/authorized
sudo journalctl -u roamswitch --since -15s -o cat | grep fingerprint
roamswitch notifications | sed -n 4,7p
python3 -c "
import json
for a in json.load(open('/run/roamswitch/approvals.json')): print(a['kind'], a['device_id']); print(a['title']); print(a['body'])"PRACTICE9999
plugged
0
2026-11-12T02:18:41.394939Z WARN roamswitch_daemon::sentinel: ⚠️ [BadUSB] 1209:0001 is allow-listed but a device with a different descriptor fingerprint is attached — treating it as unapproved
2026-11-12T02:18:41.417035214+00:00
登録済みの USB メモリの識別情報が変わりました
「Practice Practice Stick (VID:1209 PID:0001)」は許可リストにある USB メモリと同じ VID:PID ですが、内部の識別情報(ディスクリプタ)が登録したときと違うため、保留しました。同じ機器だと確かめられるときだけ、承認画面で許可してください。
usb_storage 1209:0001
登録済みの USB メモリの識別情報が変わりました
「Practice Practice Stick」(VID:1209 PID:0001)は許可リストにある USB メモリと同じ VID:PID ですが、内部の識別情報(ディスクリプタ)が登録したときと違います。詳細: Practice
登録した USB メモリとは別の機器かもしれないため、マウントを保留しています。同じ機器だと確かめられるときだけ「許可」してください。心当たりがなければ「拒否」してください。型番は許可リストにありますが、指紋が違うため、許可していない機器として保留しました。抜いてから 5 秒ほどで挿し直しても、通知が出ます。通知も承認を求める文も、識別情報が登録と違うことを書き、同じ機器だと確かめられるときだけ許可するよう求めます。ジャーナルの行は、画面の言語にかかわらず英語です。ただし、指紋は、すべての記述をまねた機器までは見分けられません(コードの注記)。
#キーボードを装う機器を止める
BadUSB は、USB メモリなどに見える機器が、キーボードとして名乗り、コマンドを打ち込む攻撃です。挿した直後に、人の手では出ない速さで打ち込みます。
許可していないキーボードがつながると、RoamSwitch はその入力を自分だけが受け取るように押さえます(evdev の排他)。キー入力はほかのプログラムに届きません。機器の電源は切らないので、同じ受信機のマウスなどは使えます。ほかに使えるキーボードが無いときは、締め出しを避けるため、押さえずに知らせるだけにします(コードの注記)。
/usr/local/bin/typekeys.py は、練習のキーボードから echo practice と Enter を、5 ミリ秒おきに送ります。/usr/local/bin/readkeys.py は、キーボードの入力を横から読み、届いたキーの数を数えます。どちらも sudo chmod 755 で実行できるようにします。
#!/usr/bin/env python3
# typekeys.py: send "echo practice" + Enter through /dev/hidg0, one key every 5 ms (a script, not a person)
import sys, time
KEYS = {c: 0x04 + i for i, c in enumerate("abcdefghijklmnopqrstuvwxyz")}
KEYS[" "] = 0x2c; KEYS["\n"] = 0x28
gap = float(sys.argv[1]) if len(sys.argv) > 1 else 0.005
with open("/dev/hidg0", "wb", buffering=0) as f:
for ch in "echo practice\n":
f.write(bytes([0, 0, KEYS[ch], 0, 0, 0, 0, 0]))
f.write(bytes(8))
time.sleep(gap)
print("sent", len("echo practice\n"), "keys")#!/usr/bin/env python3
# readkeys.py EVENT SECONDS: count key presses that reach this reader (no grab of its own)
import os, select, struct, sys, time
fd = os.open(sys.argv[1], os.O_RDONLY | os.O_NONBLOCK)
end = time.time() + float(sys.argv[2]); n = 0
while time.time() < end:
r, _, _ = select.select([fd], [], [], 0.2)
if r:
data = os.read(fd, 24 * 64)
for i in range(0, len(data), 24):
_, _, typ, code, val = struct.unpack("llHHi", data[i:i + 24])
if typ == 1 and val == 1:
n += 1
print("key presses seen:", n)練習のキーボードを挿して、打ち込みます。
sudo fakeusb keyboard plug
sleep 6
EV=$(grep -A6 'Name="Practice Practice Keyboard"' /proc/bus/input/devices | sed -n 's/.*Handlers=.*\(event[0-9]*\).*/\1/p')
(sudo readkeys.py /dev/input/$EV 5 &) ; sleep 1; sudo timeout 10 typekeys.py
sleep 6
roamswitch notifications | sed -n 4,13pplugged
sent 14 keys
key presses seen: 0
2026-11-12T02:19:02.769376261+00:00
🚨 このキーボードは自動入力(スクリプト)の兆候を示しています
承認待ちのキーボードから、接続後に 13 回のキー入力が約 5ms 間隔という不自然に均一な速さで送信されました。人が入力しているのではなく、自動スクリプトによる注入(BadUSB攻撃)の可能性が高いです。キーストロークは既に遮断されていますが、心当たりがなければ必ず「拒否」してデバイスを取り外してください。
VID:1209 PID:0002
2026-11-12T02:18:56.574916202+00:00
🛑 未承認の USB キーボード (BadUSB) を自動遮断
「Practice Practice Keyboard (VID:1209 PID:0002)」の入力を遮断・隔離しました。使用する場合は RoamSwitch の「USB 防衛」画面で許可してください。14 回送ったキーは、1 つも届きませんでした。通知は2つです。1つは、許可していないキーボードを押さえたこと。もう1つは、押さえている間に届いた打鍵の間隔が、人の手では出ない速さと均一さだったことです。打鍵の間隔は補助の手がかりで、遮断は間隔にかかわらず先に効いています。
次に、このキーボードを許可して、人に近い速さ(150 ミリ秒おき)で打ちます。
allow_usb 1209:0002 "Practice Keyboard"
sleep 6
(sudo readkeys.py /dev/input/$EV 5 &) ; sleep 1; sudo timeout 10 typekeys.py 0.15
cat /run/roamswitch/approvals.jsonsent 14 keys
key presses seen: 14
[]許可すると、14 回とも届きました。承認待ちの要求も消えています。打ったキーは VM の画面に入力されます(echo practice と表示されるだけです)。
#信頼するネットワークでの設定
登録したネットワークや、外出先の保護レベルを標準保護(balanced)にした場合は、USB の守りは設定に従います。設定は ~/.config/roamswitch/config.json にあり、コードで確かめた既定値は次のとおりです。
| キー | 既定 | 内容 |
|---|---|---|
usb_storage_guard_enabled | false | 許可していない USB メモリを保留する |
usb_keyboard_guard_enabled | false | 許可していないキーボードの入力を押さえる |
usb_zero_trust_enabled | false | 新しい USB 機器を、許可するまで使えない状態でつなぐ |
usb_mount_scan_enabled | true | マウントした USB メモリを ClamAV で調べる(clamav_enabled もオンのとき) |
usb_keyboard_timeout_release | false | 答えのないキーボードの保留を、3 分で解く |
away_protection_level | lockdown | 登録していないネットワークでの保護レベル |
設定ファイルを書き換え、サービスを再起動する操作です(変更を伴う操作です)。
練習のキーボードを抜き、練習の USB メモリを許可リストから外します(unallow_usb)。外出先の保護レベルは標準保護にします。保護レベルの変更は、サービスの再起動(またはネットワークの切り替え)で効きます。
setk() { python3 - "$1" "$2" <<'P'
import json,os,sys
p=os.path.expanduser('~/.config/roamswitch/config.json')
c=json.load(open(p))
k,v=sys.argv[1],sys.argv[2]
if v=='DEL': c.pop(k,None)
else: c[k]=json.loads(v)
json.dump(c,open(p,'w'),ensure_ascii=False,indent=2)
P
}
unallow_usb() { python3 - "$1" <<'P'
import json,os,sys
p=os.path.expanduser('~/.config/roamswitch/config.json')
c=json.load(open(p))
c['allowed_usb_devices']=[d for d in c['allowed_usb_devices'] if d['deviceIdentifier']!=sys.argv[1]]
json.dump(c,open(p,'w'),ensure_ascii=False,indent=2)
P
}
sudo fakeusb keyboard unplug
unallow_usb 1209:0001
setk away_protection_level '"balanced"'
sudo systemctl restart roamswitch; sleep 10
cat /run/roamswitch/state.json
roamswitch guards | grep "保護レベル"unplugged
{"active_level":"balanced","air_gap":false,"fanotify_ready":true,"network_trusted":false,"usb_zero_trust":false}
現在の保護レベル: 標準保護 [BALANCED]roamswitch guards も、デーモンがいま使っている保護レベルを出します。
許可リストから外した USB メモリを挿します。次に、USB メモリの守りだけをオンにして、挿し直します。
sudo fakeusb storage plug; sleep 6
cat /sys/bus/usb/devices/3-1/authorized
sudo fakeusb storage unplug; sleep 5
setk usb_storage_guard_enabled true; sleep 4
sudo fakeusb storage plug; sleep 6
cat /sys/bus/usb/devices/3-1/authorized
roamswitch notifications | sed -n 4,7pplugged
1
unplugged
plugged
0
2026-11-12T02:19:54.806310678+00:00
⏸ 未承認の USB ストレージを保留しました
USB ストレージガードの設定により「Practice Practice Stick (VID:1209 PID:0001)」を保留しました。使うときは承認画面で許可してください。標準保護で、守りがオフのときは、そのまま使えました(1)。usb_storage_guard_enabled をオンにすると、保留されました(0)。こちらは再起動なしで効きます。見出しは Lockdown のときと同じ「保留しました」で、本文が保留の理由(Lockdown か、USB ストレージガードの設定か)を書き分けます。usb_storage_guard_enabled がオンのときは、指紋の違う機器も、前の演習と同じ「識別情報が変わりました」の通知で保留されました。標準保護で守りがオフのときは、指紋が違っても使えて、接続の通知だけでした。
元に戻すには、足したキーを消して、再起動します。保護レベルは Lockdown に戻ります。最後に、練習の機器を抜き、モジュールを外します。
setk away_protection_level DEL
setk usb_storage_guard_enabled DEL
sudo systemctl restart roamswitch
sudo fakeusb storage unplug
sudo rmmod dummy_hcd- 持ち歩くノート PC: 外出先は Lockdown のままにします。知らない USB メモリとキーボードは、設定にかかわらず保留されます
- 自宅や会社の机の PC: 人が USB 機器を挿せる場所なら、
usb_keyboard_guard_enabledをオンにします。先に、いま使っているキーボードを許可リストに入れます - 画面の無い機械: 承認の画面が出ないため、キーボードの保留は答えが来るまで続きます(既定。コードで確認)。保留を3分で解く
usb_keyboard_timeout_releaseは、締め出しの心配と、守りの弱さを比べて決めます
#Bluetooth のキーボードのなりすましを点検する
Bluetooth のキーボードには、ペアリングしていない機器からのキー入力を受け付けてしまう弱点がありました(CVE-2023-45866、BlueDucky で知られます)。Linux の BlueZ では、/etc/bluetooth/input.conf の ClassicBondedOnly が守りです。roamswitch bluetooth-audit は、BlueZ の設定ファイルを読み、この守りを外す書き方が無いかを調べます。ファイルを読むだけで、何も実行せず、通信もしません。
BlueZ の設定ファイルを書き換える操作です(変更を伴う操作です)。この演習は、Server Edition の VM で行いました。
sudo apt install bluez
sudo cp /etc/bluetooth/input.conf /etc/bluetooth/input.conf.orig
sudo cp /etc/bluetooth/main.conf /etc/bluetooth/main.conf.orig
sudo sed -i 's/^#ClassicBondedOnly=true/ClassicBondedOnly=false/' /etc/bluetooth/input.conf
sudo sed -i 's/^#AlwaysPairable = false/AlwaysPairable = true/' /etc/bluetooth/main.conf
roamswitch bluetooth-audit=====================================================
🔵 Bluetoothキーボードなりすましの確認
=====================================================
[high] input.conf: ClassicBondedOnly=false
ClassicBondedOnly=false のため、ペアリングしていない機器からのキーボード・マウスの接続を受け付けます。近くにいる人がキーボードになりすまして、キー入力を送り込める入口になります(BlueDucky、CVE-2023-45866)。この行を削除するか true にしてください(BlueZ の既定は true です)。
[medium] main.conf: AlwaysPairable=true
AlwaysPairable=true のため、ペアリング用のエージェントが動いていなくても、近くの機器からのペアリング要求を受け付けます(既定は false)。必要なときだけ有効にしてください。
いま Bluetooth でつながっているキーボード・マウス:
なし
設定ファイルと /proc を読んでいるだけで、何も実行せず、通信もしません。見覚えのない機器があれば、Bluetooth の設定でペアリングを解除してください。書き換えた2行が、それぞれ重さつきで出ました。書いていない項目は、BlueZ の既定値と見なします。--json を付けると、同じ結果を JSON で出します。
roamswitch bluetooth-audit --json{
"installed": true,
"findings": [
{
"id": "classic_bonded_only_off",
"severity": "high",
"detail": "input.conf: ClassicBondedOnly=false"
},
{
"id": "always_pairable",
"severity": "medium",
"detail": "main.conf: AlwaysPairable=true"
}
],
"input_devices": [],
"unreadable": []
}元に戻して、もう一度点検します。
sudo mv /etc/bluetooth/input.conf.orig /etc/bluetooth/input.conf
sudo mv /etc/bluetooth/main.conf.orig /etc/bluetooth/main.conf
roamswitch bluetooth-audit | sed -n 5p BlueZ の設定に、ペアリングしていない機器の接続を許す記述は見つかりませんでした(未設定の項目は BlueZ の既定値が使われます)。#見えない部分
使い捨ての Ubuntu 24.04 の VM で、dummy_hcd の仮想の USB 機器を使って確かめました。本物の機器と違う点があります。
- 練習の機器は、カーネルの USB の仕組みを通りますが、物理的な差し込みや、電気的な攻撃は再現していません
- ClamAV が知っているものしか見つかりません。この講座は、公開の試験用の文字列(EICAR)だけで確かめました。スキャンは通知だけで、ファイルを消しません
- 指紋は、すべての記述をまねた機器を見分けられません。型番だけをまねた機器を見分けるためのものです
- ほかに使えるキーボードが無いときは、締め出しを避けるため、キーボードを押さえずに知らせるだけになります(コードの注記)
- Bluetooth の点検は、設定ファイルの点検です。この VM には Bluetooth の装置が無く、実際のペアリングや、つながっている機器の一覧は試していません
- いま使っているキーボードを許可リストに入れる前に、キーボードの守りをオンにする
- 拾った USB メモリを、スキャンの結果を見る前に開く
- 型番(VID:PID)が許可リストにあるから安全、と考える
外出先(登録していないネットワーク)で、知らない USB メモリを挿しました。USB の守りの設定はオフです。どうなりますか
解説を見る
Lockdown では、設定にかかわらず、許可していない USB メモリとキーボードを保留します。
authorizedが 0 のままで、lsblkにも出ません。許可リストに入れると、使えるようになります。
許可していないキーボードが、5 ミリ秒おきにキーを送りました。正しい説明はどれですか
解説を見る
許可していないキーボードの入力は、つながった時点で押さえます。打鍵の間隔の通知は、自動入力の兆候を伝える追加の情報です。
#次に学ぶこと
- 保護レベルの切り替えと使い分けは、「保護レベルの設定と、使い分け」(準備中)で扱います
- 見つかったマルウェアの扱いは、「不審な実行とマルウェア」(準備中)で扱います
- USB と Bluetooth の画面での操作は、Linux の操作マニュアル にあります
2026-11-12に確認しました。対象は Linux 1.17.39 です。使い捨ての Ubuntu 24.04 の VM に公開の apt でクライアント版 1.17.39 を入れ、dummy_hcd の仮想の USB 機器で USB の演習を日本語と英語(それぞれ新しい VM)で実行し、Bluetooth の点検は Server Edition 1.17.39 の VM で実行しました。
コマンドの出力は、製品の版や環境によって変わります。違いが出たら、まず製品の版を確かめてください。