Slide 1

Slide 1 text

激安Linuxボード G-cluster改造のすべて @gpioblink じぶりん

Slide 2

Slide 2 text

About me じぶりん @gpioblink 会津大学 学部3年 山田 快 ❖ 英語吹き替え版アニメは神 ❖ ゲームは遊ぶより改造する ❖ 進捗出すために自己管理中 [好きなもの] 地球

Slide 3

Slide 3 text

使えなくなったハードを再利用するの大好き❤

Slide 4

Slide 4 text

趣味で電子機器の修理をしたりもします

Slide 5

Slide 5 text

今回の話の目標 ハードウェアハッキングの 楽しさを知ってほしい!!

Slide 6

Slide 6 text

G-clusterで学ぶ組み込みLinux入門 - 目次 講義編 ● Gclusterって何? ● GPLソースコードは読んでて楽しい 実演編 ● G-Cluster用のシェルを作る ● Gclusterをリバースエンジニアリングして任意コード実行してみた

Slide 7

Slide 7 text

G-clusterで学ぶ組み込みLinux入門 - 目次 講義編 ● Gclusterって何? ● GPLソースコードは読んでて楽しい 実演編 ● G-Cluster用のシェルを作る ● Gclusterをリバースエンジニアリングして任意コード実行してみた

Slide 8

Slide 8 text

Gclusterって何?

Slide 9

Slide 9 text

G-clusterは、次世代のクラウドゲーム機!!

Slide 10

Slide 10 text

G-clusterは、次世代のクラウドゲーム機!!

Slide 11

Slide 11 text

G-clusterは、次世代のクラウドゲーム機!!

Slide 12

Slide 12 text

G-clusterは、次世代のクラウドゲーム機!!

Slide 13

Slide 13 text

G-clusterは、次世代のクラウドゲーム機!! 終わってます。。

Slide 14

Slide 14 text

でも、ハード的にはそこそこのスペックで Cavium CNW6611L SoC 256MB NANDストレージ (1Gbit/SLC) 512MB メモリ(2Gbit/16bit DDR3 SDRAM) WiFi / USBポート / HDMI出力 UART(要分解)

Slide 15

Slide 15 text

でも、ハード的にはそこそこのスペックで Cavium CNW6611L SoC 256MB NANDストレージ (1Gbit/SLC) 512MB メモリ(2Gbit/16bit DDR3 SDRAM) WiFi / USBポート / HDMI出力 UART(要分解) 激安

Slide 16

Slide 16 text

でも、ハード的にはそこそこのスペックで Cavium CNW6611L SoC 256MB NANDストレージ (1Gbit/SLC) 512MB メモリ(2Gbit/16bit DDR3 SDRAM) WiFi / USBポート / HDMI出力 UART(要分解) 激安

Slide 17

Slide 17 text

つまり、gcluster = 格安Linuxボード Cavium CNW6611L SoC 256MB NANDストレージ (1Gbit/SLC) 512MB メモリ(2Gbit/16bit DDR3 SDRAM) WiFi / USBポート / HDMI出力 UART(要分解)

Slide 18

Slide 18 text

つまり、gcluster = 格安Linuxボード UART(シリアル通信)して始めましょう

Slide 19

Slide 19 text

つまり、gcluster = 格安Linuxボード

Slide 20

Slide 20 text

つまり、gcluster = 格安Linuxボード 実演編では、任意コード実行できるように改造して G-clusterにセカンドライフをおくって貰います!!

Slide 21

Slide 21 text

G-clusterで学ぶ組み込みLinux入門 - 目次 講義編 ● Gclusterって何? ● GPLソースコードは読んでて楽しい 実演編 ● G-Cluster用のシェルを作る ● Gclusterをリバースエンジニアリングして任意コード実行してみた

Slide 22

Slide 22 text

GPLソースコードは読んでて楽しい

Slide 23

Slide 23 text

LinuxのGPLソースコードの面白い点3つ 製品のコードを知れちゃう マルヒ情報もあったり 楽しいコード流用の世界

Slide 24

