ぼくフルスタックエンジニア。

フルにスタックされすぎて積んでる人のブログ

【X-I】seccampに参加したい人のための、参加課題の解き方【IoTセキュリティトラック】

今回は、「seccampの参加課題の解き方」をテーマに、私がX-IトラックのIoTセキュリティトラック応募時に解いた課題の内容を解説していきます。他のトラックと違い、数学的な内容の一切ない取っ掛かりやすい問題だったので、みなさんもこれを読んでぜひセキュリティキャンプに応募していただけたら嬉しいです。

この記事について

この記事は、セキュリティキャンプ全国大会2020オンラインのグループワークメンバー「電源50Hz」が週替わりで作成するセキュリティ技術ブログとして作成しました。前回の記事は@shoumojiくんがまとめてくれた、プラットフォームセキュリティトラックの課題の解き方でした。

qiita.com

IoTセキュリティトラックとは

参加課題について書く前に、まずはトラックについて簡単に紹介します。

IoTセキュリティトラックとは、IoT機器を改造したり分解したりして脆弱性を探すトラックです。

f:id:gpioblink:20201121210017p:plain

公式のプログラム説明にはこのように書いてあります。

IoTセキュリティトラックでは、IoT機器が抱える脆弱性を明らかにするために、リバースエンジニアリングしたり、解析したりするトラックです。 このトラックでは、実際の機器がどのような仕組みで動作しているかを、分解したり様々な面から解析したりして明らかにしていくことで、IoT機器をセキュアにすることに貢献します。

昨年はチームで大型の機器を解析していたようですが、今年はオンラインになり各自が分解したい機器を解析しています。

まだまだ解析中ですが、UARTを探すところからSDR無線に触ったりなど様々な解析の技術に触れることができ、充実しています。

参加課題の解き方

では、さっそく本題の解説パートに入っていきます。

前回の@shoumojiくんのように、ほかのトラックでは高度な数学の問題を課せられたりしていましたが、私のトラックはそれとは全く違いました。

数学的な問題は一切なく、全て文章で記述する系の課題でした。

[問1] 今までにリバースエンジニアリング(分解や解析など)した経験を好きなだけ語って下さい。対象はソフトウェアやハードウェアに限定しません。

[問2] あなたが今一番リバースエンジニアリング(分解して仕組みが知りたい)したいものを紹介して下さい。

[問3] 以下の技術用語について解説してください。またどのようなところで使われているかも述べてください。わからない場合は調べて、自分なりに解釈した結果を述べてください。
「UART」「JTAG」「SPI(Serial Peripheral Interface)」「I2C(I-squared-C)」「ソフトウェア無線(SDR)」

[問4] 安全なファームウェアアップデートとは何ですか? もし、それができると攻撃者はどのような攻撃ができますか?事例などもご存知であれば合わせて紹介してください。

[問5] 分解や解析して、モノやソフトウェアの動く仕組みを知ることは楽しいと思いますか?また、それは何故かを好きなだけ語ってください。

[問6] 何か他にアピールしたいことがあれば、自由に書いてください。誤ったことを書いていても減点はしません。書いておきたいことはなんでも書いてください。

https://www.ipa.go.jp/files/000084572.txt

ここからは、一問一問について、どんな内容を記述したかや、どれだけの分量を書いたかまとめていきます。

[問1] 今までにリバースエンジニアリング(分解や解析など)した経験を好きなだけ語って下さい。対象はソフトウェアやハードウェアに限定しません。

この節では、今まで自分がやってきたリバースエンジニアリングだと思うことを4つほど書きました。分量はリンクを除き合計で1,300文字程度です。

正直、「動的に内容の変わるUSBメモリの作成」とかはあんまりリバースエンジニアリングではないし、「ゲームウオッチの修理」に関しては物理的な部品の交換といった話ですが、まあカスってはいるかなってという感じで書いてみました。

内容は、全て以前LT大会などで発表したことがある内容だったため、スライドを見て思い出しながらまとめてみました。この課題に限りませんが、LT大会とかに参加しておくと後で資料が残って便利です(笑)。

G-cluster

