オーディオインターフェースでSSHがデフォルトで有効化されている
(hhh.hn)- ファームウェアファイルを展開すると、デバイス内部の構造を簡単に確認でき、Rodecaster Duo ではデフォルト状態で SSH が開いていた
- アップデートパッケージは gzipped tarball 形式で、デバイスには破損時にもう一方から起動する 2つのパーティション とアップデート用シェルスクリプトが入っていた
- 取り込まれるファームウェアには 署名検証がなく、実際の SSH 接続は Ethernet 接続で確認され、公開鍵認証のみ許可 される状態だった
- Windows では USB アップデートのフローをキャプチャし、
MとUという 単一の ASCII コマンド でアップデートモード移行と書き込み実行が行われることを確認、archive.tar.gzとarchive.md5をコピーした後、再起動で新しいファームウェアが適用された - macOS では カスタムファームウェア で SSH のパスワード認証を有効にし、公開鍵を追加して実際に接続まで可能だったが、SSH がデフォルトで有効であり、デフォルト鍵が含まれていた理由は最後まで判明しなかった
ファームウェアアップデートと SSH のデフォルト有効化
- Rodecaster Duo はファームウェアアップデートの過程でデバイスへ渡されるファイルを簡単に確認でき、デフォルト状態で SSH が有効化 されていた
- macOS でディスクアクティビティを追跡してファームウェア保存場所を見つけ、ファームウェアは単純な gzipped tarball 形式だった
- アップデートを試みたデバイスでは USB ディスク書き込み機能が無効化されており、そのアップデートは失敗した
- デバイス内部には実行バイナリとアップデート用シェルスクリプトがあり、ディスクには 2つのパーティション があって、一方が破損するともう一方から起動するようになっていた
- 取り込まれるファームウェアには 署名検証がない
- Ethernet ケーブルを接続して確認したところ、SSH が実際に開いており、公開鍵認証のみ許可 される状態だった
- デフォルトで追加されていた SSH 鍵 2つが確認された
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCX/bCFTDgViuPvdFL/VMMVRrw9b5S8HcDQk17qoCEYwmI+IIG8rEAsLiaeCOwyhf9IN+8/LRaN0Z5ZfU3WMbmsKEg8zd1Yvqq74nFbhO47vbtzmCi9S4ucIKkBEVOyvyN5lt9hWf5t5nZSmlfldZK3Pem5y8wHM5A+K/gSnzp4gwQ1QYfFb068uQ+ciIdOhb8SkUs8CwzotglIbp19I6ZmXmsNj/TmpbUf5rMfUAf1gysZ5j1UdRWrvWVh5daqvZRsBBPbXEeJfDU3Nr3HR14XYt9mgexrz/5oyKSj/lQYLmh9cDfsxvkGNIQ8fF9l+n2L1KZM4lLgiGk4KFBjQHaIBZx9OebCiiZCO4NTJUBDk9a+SZpiDiipADV07s7vTInYyFA6GrmKtnq3M6upT4WJBvVuL/BMnK5yY1RZtoqox2/pcCg2rH5S1GIy0v0HFJisl7kWInlaG2mdsaCx19wAjCFe/qT9LyxjQ6+0rArI55/JJFDkNeMjrewRQwNdASjCox8vqXCBfjvsR9qv70/ywcymgsnLAnq2LuYg5FYwMMDYOvVnhACC+BYTdNDTn5oeMIjQCUenY/DPCHpJkf4YOf3YCMUTEU9tExhtwW/X+m21hS3+STLtTfqbUeg9CeuPQZgfl9vc65n3tMxAdlEGEDoTaNMAgr2TzJv92Ka9iQ==ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaNyzPfIcEeQsfzyQs/wyX6mX52kiS+4eNHfCaxFlgj
アップデートフローとカスタムファームウェア
- Windows では Wireshark と USBPcap でアップデートトラフィックをキャプチャし、RODECaster App がデバイスに送る制御フローを確認した
- デバイスをアップデートモードに入れる 'M' コマンド と、アップデートを実行する 'U' コマンド があった
- どちらのコマンドも HID report 1 で送信される 単一の ASCII 文字 だった
- 実際のアップデート構造は単純だった
Mコマンドを送った後、新たに露出したディスクにarchive.tar.gzとarchive.md5をコピーするarchive.md5はアーカイブの md5sum 値だった- その後ディスクをアンマウントして
Uコマンドを送ると書き込みが始まり、その後デバイスが再起動して新しいファームウェアへ切り替わる
- macOS では コンテナ を使って SSH のパスワード認証 を有効にし、自分の公開鍵を authorized keys に追加するカスタムファームウェアを作成した
- 書き込みに必要な最小限の関数例は こちら で確認できる
- スクリプトを実行して書き込んだ後、デバイスに SSH で接続できた
- このデバイスはファームウェアを非常に簡単に書き込め、SSH のデフォルト有効化とデフォルト鍵が含まれていた理由は確認されないまま残っている
- この問題は RODE にチケットで報告したが、回答は得られなかった
- その後のファームウェアアップデートで変化があるか、引き続き確認する予定だ
1件のコメント
Hacker Newsのコメント
デフォルトで検証を有効にしておくのは構わないが、ハードウェアを買った人が自分の鍵を登録したり、ジャンパを切り替えたり、起動時にボタンを押したりして、所有者による制御権を持てるべきだ
実際にそこまでやってくれるのは一部の Chromebook やネットワーク機器くらいなので、ファームウェアのセキュリティの話になると、いつも「がっちりロックしよう」と「完全に開放しよう」の争いになり、実際に金を払ったユーザーが決める仕組みは消えてしまう
Rode が tarball + hash で配布しているのはとても良いし、今後もっと厳格になったとしても、自分の持っている機器に自分の入れたいものを載せられる仕組みであってほしい
こういう形で開かれたデバイスがもっと増えてほしいし、Rode がこれを見てファームウェアアップグレードをロックしてしまわないことを願う
どうか変えないでほしい
2009年ごろのプリンタで、RAM を 256MB に増やすにはファームウェアアップデートが必要だったのだが、ネットワーク経由でプリンタに tarball を FTP で送るだけでよかった
FileZilla で送ったら数分動いて、そのままアップデートが終わり、それ以来ファームウェア更新がこれより複雑である必要はあるのかと思うようになった
セキュリティのために checksum くらいはあってもよいが、単に FTP や SCP や SFTP で blob を1つ送って終わりにしてほしい
いわば DFU mode に入らないとできないようにすべきで、そうでないと USB にアクセスできる何かが誤ったファームウェアを押し込んで機器を文鎮化できてしまう
10年、20年前なら、こういう機能はおそらく小さな16ビットまたは32ビット SoC 上の VxWorks のような RTOS で実装されていた可能性が高い
物理コントロールも多いし、次の段階としてゲーム機にするのも自然に見える
しかも 1GbE ポートが2つあり、それぞれ機器の別々の部分と通信している
ただ、こういう構成はプロオーディオの世界ではそれほど珍しくなくて、家の机の上で使うと印象的なだけで、業界ではかなり普通の部類だ
そのうち root shell を取ったり文鎮化したりした後の話のほうが、もっと面白いかもしれない
コストと互換性の面で Linux に勝つのも簡単ではない
通常は下に ARM SoC 上で動く最小限の Linux があり、ベンダーの BSP がうっかり sshd を有効にしたまま出荷されることもある
悪意というより、オーディオ分野では rootfs をきちんと面倒見る人がいない場合に近い
重要なのは、これが USB 側のネットワークにだけ開いているのか、それとも実際の LAN にも開いているのかという点だ
前者は面倒なだけだが、後者は本当に気になる
それに比べて Android には eng / userdebug / user のように基本イメージ種別の区別があるので、事前構成されたデフォルトを選ぶだけでもこうしたミスを避けやすい
特定の機能を使うときだけ Wi‑Fi に接続しているので、そのインターフェースも開いているかは確認できていない
エージェントに投げるだけで、数分でファームウェアを見てデバイスを改造するためのアプローチを出してくる
去年までなら、こういうのは少なくとも Hotz級 のハッカーか、あるいはとてつもなく長く粘って掘り下げる人がやることだった
LLM が解析、デバッグ、回避をずっと容易にしたのは確かだが、このデバイスは保護レベルが非常に低く、中程度のスキルしかなくても、動機と時間があれば十分可能だった
暗号化されたファームウェアもなく、署名検証もなく、内蔵の SSH access まであった
一方で George Hotz が突破した PS3 hypervisor は、攻撃者目線でははるかに堅牢に設計されており、実際のエクスプロイトには FPGA を使った voltage glitching まで必要だった
そういう種類の攻撃は LLM が助けにはなっても、完全なフィードバックループがないため、依然として人手がかなり必要だ
https://rdist.root.org/2010/01/27/how-the-ps3-hypervisor-was-hacked/
Wireshark が入っていないなら多少時間は節約できるだろうが、幻覚のリスクも少しある
それ以外には、Docker の中でファームウェア tarball の
~root/.ssh/authorized_keysと/etc/shadowを修正し、関連する HID メッセージを送って、修正済み tarball をデバイスが USB ドライブのように公開しているボリュームにコピーする簡単な Python スクリプトを書いた程度だっただからこれは狂ったハッカーが必要な仕事ではなく、Linux sysadmin の基礎と USB HID ライブラリを組み合わせてちょっとしたプログラムを1つ書ける程度で足りる
ただ、なぜ Ubuntu コンテナに
whoisパッケージを入れたのか一瞬不思議だったが、Debian 系では歴史的な理由で mkpasswd がそこに入っているので納得したまた、デバイスの
sshd_configがデフォルトのままだったなら、PermitRootLoginのせいで root のパスワードログインはそもそもできなかった可能性が高いhttps://bugs.debian.org/cgi-bin/bugreport.cgi?bug=116260
Credo 50 を IQ250 として偽装したが、中身は実質的に同じだ
深掘りする楽しさはあるが、年を取るとランダムなファームウェア blob を相手に 16時間 も費やすのはきつくなる
しかも SSH が開いているデバイスを扱うのに特別な技術が必要なわけでもない
同じ部屋でゲームをしながら Discord を使い、自分と彼女がそれぞれ自分のコンピュータにマイクをつなぎつつ、echo なしで使いたいという部分が特にそうだ
両方とも同じ Discord 通話に入り、2本のマイクを片方のコンピュータの入力にまとめて送り、もう片方はマイクをミュートしたままクライアントで音声だけ受ければいい
ミキシングはローカルで行われるので、エコーは発生しない
もっと知りたければメールしてほしいと言いたくなるくらい簡単だ
遅延はだいたい 40ms、Wi‑Fi 経由だと 50〜60ms くらい出る
1台の PC でミキサーを動かしてローカルマイクを入力チャンネル1にし、もう1台の PC は自分のマイクをブロードキャストしてミキサーのチャンネル2に入れれば、同じように解決できる
ローカル PC で音楽も流せるし、ミキサーや broadcaster がローカル sink を作ることもできる
最後に全部をミキサーで混ぜて、メインアウトを Discord に送り、モニターラインは Discord 音声を出した後で別の PC にリレーしてリアルタイム試聴に使える
もちろん、こちらが状況を誤解しているのかもしれない
Zola は詳しくないが、これが一般的なテンプレートなのかカスタムなのかは分からなくても、とても見栄えが良い
だから signed image のようなものを強制するのだろう
こういうインターフェースなら、むしろ開いたままにしておきたいのではないかと思った
向こうではほぼ英語みたいなものも話しているので、話は通じるはずだ