Slide 24 text

GPLは楽しい: 製品のコードを知れちゃう そもそもGPLライセンスとは

Slide 25

Slide 25 text

GPLは楽しい: 製品のコードを知れちゃう そもそもGPLライセンスとは ソー ス コー ドを 公 開 す る 義 務 の あ る ライセ ン ス

Slide 26

Slide 26 text

GPLは楽しい: 製品のコードを知れちゃう そもそもGPLライセンスとは ソー ス コー ドを 公 開 す る 義 務 の あ る ライセ ン ス

Slide 27

Slide 27 text

GPLは楽しい: 製品のコードを知れちゃう そもそもGPLライセンスとは ソー ス コー ドを 公 開 す る 義 務 の あ る ライセ ン ス

Slide 28

Slide 28 text

GPLは楽しい: 製品のコードを知れちゃう 特に製品にLinuxを使ってると ● LinuxカーネルはGPLライセンス ● ブートローダーのU-BootもGPLライセンス ● その他の低レイヤーレベルのOSSのコードもほとんどGPLライセンス

Slide 29

Slide 29 text

GPLは楽しい: 製品のコードを知れちゃう 特に製品にLinuxを使ってると ● LinuxカーネルはGPLライセンス ● ブートローダーのU-BootもGPLライセンス ● その他の低レイヤーレベルのOSSのコードもほとんどGPLライセンス → 製品のほぼすべての   ソースコードを見ることができる!!

Slide 30

Slide 30 text

GPLは楽しい: 製品のコードを知れちゃう しかも、定義的にはこんな感じだから (Wikipedia)

Slide 31

Slide 31 text

GPLは楽しい: 製品のコードを知れちゃう しかも、定義的にはこんな感じだから (Wikipedia)

Slide 32

Slide 32 text

GPLは楽しい: 製品のコードを知れちゃう しかも、定義的にはこんな感じだから (Wikipedia) 心理的安全性を保ちながら解析もできる!!

Slide 33

Slide 33 text

GPLは楽しい: マルヒ情報を知れるかも GPLコードを漁ってると、 いろんなドキュメントが出て くることが

Slide 34

Slide 34 text

あとは適当にGPL漁ってると

Slide 35

Slide 35 text

あとは適当にGPL漁ってると

Slide 36

Slide 36 text

あとは適当にGPL漁ってると なんかConfidentialって書いてる

Slide 37

Slide 37 text

この他にも商用アプリ側のソースコードもざくざく

Slide 38

Slide 38 text

この他にも商用アプリ側のソースコードもざくざく

Slide 39

Slide 39 text

楽しいコード流用の世界 実はハードは同じ会社が作ってるらしく

Slide 40

Slide 40 text

楽しいコード流用の世界 実はハードは同じ会社が作ってるらしく メガドライブミニのコードの中に、 ファミコンミニのコントローラのkeymap用のコードの残骸が入っていたり。。。

Slide 41

Slide 41 text

楽しいコード流用の世界 実はハードは同じ会社が作ってるらしく メガドライブミニのコードの中に、 ファミコンミニのコントローラのkeymap用のコードの残骸が入っていたり。。。 残骸まみれの結構泥臭い世界 読んでて飽きない!!

Slide 42

Slide 42 text

楽しいコード流用の世界 実はハードは同じ会社が作ってるらしく メガドライブミニのコードの中に、 ファミコンミニのコントローラのkeymap用のコードの残骸が入っていたり。。。 残骸まみれの結構泥臭い世界 読んでて飽きない!! コード流用について詳しく知りたい方は HoneyLabさんの本よむのがおすすめです!

Slide 43

Slide 43 text

講義編のまとめ ● G-clusterは、ゲーム機としては終わってるけど激安Linuxと して使える ● 企業のプロダクトがのぞき見できるGPLソースコードは面白 い

Slide 44

Slide 44 text

G-clusterで学ぶ組み込みLinux入門 - 目次 講義編 ● Gclusterって何? ● GPLソースコードは読んでて楽しい 実演編 ● G-Cluster用のシェルを作る ● Gclusterをリバースエンジニアリングして任意コード実行してみた