Linux搭載のクラウドゲーム機、G-clusterを改造して遊ぶためにリバースエンジニアリングをしています。 リバースエンジニアリングと言っても、「u-boot + Linux」の標準的な構成なので、GPLソースコードが公開されているので、基本的にはGPLのコードを見て、binary blobとなっているものをghidraにかけるて解析するといった感じです。

これまで、キーボード入力でシェルが表示できる改造、telnetや任意のコードを動かせるカスタムファームウェアの作成、本体を無改造でカスタムファームウェアに書き換える方法の確立など、様々なことを行なってきました。また、この改造手法は皆さんにもやっていただけるよう、GitHubでビルド用のdockerイメージを公開しています。詳しくは以下のスライドをご覧ください。

LTでの発表スライド: https://docs.google.com/presentation/d/1YEYMBgEgG0x2hvMznJAsaryp_-fJsX5qxnxtTTqJYlE/edit?usp=sharing

動的に内容の変わるUSBメモリの作成

DAMカラオケにあるUSB動画再生機能で、選曲した曲の動画を再生するため、動的に内容の変わるUSBメモリを作成しました。具体的は、DAM側でファイル名順での再生を開始して、USBメモリ側で選曲した曲に応じて再生したい曲をアクティブにするような処理を行なっています。

方法は、LinuxカーネルのUSBセルフホスト機能である、g_gadgetのg_mass_storageを使う方法と、WiFi内蔵SDカードを使う2つの方法を試しました。その結果、g_mass_storageはファイルの同時操作ができない仕様だったため、WiFi内蔵SDカードを採用して作成しました。

LTでの発表スライド: https://docs.google.com/presentation/d/1wdXzG0NPh0RGYVhOqvQTBSrI6N4m1_tIys7lo2ZzeI8/edit?usp=sharing

ゲームウオッチ・テレビの修理

最近はあまり行なっておらず、中学生や高校生時代の話ですが、趣味でちょっとした家電の修理を行なうことが出来ます。

例えばゲームウオッチでは、父と一緒にヤフオクでジャンク品を漁り、各種交換用部品を集め、2個1にしたり、偏光板と言われるパーツを取り替え表示をキレイにするなどをしていました。

また、マニュアル等がない状態で、テレビの裏蓋を開け、テスターで電圧を調べ電圧がおかしい3端子レギュレータを取り替え修理したこともあります。

[問2] あなたが今一番リバースエンジニアリング(分解して仕組みが知りたい)したいものを紹介して下さい。

これも問1と同様に正直に記入しました。以下に全文を張り付けています。

実際、今まで身の回りのおもちゃくらいしかリバースエンジニアリングしてこなかったので、どこかでもっと実用的な解析ができればなと思っています。

やりたいことは最新のハードウェアのハックです。これまでは壊れても良い安い基板や個人的に解析して使いたいものを解析していましたが、正直自分や周りの人を喜ばせるだけに留まっていました。もう少し予算をかけても今使われている話題のデバイスをハックしてより社会に貢献したいと思っています。

そのため個人的に今やりたいと思っているのは「電気自動車」のリバースエンジニアリングです。最近は電気自動車もIoTになり、オンラインで目的地をセットしたり情報を取得できます。またセンサー類での自動ブレーキや衝突回避の機能があります。そのため、個人的には最近の車はリバースエンジニアリングでハックされると命の危険もある危ない箱になっているのではないかと思っています。

[問3] 「UART」「JTAG」「SPI(Serial Peripheral Interface)」「I2C(I-squared-C)」「ソフトウェア無線(SDR)」について解説してください

いきなり問題らしい問題になりました!!(笑)。ちょっとした思考プロセス的なものを書いていきます。

Arduinoで謎のガラクタを作ったりする人ではあったので、解析的な意味での使い方は知りませんでしたが、Arduinoと外部モジュールを繋ぐための通信規格にも使われる「UART」「SPI(Serial Peripheral Interface)」「I2C(I-squared-C)」は元から知っていました。また、「UART」はG-clusterというLinux搭載ゲーム機をハックするのに触ったことがありました。

