2024.12.24
ビジネスが急速に変化する現代は「OODAサイクル」と親和性が高い 流通卸売業界を取り巻く5つの課題と打開策
HDMI探検隊(仮)(全1記事)
リンクをコピー
記事をブックマーク
mzyy94氏:「HDMI探検隊」と題して、LT(ライトニングトーク)をお送りします。自己紹介はさっくりと。元セキュリティ系で今は映像系をやっているエンジニアです。
探検に行く前に「みなさん、HDMIをご存じですか?」というところから、基礎を押さえておきましょう。
知っている人がほとんどだと思いますが、HDMIは、映像と音声を送る端子とケーブル、そしてその通信規格のことです。イーサネット通信や、制御系としての機器コントロールや、ディスプレイコントロールなどもできます。今回はこのHDMI制御系の探検をしていきたいと思います。
HDMI制御系には2つのプロトコルが存在しています。1つがConsumer Electronics Control(CEC)というプロトコルで、もう1つがディスプレイをコントロールするDisplay Data Channel(DDC)というプロトコルです。
CECは、主にリモコン操作や、テレビ・ディスプレイの入力切替や、HDMIがつながっている機器のスタンバイ状態やそれが復帰したときの通知などを行う単線のバス規格なのですが、DDCはもうちょっと複雑で、ディスプレイとのやりとりを中心とした、I-squared-C(I2C)を使った機器間のプロトコルです。
このDDCをもう少し深堀りすると、仕様にはこれら4つが策定されています。
1つ目、DDC/CI(DDC Command Interface)は、ディスプレイのボリュームを上げたり、ディスプレイの輝度を変えたりなどの操作をI-squared-C(I2C)を通して行う規格です。
2つ目です。コンテンツ保護のため映像自体を本当は鍵で暗号化するのですが、その鍵をやりとりするためにDDCの中ではHDCPというプロトコルが使われています。
3つ目です。EDIDは、ディスプレイが表示できる解像度やrefresh rateなどをHDMIの機器に対して送るためのプロトコルです。
4つ目に挙げているのが、SCDCです。HDMI 2.0から追加された、DRMやスクランブルなどいろいろな情報を追加でやりとりするためのプロトコルです。
この4つがDDCのプロトコルに策定されています。
これら制御系がハードウェアに対してどのようにつながっているのかは「Wikipedia」でググると出てくるのですが、HDMIの結線は一般的なType Aの端子で19本つながっています。
この図のようにつながっていて、これら4つが主に映像と音声を伝送する役割を担っていて、残りが制御系を担っています。
ここまでが制御系と映像の基礎知識でしたが、ここからは制御系の探検をしていきたいと思います。
HDMI制御系をいじっていくのですが、一般の家庭にもあるこういった機器を使って、制御系はいじることができるので、これを使いたいと思います。
Raspberry Piの回路図には、ハードウェア的にもHDMIのこの制御線がきちんとつながっていることが記されていて、ライブラリがAPIとして提供されているので、VideoCoreにつながっているHDMIの制御線をこのVideoCoreを経由して操ることができます。これらを使って探検を進めていきます。
CECを探検していく方法として、愚直にVideoCoreのAPIを叩く方法もあるのですが、もう1つの方法の、VideoCoreのAPIを使ったラッパーみたいな存在のcec-clientというコマンドを使って、CECフレームを送ってみます。
CECフレームは、けっこう単純な形式になっていて、上位ビットから「送信元バスID」「宛先バスID」「OPコード」に「引数」というかたちで流すことで、送りつけることができます。
こういったことを踏まえていろいろとやってみると、CECのフレームは送り放題なんですね。通信元の偽装はたまに弾かれるんですが、認証機構もなくけっこう自由にできます。なので、機器のリモコン操作なども、勝手にほかの機器に対して送りつけることができます。
バス自体が単線でだいぶ低速なので、送り過ぎると、けっこうな頻度でほかのCECの通信が妨害できることがわかりました。ほかにも、引数を不正なものにしてみたり、細工をしたものが実際にどうなるかをちょっと調査したところ、あまりおもしろい挙動にはつながらないことがわかりました。
次は、DDCを探検してみます。これも愚直にVideoCoreのAPIを叩く方法があるのですが、Raspberry Piはデバイスツリーのオーバーレイを当ててI2C自体を露出させられるので、これを使ってI2Cのバスを出して、実際に触ってみることで探検を進めていきます。
オーバーレイを当てると、Raspberry Pi 3までは2番のバスに、Raspberry Pi 4からは12番のバスにDDCのI2Cバスが出てくるのですが、これでフレームアドレスをチェックすると「0x37、0x3a、0x50、0x54」といったアドレスのバスが露出していることがわかります。「0x37」がDDC/CI、「3a」がHDCP、「50」がEDID、「54」がSCDCです。
これがわかったので、i2ctransferのコマンドなどを使って、いろいろと仕様書を片手にやってみると、HDCPのやりとりはけっこうな確率でテレビやディスプレイ側が処理待ちをする挙動になっているので、途中で止めると不安定になりました。あとは、HDCPの失効リストというSRMファイルが提供されているのですが、それを書き換えることでデバイスを失効させることもできました。ほかにもDDC/CIを使って、ディスプレイ設定を好き勝手にいじることができました。
簡単にいじり回せるということは、悪用も簡単にできるということですよね。「BadHDMI」と勝手に命名しましたが、「BadUSB」のHDMI版みたいなものがあってもおかしくないなと思います。
善良なHDMIデバイスのフリをして、BadUSBみたいにあるとき急に悪さをするHDMI機器が現れたとしたら相当危険じゃないか、ChromecastやFire TVなどの安全なデバイスに慣れきっている世間には衝撃が走るんじゃないかなと危惧をもっています。
認証がないので、CECやDDCが端子につながってさえいれば、どんな機器からでも送れるという点が、大きな問題点かなと考えています。
攻撃例としては、CECでリモコン信号を送りつけて、ほかのHDMI機器を勝手に操作したり、単線のバスなCECは機器によってはすべての通信が見られるので、パスワード入力を盗んだり、DDC/CIで輝度を高頻度で変えたり、ボリュームを大小さまざまな値にセットしてハードウェアに負荷をかけたり、挙動を不安定にさせたり、HDCPやSCDCの手続きを無視することで、ファームウェア側で待ちに入るのを利用して、ディスプレイ自体をハングアップさせたりなどの悪用が考えられます。
単純なPoC(Proof of Concept)をTwitterに投稿したので、興味のある方はこのハッシュタグ(#BadHDMI)で検索してもらえればと思います。
ということで、発表「HDMI探検隊」は、HDMI制御系を探検していたらBadHDMIにつながるんじゃないかなというところに着地しました。以上、発表を終わります。
関連タグ:
2025.01.16
社内プレゼンは時間のムダ パワポ資料のプロが重視する、「ペライチ資料」で意見を通すこと
2025.01.20
組織で評価されない「自分でやったほうが早い病」の人 マネジメント層に求められる「部下を動かす力」の鍛え方
2025.01.21
言われたことしかやらないタイプの6つの言動 メンバーが自主的に動き出すリーダーのマインドセット
2025.01.15
若手がごろごろ辞める会社で「給料を5万円アップ」するも効果なし… 従業員のモチベーションを上げるために必要なことは何か
2025.01.14
目標がなく悩む若手、育成を放棄する管理職… 社員をやる気にさせる「等級制度」を作るための第一歩
2025.01.21
今までの1on1は「上司のための時間」になりがちだった “ただの面談”で終わらせない、部下との対話を深めるポイント
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
2025.01.14
コンサルが「理由は3つあります」と前置きする理由 マッキンゼー流、プレゼンの質を向上させる具体的Tips
2025.01.22
部下に言いづらいことを伝える時のリーダーの心得 お願いを快く引き受けてもらう秘訣
2025.01.09
マッキンゼーのマネージャーが「資料を作る前」に準備する すべてのアウトプットを支える論理的なフレームワーク
コミュニケーション能力の高い人が“無自覚”にやっている話し方 5選
2022.08.07 - 2022.08.07
チームの生産性を上げるマネジメント術
2024.12.11 - 2024.12.11
特別対談「伝える×伝える」 ~1on1で伝えること、伝わること~
2024.12.16 - 2024.12.16
安野たかひろ氏・AIプロジェクト「デジタル民主主義2030」立ち上げ会見
2025.01.16 - 2025.01.16
国際コーチング連盟認定のプロフェッショナルコーチ”あべき光司”先生新刊『リーダーのためのコーチングがイチからわかる本』発売記念【オンラインイベント】
2024.12.09 - 2024.12.09