Slide 45

Slide 45 text

では、GPLコードをありがた〜く使いながら、 どんどん改造を進めていきましょう!!!

Slide 46

Slide 46 text

G-Cluster用のシェルを作る

Slide 47

Slide 47 text

シェルなんて簡単????? そんなことないわw

Slide 48

Slide 48 text

Gclusterのテレビ画面出力はremotectl_pipe経由

Slide 49

Slide 49 text

Gclusterのテレビ画面出力はremotectl_pipe経由 GUIを直接自由にいじれない。。。

Slide 50

Slide 50 text

でGPLコード読み漁ってみると。。。。 echo gc_warning Firmware found > /cavium/remotectl_pipe

Slide 51

Slide 51 text

でGPLコード読み漁ってみると。。。。 echo gc_warning Firmware found > /cavium/remotectl_pipe ここいじったら反映された!!

Slide 52

Slide 52 text

とはいえUSBキーボード取得できないので /dev/event1 からとれるキーボードのデータを見て

Slide 53

Slide 53 text

とはいえUSBキーボード取得できないので LinuxのカーネルとStackOverFlowを 参考にコードを書いて

Slide 54

Slide 54 text

とはいえUSBキーボード取得できないので

Slide 55

Slide 55 text

あとは頑張ってキーボード処理するコード書いて

Slide 56

Slide 56 text

できたもの

Slide 57

Slide 57 text

G-clusterで学ぶ組み込みLinux入門 - 目次 講義編 ● Gclusterって何? ● GPLソースコードは読んでて楽しい 実演編 ● G-Cluster用のシェルを作る ● Gclusterをリバースエンジニアリングして任意コード実行してみた

Slide 58

Slide 58 text

無改造で任意コード実行までの道のり

Slide 59

Slide 59 text

ここまでいろいろ話してきましたが、、、 作成したプログラムの実行には、

Slide 60

Slide 60 text

ここまでいろいろ話してきましたが、、、 作成したプログラムの実行には、 殻割り&UART取り出しが 必須でした

Slide 61

Slide 61 text

ここまでいろいろ話してきましたが、、、 作成したプログラムの実行には、 殻割り&UART取り出しが 必須でした

Slide 62

Slide 62 text

ここまでいろいろ話してきましたが、、、 作成したプログラムの実行には、 殻割り&UART取り出しが 必須でした 100個も殻割りするの めんどくせ〜〜

Slide 63

Slide 63 text

そこで、かんがえた

Slide 64

Slide 64 text

本体を改造せずに、簡単にハックする方法があれば。。 そこで、かんがえた

Slide 65

Slide 65 text

とりあえず、安定のGPLコード読み返してみると

Slide 66

Slide 66 text

とりあえず、安定のGPLコード読み返してみると なんか USBでUpgradeできそうな 機能あるじゃん

Slide 67

Slide 67 text

とりあえず、安定のGPLコード読み返してみると なんか USBでUpgradeできそうな 機能あるじゃん

Slide 68

Slide 68 text

とりあえず、安定のGPLコード読み返してみると なんか USBでUpgradeできそうな 機能あるじゃん

Slide 69

Slide 69 text

とりあえず、安定のGPLコード読み返してみると なんか USBでUpgradeできそうな 機能あるじゃん

Slide 70

Slide 70 text

とりあえず、安定のGPLコード読み返してみると なんか USBでUpgradeできそうな 機能あるじゃん USBのルートに「cameo_factory」なるフォルダ作ってそこにイメージぶちこむと どうやらfwimgに投げてくれるらしい

Slide 71

Slide 71 text

とりあえず、安定のGPLコード読み返してみると なんか USBでUpgradeできそうな 機能あるじゃん USBのルートに「cameo_factory」なるフォルダ作ってそこにイメージぶちこむと どうやらfwimgに投げてくれるらしい USBメモリを挿して起動するだ けで、 任意コード注入できそう!!

Slide 72

