TiVoの「ハッキング」に関する多数のサイトがあり、そのためのノウハウがあれこれ書かれています(そして、してはならないことも必ず書いてあります)。結局、Linuxで動くものを持つ楽しみの大半は、本来の目的以上(または本来の目的以外)のことをさせることにあります。しかし、大半の人が必要としているのは多数のWebサーバーだけです(今思いつくだけでも、私の家には、組み込みシステムも含めて、すでに10台から15台のWebサーバーがあります)。
TiVoハック攻撃計画についてのちょっとしたアドバイス。おそらく皆さんは、保証の対象外になることと、ビデオ・レコーダーとして使えなくなることを覚悟すべきでしょう。それほどひどいことにはならないかもしれませんが、機械にちょっと手を加えようとしたために修理しなければならない羽目に陥って感じる苛立ちも、壊したのは自分自身だという認識によって相殺されることでしょう。
ハード・ディスクをアップグレードしてみる場合、オンライン・マニュアルには、まず、金物屋でT10とT15のTorxドライバーを買ってくるように書いてあります。これは部分的に良いアドバイスです。TiVoには本当にT10とT15のTorxねじが使われています。しかし、ずらりと並んだTorxビットのコレクションをすでに持っているという種類の人でない場合、これに手を出す必要はありません。KuroボックスとMac Miniのおかげで、かなり手ごろなPowerPC®ハードウェアという選択肢があります。
この実験のために私が選んだのは、40時間のTiVoです。これはSeries2のマシンなので、Series1よりも柔軟性やオープン性がありません。あいにく、今では、それしか手に入りませんが、値段はそれほど高くありません。
いつものように、電子環境を変える可能性のあることをするときには、まず、バックアップを取りましょう。TiVoの電源を入れる前に、TiVoのディスクのバックアップを作成しました。このためには、マシンを開いて(T10 Torxビットを使用)、ドライブ・スレッドを外し(やはりT10)、スレッドからドライブを外す必要があります(T15)。これで、40GBディスクが手に入りました。このドライブを旧式のx86 Linuxボックスに入れると、未知のパーティション・テーブルがあることに気づきます。そうです。TiVoにはパーティション(/dev/hde1のような)はなく、ディスク全体が1つのパーティションなのです。問題ありません。
図1. TiVoの内部
私のシステムでは、ドライブをドライブ・ベイに入れて、/dev/hdeにしました。外付けドライブ・ベイを使用する場合は、/dev/sdXと表示されるかもしれません。Xは、任意の英字です。他にSCSIまたは擬似SCSIデバイスがない場合はaかもしれませんし、もっと後のアルファベットかもしれません。作業中のディスクはどれかを確認しておいてください!
リスト1. コピーの作成
# bzip2 -1c < /dev/hde > tivo.img.bz2
|
最初は何かがとんでもなくまずいことになっているように見えるかもしれません。しばらくは何も出力が表示されません。このディスクには、最初はゼロで満たされている空のセクターが多数あり、bzip2がそれらを見事に、律儀に圧縮しています。ファイルが4,096バイトに達するまで1分以上かかり、8,192に達するまで数分かかりました。最終的なファイル・サイズは約560MBであり、40GBのディスクのイメージとしては悪くありません。このバックアップからリストアしたい場合は、もう1つの方法を実行するだけです。
リスト2. 運命の逆転
# bzip2 -dc < tivo.img.bz2 > /dev/hde
|
ドライブにデータが入っていると、イメージは560MBよりかなり大きくなります。TiVoドライブのサイズと同じぐらいの空き容量が必要だと考えてください。
ディスクはパーティション化されているようには見えないので、何らかの独自フォーマットになっていると考えるのが妥当でしょう。そのフォーマットが何かを見つけ出す時間です。
もちろん、最初にすべきことは、ディスクを生のバイトとして見ることです。まず、ブート・ローダーの構成のような小さなものがあります。
リスト3. このブートは前に見たことがある?
root=/dev/hda7
runfinaltest=2 contigmem8=16M brev=0x10
|
ただし、その後に、すべての謎を解く鍵があります。このディスクにはAppleパーティション・マップが含まれています。
リスト4. 輝けるApple
0x0200 50 4d 00 00 00 00 00 0d 00 00 00 01 00 00 00 3f 'PM.............?'
0x0210 41 70 70 6c 65 00 00 00 00 00 00 00 00 00 00 00 'Apple...........'
0x0220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 '................'
0x0230 41 70 70 6c 65 5f 70 61 72 74 69 74 69 6f 6e 5f 'Apple_partition_'
0x0240 6d 61 70 00 00 00 00 00 00 00 00 00 00 00 00 00 'map.............'
0x0250 00 00 00 00 00 00 00 3f 00 00 00 33 00 00 00 00 '.......?...3....'
|
そうではないかと思いましたか?
今にして思えば、Appleパーティション・マップは、PowerPC Linuxボックスがまさに持っているべきものです。Appleパーティション・マップのサポートは珍しいことではなく、かなり詳しく説明されています。MIPSシステムではそれほど一般的ではありませんが、PowerPCで動作していたSeries1システムとの互換性が考慮されたのでしょう。
厳密に言うと、これはまだ独自フォーマットです。有名なフォーマットであるにすぎません。あいにく、どのパーティションもOS Xになじみのあるフォーマットではありませんが、私のMac Miniはパーティション・テーブルを読み取ることができました。パーティション・マップを以下に示します。
リスト5. なじみのあるフォーマットでしょう?
Partition map (with 512 byte blocks) on '/dev/rdisk1'
#: type name length base ( size )
1: Apple_partition_map Apple 63 @ 1
2: Image Bootstrap 1 1 @ 44161324
3: Image Kernel 1 8192 @ 44161325 ( 4.0M)
4: Ext2 Root 1 524288 @ 44169517 (256.0M)
5: Image Bootstrap 2 1 @ 44693805
6: Image Kernel 2 8192 @ 44693806 ( 4.0M)
7: Ext2 Root 2 524288 @ 44701998 (256.0M)
8: Swap Linux swap 262144 @ 45226286 (128.0M)
9: Ext2 /var 262144 @ 45488430 (128.0M)
10: MFS MFS application region 524288 @ 45750574 (256.0M)
11: MFS MFS media region 33494098 @ 46799150 ( 16.0G)
12: MFS MFS application region 2 524288 @ 46274862 (256.0M)
13: MFS MFS media region 2 44161260 @ 64 ( 21.1G)
Device block size=512, Number of Blocks=80293248 (38.3G)
DeviceType=0x0, DeviceId=0x0
|
これで、だいたい予想が付きます。ひとつ言えば、これはおそらく、アップデートを安全にするために、あるファイル・システムを別のファイル・システムから実行中にアップデートするために設計されたように見えます。また、驚いたことに、これによって、ファイル・システムから認識できる正確なブロック・オフセットとサイズがわかります。つまり、ドライブをLinuxボックスに接続し直して、これらのファイル・システムを見てみる時間です。
リスト6. ファイル・システムの詳しい調査
# dd if=/dev/hde bs=512 count=524288 skip=44169517 of=root1.img
# dd if=/dev/hde bs=512 count=524288 skip=44701998 of=root2.img
# dd if=/dev/hde bs=512 count=262144 skip=45488430 of=var.img |
ルート1ファイル・システムはフォーマットさえされていないことがわかります。256MBのヌル・バイトにすぎません。しかし、ルート2ファイル・システムは有望です。
リスト7. ユーレカ!
# file root2.img
root2.img: Linux rev 0.0 ext2 filesystem data
# mount -o loop root2.img /mnt
# ls /mnt
. bin diag etc initrd lib mnt proc sbin tvbin var
..dev dist etccombo install lost+found opt res tmp tvlib
# mount -o loop var.img /mnt/var
# ls /mnt/var
. a dev etc lost+found mnt packages run tmp
..bin dist log mess mtab persist state utils
|
これが基本的に独自システムであることによるデメリットの1つは、出荷時のTiVoはユーザーによる改変防止を目的とした「セキュリティ」機能を備えていることです。これは単純な経済問題です。ハード・ドライブとTVチューナー付きの汎用MIPSシステムを100ドルで販売したのでは、たちまち破産してしまいます。そこで、今のところは、Linuxがこのシステムをどう変えるのかではなく、どのように動作するのかを見るだけにしておきます。
あるシステムから別のシステムへのext2ファイル・システムの便利な互換性は、通常のLinuxボックスで遊ぶという選択肢があることを意味します。クロスコンパイラーと関連ツールをセットアップして、もう少し突っ込んでつつきまわすこともできます。ただし、物事を簡単に変えられるとは期待しないでください。変えることができたとしても、簡単で便利になるとは限らないのですから。忘れてならないのは、これはビデオを記録する機能を備えた専用のハードウェアであるということです。言うまでもなく、多くの企業は、大きく変えるのが難しいものであってほしいと願っています。
TiVoのこの特定のモデルでは、カーネルがロードされる前にハードウェア・セキュリティ・チェックがあります。さらに、カーネル自体に、いくつかのセキュリティ機能を含んだRAMディスクが組み込まれていて、/var/utils/checkkernel.tclスクリプトなど、ハード・ドライブ上で見つかったコードと比較します。
注目に値するのは、インストール当初に、非常に大量の余分なスペースがあることです。ルート・ファイル・システムの使用領域は54MBであり、空き領域は182MBです。/varの使用領域は3MBであり、116MBが空き領域です。もちろん、これは、見たい番組など、大量のデータを格納するためです。
TiVoでさらに面白いことの1つは、専用アプリケーションの豊富さです。理論上はディスプレイを利用できますが、実際には画面上のテキストをスクロールすることさえできません。/tvbin/text2osdという名前の実行ファイルがあり、これは出力されるビデオの上にオンスクリーン・ディスプレイとして単語を書き出すアプリケーションのようです。おもしろいPNGファイルの集合もあり、すべて一般的なビデオのサイズであり、表示する必要があるメッセージを含んでいます。私の好きなダグラス・アダムス流に言えば、「あわてるな」。
このソフトウェアは少々まとまりがありませんが、実際には、「直感的」な場所にある必要はないわけです。開発チームにわかればいいだけなのですから。他のことに比べて、筋がとおらないこともあります。TiVoソフトウェアはすべて/tvbinと/tvlibにありますが、プログラムの多くの構成ファイルは/opt/tivoにあります。より伝統的なLinuxファイル・システムのレイアウトであれば、ファイルは/opt/tivo/bin、/opt/tivo/lib、および/opt/tivo/etcに置かれていたでしょう。
Tclスクリプトを見ると、それが/tvbin/tivoshによって解釈されていることに気づきました。これはおそらくtclインタープリターです。しかし、ちょっと待ってください。これは実際にはtivoappというプログラムへのシンボリック・リンクです。さまざまなプログラムがtivoappにリンクされています。これは多数のさまざまなプログラムのビットを含んでいる統一バイナリーのようです。このアプリケーションがこのようになっている理由はすぐにはわかりませんが、メモリー・フットプリントを減らすためかもしれませんし、単にシステムをクラックしにくくするためかもしれません。
ミスマッチ
注目に値すべきこととして、TiVoはシェル・スクリプト、Tclプログラム、およびバイナリーのかなり緩い組み合わせだということです。特定のプログラムを見てみると、それが何をするプログラムなのか、かなりのことがわかります。たとえば、installNFSスクリプトは、bashで書かれていて、text2osdを呼び出してメッセージを表示します。インラインTclスクリプトさえあります。
開発面でのLinuxの大きな強みの1つは、このような開発ツールのミスマッチの自由度が高いことです。TiVoはこの点をうまく利用しています。
システム・ブート
どのLinuxシステムとも同様に、TiVoも/sbin/initを分岐生成し、これが/etc/inittabを検索して、何をすべきかを決定します。最初にするのは、/etc/rc.d/rc.sysinitの実行です。そして、これがStageA_PreKickstartやStageG_PostApplicationなどの名前が付いたディレクトリーにあるファイルを実行します。これらは順に実行されます。
これらのディレクトリーのそれぞれに、rc.Sequence_150.CheckForDebug.shというような名前の多数のスクリプトが含まれています。これらは、従来のLinuxシステムでの/etc/rc.d/rc3.d/S12sshdのようなファイルに相当します。シェルの照合拡張の習慣(rc.Sequence_*.sh)が、順序付けのために使用されています。スクリプトの名前に.Platformという文字列が含まれる場合、それは一致するハードウェアでだけ実行されます。
これは家電メーカーにとって良い設計です。マシンごとにディスクの組み立て方を変える必要がないからです。.Implementationおよび.Implementerフラグについても同じことが言えます。これらは、特定のシステムでだけ実行するスクリプトを識別します。rcN.dディレクトリーはなく、その代わりにStageディレクトリーがあります。
この編成は、ブートの各段階で何がおこなわれているのかを比較的わかりやすくします。面白いことに、シェル・スクリプトが親シェルにソースを提供しているので、始めの方のスクリプトで、後で使用するスクリプトの環境変数を設定することができます。
TiVoは、Linuxのさまざまな理念を体現している魅力的な例であり、サービスを売り、ユーザーにとって単純で堅牢なアプリケーションを提供することによって収益を得ている企業の理念とは鋭い対称を見せています。自称ハッカーにとって最もいらいらさせられる機能の多くは、おそらく、完全にカスタマイズされたボックスによって、ユーザーがカスタマー・サポートに電話しなくて済むように、また、なぜ動かないのだろうと思ったりすることがないようにするためのものです。
一方、マシンをいじるのをますます難しくための努力が行われているのも明らかです。初期のTiVoシステムは、しばしばWebサーバーに転用されました。私が調べたのは、誰でもわかるように、ソフトウェアの無許可の改変をチェックするPROMを実際にハードウェア・ハックしないことには、新しいカーネルを走らせたり、カーネルを大幅に変えたりすることはできません。
特に興味深いのは、GPLがTiVoにカーネルのソース・コードを作成するように強制しながら、実際には、Linuxで動くけれども、ユーザーによるどんな変更も許さないようなボックスを作れないようにしているわけではないということです。このボックスの面白さの大半は、何をどんな風にしているのか、いかに多彩なオープン・ソース・ツールとテクノロジーを使用して組み込みアプリケーションが作られているかを学ぶことにあります。
- Peter執筆による、Linux on boardシリーズの他の記事も読んでください。
- Series2 TiVoは、Broadcom BCM7317チップを基にしています。このチップはMIPSコアに、セットトップ・ボックスを手軽にサポートするための機能が付加されています。
-
Atmel AT90SC6464C chipは低消費電力でハイ・パフォーマンス、8/16ビットのセキュアなマイクロコントローラーです。64KB/64KBのROM EEPROMと、セキュリティー機能として、MMUやMED、OTP (One Time Programmable) EEPROM領域、RNG (Random Number Generator)、「領域外」検出機構、副チャネル攻撃対策などを備えています。
- TiVoを、もう少し愛想の良いハードディスク・レコーダーに変身させるための資料として、hacking the TiVo Series 2があります。
- TiVoをいじるための議論が沸騰している場所として、DealDatabase Forumがあります。ただし、DirectTVを無料視聴できるような方法は提供していません。
- PeterのTiVoのニックネームはSeries 2.5です。セキュリティーを上げるために、再フラッシュ不可能なチップを使っています。これについては、このスレッドを読んでください。
-
The Hitchhiker's Guide to the Galaxy(ムービー版)というサイトを見てください。パニックに陥らないようにご注意!
- 「Linuxが組み込み市場を席捲する3つの理由」(developerWorks, 2001年5月)では、権利使用料とデバイス機能、単一プラットフォームという約束、の3つを挙げています(この記事ではTiVoについても触れています)。
- 「Software Development for Consumer Electronics: Bigger, Better, Faster, More -- Or Bust」(The Rational Edge, 2004年)では、利益率が紙のように薄いコンスーマー・エレクトロニクスにとって、最善の選択肢がLinuxであることを詳述しています。
- 「Emulation and cross-development for PowerPC」(developerWorks, 2005年1月)は、PowerPCエミュレーションとクロス・コンパイルを紹介しています。
- 「A developer's guide to the POWER architecture」(developerWorks, 2004年3月)は、アプリケーション・レベルでのPowerPCプログラミング・モデルを紹介し、命令セットや重要なレジスターなどの概要を提供しています。
-
developerWorksのLinuxゾーンには、Linux開発者のための資料が、他にも豊富に用意されています。
-
developerWorks blogsに参加して、developerWorksのコミュニティーに加わってください。
- 皆さんの次期Linux開発プロジェクトを、IBM trial softwareを使って構築してください。developerWorksから直接ダウンロードすることができます。