ちなみにその外部モジュールの1つにNFCタグリーダのPN532があります。これ1つで実は、「UART」「SPI(Serial Peripheral Interface)」「I2C(I-squared-C)」すべての通信規格に対応していたりしますw。

www.aitendo.com

逆に、JTAGとSDR無線については全く知らなかったので、調べながらまとめています。

回答の方針として、通信規格そのものの解説はせずに、これがどうリバースエンジニアリングなど解析と結びつくかを中心に記述するように気を付けました。ぱっと見Wikipediaでさっと調べてコピペできそうな問題ですが、通信規格そのものの解説ばかりで、セキュリティと結びつけるために、そこそこいろいろ調べる必要がありました。

実用的な意味での解説では、以下のサイトにあったPDF群がとても役立ちました。例えばUARTだったらRX、TXを基板上から見つけて解析するのですが、テスターで基板からそのピンを見つける方法まで書いてあり、謎が解けた気分になりました(笑)。

ruffnex.net

毎年使われている課題のようなので、自分の答えは省略しておきますが、文字数は5つの言葉の合計で約2,300文字になっていました。

[問4] 安全なファームウェアアップデートとは何ですか? もし、それができると攻撃者はどのような攻撃ができますか?事例などもご存知であれば合わせて紹介してください。

もっとちゃんとした答えがあるかもしれませんが、私は、マジコンとの戦いやゲーム機でのCFW実行を見てきた世代でもあるので、「他者によって改変されてないアップデート」なのかなと考えました。

そこから、マジコンやPARで出来た改造を思い出しながらまとめたり事例を書いたりして膨らませました。あんまよくないですが、以外と自分の過去の経験を書いていったら埋まってしまいました。。

この問題も毎年使われているようなので私の回答は省略しますが、最終的に約800文字になっていました。

脆弱性に関するおすすめの資料

ちなみに、Nintendo 3DSのハッキングシーンは、MITが講義ノートを公開していたりもするので、こういうノートを参考にするのもありだと思います。どうやって脆弱性を突かれたかがわかりやすく詳細にまとまっていてとてもおすすめです。

History of Hacking the Nintendo 3DS

[問5] 分解や解析して、モノやソフトウェアの動く仕組みを知ることは楽しいと思いますか?また、それは何故かを好きなだけ語ってください。

「楽しいと思いますか」という問は答えにくかったので、正直にこんな書き出しで書いていきました。

私は楽しいと思います。具体的になぜ楽しいと思うのかは主観となり説明するのは難しいので、なぜリバースエンジニアリングに興味を持ったかを含めて今までどのようなことをやってきたのか説明していきます。

ちょっとアレな話になってしまいますが、僕が初めて改造というものを知ったのは小学校の頃に遊んでいたポケットモンスターダイヤモンド・パールの「なぞのばしょ」でした。これはバグで簡単に通常捕まえられないポケモンを捕まえられる裏技でしたが、これに当時はとてもはまっていました。

このような改造にはまり始めた経験から、最近の低レイヤーのハックがをするようになったところまでを隠さずに正直に書きました。楽しさが伝わったかはわかりませんが、いろいろやってるなら好きなのかなとは思ってもらえたかなと思っています。

こんなこと言うのもあれですが、あまり深く考えず自分の思うように書ければいいんだろうなと思います。

最終的には、約1,200文字になっていました。

[問6] 何か他にアピールしたいことがあれば、自由に書いてください。誤ったことを書いていても減点はしません。書いておきたいことはなんでも書いてください。

「志望動機」と、あとは普段の開発などセキュリティ分野以外でやっていることを成果物のリンクなども貼りながらまとめました。

文字数には、リンクを除いて約1,800文字でした。

まとめ

今回は、セキュリティキャンプ応募編ということで、実際にどんな内容で応募したのかを解説しました。また後日、参加中の雰囲気ややったことなどについても書ければと思います。

グループワークメンバー「電源50Hz」では、他の人の応募体験記を公開していく予定ですので、ぜひそちらもご覧ください!

少しでも興味があれば、ぜひ応募してみてください! やはりオフライン開催も魅力的で、来年などオフラインで参加できる機会があれば僕もまた応募してみたいと思います。