Slide 72 text

しかし、そんな単純ではなかった。。

Slide 73

Slide 73 text

試しにGPLソースビルドして入れてみたら

Slide 74

Slide 74 text

試しにGPLソースビルドして入れてみたら アップグレード自体はできたけど

Slide 75

Slide 75 text

試しにGPLソースビルドして入れてみたら アップグレード自体はできたけど 署名がないせいでブートできなかった。。

Slide 76

Slide 76 text

試しにGPLソースビルドして入れてみたら アップグレード自体はできたけど 署名がないせいでブートできなかった。。 ここからは、この署名チェックの回避方法に 焦点をあてて説明していきます!!!

Slide 77

Slide 77 text

どうやって回避しよう ● 頑張って本体から認証キーを取り出す(失敗) ● fwimgまわりに別の脆弱性がないか探す(成功)

Slide 78

Slide 78 text

頑張って本体から認証キーを取り出す(失敗)

Slide 79

Slide 79 text

頑張って本体から認証キーを取り出す(失敗) ブート時にU-bootから呼ばれているソースコード静的解析して頑張ってみます

Slide 80

Slide 80 text

頑張って本体から認証キーを取り出す(失敗) ファームウェアのダンプ機能なんてないので、

Slide 81

Slide 81 text

頑張って本体から認証キーを取り出す(失敗) ファームウェアのダンプ機能なんてないので U-Bootの「md - memory display」機能で ダンプしてBinaryBlobに書き戻すw

Slide 82

Slide 82 text

頑張って本体から認証キーを取り出す(失敗) そして、それっぽいデータが取れました

Slide 83

Slide 83 text

頑張って本体から認証キーを取り出す(失敗) とりあえずGPLコードに入れてREADMEとか調べてみると

Slide 84

Slide 84 text

頑張って本体から認証キーを取り出す(失敗) とりあえずGPLコードに入れてREADMEとか調べてみると やっぱりご丁寧にGPLにDVUについての解説が!!

Slide 85

Slide 85 text

頑張って本体から認証キーを取り出す(失敗) とりあえずGPLコードに入れてREADMEとか調べてみると やっぱりご丁寧にGPLにDVUについての解説が!!

Slide 86

Slide 86 text

頑張って本体から認証キーを取り出す(失敗) とりあえずGPLコードに入れてREADMEとか調べてみると やっぱりご丁寧にGPLにDVUについての解説が!!

Slide 87

Slide 87 text

頑張って本体から認証キーを取り出す(失敗) とりあえずGPLコードに入れてREADMEとか調べてみると やっぱりご丁寧にGPLにDVUについての解説が!! dvu.binの中に鍵が入ってそう!!

Slide 88

Slide 88 text

頑張って本体から認証キーを取り出す(失敗) とりあえずGPLコードに入れてREADMEとか調べてみると やっぱりご丁寧にGPLにDVUについての解説が!! あ、これはリークではないんですね dvu.binの中に鍵が入ってそう!!

Slide 89

Slide 89 text

頑張って本体から認証キーを取り出す(失敗) それで、このdvu.binをghidraで静的解析してみたけど どこにも鍵っぽいのは見つからなかった。。。

Slide 90

Slide 90 text

頑張って本体から認証キーを取り出す(失敗) もう一度README見返したら

Slide 91

Slide 91 text

頑張って本体から認証キーを取り出す(失敗) もう一度README見返したら

Slide 92

Slide 92 text

頑張って本体から認証キーを取り出す(失敗) もう一度README見返したら

Slide 93

Slide 93 text

頑張って本体から認証キーを取り出す(失敗) もう一度README見返したら 解析は不可能じゃないけど、ちょっと大変そう。。 (CTFの問題が本当に使えるんだなと思った瞬間)

Slide 94

Slide 94 text

頑張って本体から認証キーを取り出す(失敗) というわけで、こちらは最後の手段として、 別の方法を考えていきます!

Slide 95

Slide 95 text

fwimgまわりに別の脆弱性がないか探す(成功)

Slide 96

Slide 96 text

