290円で作るBadUSB
牛丼より安い。
はじめに
カフェやコワーキングスペースで、ノートPCを置いたまま離席する人をちょこちょこ見かける。人によってはロックもせず操作可能な状態でポンとおいてある。正気か?
日本は比較的治安が良いので、PCを盗まれることはあまりないが、席に戻ったときにPCがあったからといって、100パー安心とは限らない。
第三者がPCへ物理的にアクセスできる状況というのは、何をされていてもおかしくない(と、考えるべき)。
例えば、USBポートに接続するだけで、任意の操作を自動実行するデバイス(BadUSB)がある。これを使えば、一生懸命キーボードをカチャカチャしなくても一瞬でコマンドの実行や、マルウェアのインストールなどができてしまう。
本稿では、PCに物理アクセスできることの危険性を伝えるために、BadUSBライクなデバイスを290円で作る話を紹介します。
なお、悪用可能なコードは公開しない。知識のない人が面白半分で真似するのは避けたいので。
知識のある人ならこの記事があろうがなかろうが作れてしまうので、良心に訴えかけるしかない。知識は正しく使いましょう。
BadUSBとは
BadUSBは、USBデバイスの機能を悪用する攻撃手法として知られている。
起点となったのは、2014年にSecurity Research LabsのKarsten NohlとJakob Lellらが BlackHat USAで発表した研究 で、USBデバイスのファームウェアを書き換えることで、本来とは異なる機能を持つデバイスとして振る舞わせられることが示された。
例えば、USBメモリがキーボードとしても動作する、といったものだ。
まだアタリを引いたことがないのだが、安物のUSBメモリを通販で買うとたまに混じっているらしい。
陸上自衛隊や三重県のUSBメモリ内にマルウェアが見つかった問題と併せて、BadUSBの存在は一般にも広く報じられた。
厳密には、HIDデバイスをマイコンで作るのと、既存USB機器のファームウェアを書き換える本来のBadUSBは異なるのだが、本稿では悪意あるキーマウ操作が可能なデバイスを広義のBadUSBとして呼称する。
代表的な製品としては、Hak5の「USB Rubber Ducky」が知られている。
価格は100ドルからと、個人の学習用としては少し高価。
一方、USBキーボードを模倣するという基本的な機能だけなら、安価な汎用マイコンでも実現できる。
ぼくは手元にUIAPduinoという信じられない激安マイコンがたくさんあったので使うことにした。
| 製品 | 価格 | 備考 |
|---|---|---|
| USB Rubber Ducky | $100~ | 専用デバイスの代表格 |
| Flipper Zero | $169 | BadUSB機能を備えた多機能デバイス |
| 汎用マイコン | 1,000円前後 | 頑張って自分で実装 |
| UIAPduino | 290円 | 同上。超安い |
HIDとは
USBには、接続するデバイスの機能に応じたクラスが定義されており、その一つがHID(Human Interface Device)である。これはキーボードやマウス、ゲームコントローラーなど、人間がコンピューターを操作するための入力機器で利用される。
一般的なOSにはHID用のドライバが組み込まれているため、USBキーボードを接続するたびにわざわざ専用ドライバをインストールする必要はない。これは便利な仕組みである一方、注意も必要。
キーボードを模倣するUSBデバイスが入力を送信しても、通常のキーボード操作と同じように処理される。
つまり、実際に人間が入力しているのか、USBデバイスが勝手に入力しているのか、OSからは通常区別されないということだ。
実装
今回使用したのは、UIAPduino Pro Micro CH32V003 V1.4。
搭載されているCH32V003は、48MHzで動作するRISC-Vマイコン。
Flashは16KB、SRAMは2KBと使いどころは限られるが、今回のように単純なキーボード操作の自動化するだけなら十二分。
コーディングにはArduino IDEと、UIAPduino向けに公開されているHID ProMicro CH32V003というボードパッケージを使用した。
Keyboard.hを使えば、Arduinoと同じような感覚でキーボード入力を制御できる。
プログラム自体はシンプルで、USBキーボードとして認識させ、あらかじめ定義したキー入力を送信するというだけのもの。
接続した瞬間に勝手に動き出すのは困るので、待機モードと実行モードを設けてボタンで切り替えられるようにした。 UIAPduinoについているリセットボタンは、通常はスイッチ入力に使えるものではないため、リセット要因の判定+リセット後も保持されるRAM領域を組み合わせてモード切替に利用している。
動かしてみる
検証用のWindows PCに接続したところ、Windowsからは通常のUSBキーボードとして認識された。
290円で作るBadUSB。
— S.Nakano (@sum3sh1) October 4, 2026
カフェでPCを置いたまま離席するなど、第三者が端末に物理アクセスできる状況は危ないですよ、というデモに使えるかも。
専用品だと$100、汎用マイコンでも1,000円くらいするけど、この価格帯なら学校や社内研修など、多人数向けの教材に用意しやすい。 pic.twitter.com/R0PKuC1EVk
ボタンを押して実行モードに切り替えると、Win+R → PowerShellコマンド入力 → 電卓(calc.exe)起動 の処理が実行された。
上記は無害なコードで実行しているが、ClickFixのような実際の攻撃でみられる手法とプログラムの呼び出し的には同じ。
当然、外部からマルウェアをとってきて実行する...のようなことも可能。
もちろん、実行できる処理はログオン中のユーザー権限やOSの設定に左右されるので、これだけで管理者権限を取得したり、画面ロックを突破したりできるわけではないが。
痕跡
不安になる人もいるかもしれないので、Windowsにどんな痕跡が残るのか簡単に触れておく。
イベントログにはUSBデバイスの認識や構成に関する情報が記録されることがある。System.evtx に イベントID: 20001 でドライバインストール時の記録が残ったりね。
レジストリだと、HKLM\SYSTEM\CurrentControlSet\Enum\USB , HKLM\SYSTEM\CurrentControlSet\Enum\HID に過去認識したデバイス一覧が出てたりもする。
USBメモリ兼用なら、SANS Windows Forensic Analysis POSTER の External Device/USB Usage が詳しい。
ざっと接続痕跡を見るだけなら NirSoft - USBDeview なども有名だが...なんでもかんでも自分のよくわからないソフトを実行するのは危険だということは常に意識しておくこと。
また、仮にUSBデバイスが接続された痕跡を確認できても、具体的にどんなキー入力が行われたかまではわからないことが多い。
PowerShellの実行痕跡とか、Microsoft Defenderの検知記録を追っていってようやくわかったりとか。
そんなことわざわざしたくないですよね。じゃあPCを置いたまま離席するのはやめましょう。
おわりに
物理的にPCへアクセスできることの危険性を伝える教材として使えるかもしれませんね。 この価格帯なら、学校や社内研修で人数分用意して実習とかやってもいいね。
UIAPduinoの製作者、ライブラリの製作者、およびすべての関係者さまに感謝。
おしまい