fwimgまわりに別の脆弱性がないか探す(成功) こちらもソースコード非公開だったので、ghidraで静的解析

Slide 97

Slide 97 text

fwimgまわりに別の脆弱性がないか探す(成功) こちらもソースコード非公開だったので、ghidraで静的解析 関数名とか自分でつけ直して、関数を推測していきました!!

Slide 98

Slide 98 text

fwimgまわりに別の脆弱性がないか探す(成功) こちらもソースコード非公開だったので、ghidraで静的解析 関数名とか自分でつけ直して、関数を推測していきました!! ① まずは「factory.img」ヘッダ部分からDSM232の文字列を確認して

Slide 99

Slide 99 text

fwimgまわりに別の脆弱性がないか探す(成功) こちらもソースコード非公開だったので、ghidraで静的解析 関数名とか自分でつけ直して、関数を推測していきました!! ②暗号化の有無によって条件分岐

Slide 100

Slide 100 text

fwimgまわりに別の脆弱性がないか探す(成功) こちらもソースコード非公開だったので、ghidraで静的解析 関数名とか自分でつけ直して、関数を推測していきました!! ③ 次はアプリケーションのインストール。ん、なんか実行してね?

Slide 101

Slide 101 text

fwimgまわりに別の脆弱性がないか探す(成功) こちらもソースコード非公開だったので、ghidraで静的解析 関数名とか自分でつけ直して、関数を推測していきました!! ③ 次はアプリケーションのインストール。ん、なんか実行してね?

Slide 102

Slide 102 text

fwimgまわりに別の脆弱性がないか探す(成功) こちらもソースコード非公開だったので、ghidraで静的解析 関数名とか自分でつけ直して、関数を推測していきました!! ③ 次はアプリケーションのインストール。ん、なんか実行してね? どうやらfactory.imgの最初のgunzipのblobをファイルにして、

Slide 103

Slide 103 text

fwimgまわりに別の脆弱性がないか探す(成功) こちらもソースコード非公開だったので、ghidraで静的解析 関数名とか自分でつけ直して、関数を推測していきました!! ③ 次はアプリケーションのインストール。ん、なんか実行してね? どうやらfactory.imgの最初のgunzipのblobをファイルにして、 その中のapp.shを実行している!!!!

Slide 104

Slide 104 text

わかったこと factory.img内にAppImageがあると、その場でその中のshが実行される (しかもfwimgはrootで動いてるので、普通にroot権限w)

Slide 105

Slide 105 text

わかったこと factory.img内にAppImageがあると、その場でその中のshが実行される (しかもfwimgはrootで動いてるので、普通にroot権限w) ⇓ それなら、シェルスクリプト内からsetenv叩いて、 U-Boot側に非署名ブートする設定を永続化できるのでは?

Slide 106

Slide 106 text

というわけで、署名チェック回避するブート書いて

Slide 107

Slide 107 text

というわけで、署名チェック回避するブート書いて セキュアブートの前に、署名チェックせずにブートを試す設定へ

Slide 108

Slide 108 text

署名チェック回避ブートを入れたイメージにしたら あとはこのfactory.imgをUSBメモリに書き込んで試してみると、、、、 元のイメージの前に、このバイパス用イメージを結合!

Slide 109

Slide 109 text

永続的な非署名コードの注入(CFW)に成功!! 起動時にこの画面の表示と共に、 Telnetを有効化する カスタムファームウェアを作りまし た!!

Slide 110

Slide 110 text

まとめ GPLソースコードよく読めばなんでもできる ハードウェアハッキングは楽しい!

Slide 111

Slide 111 text

おわり: みなさんもgclusterで解析に入門しよう!! https://github.com/gpioblink/build-dsm232-docker 大量にgcluster買って、 ネットラジオチューナー、 ネットワークプリンター、 Amazon dash 中継など みなさんも低コストを活かし いろんなことに使ってみてください!!! ←dockerで簡単にGPLソースやCFW用ビルド できる環境作りました!ぜひご利用ください じぶりん @gpioblink