鶴の徒然

徒然なるままに鶴が書く日記。

セキュリティキャンプ審査に通った件について

 本記事はセキュリティ・キャンプ全国大会2019の応募課題晒しでございます。

まず始めに

 この記事はセキュリティ・キャンプ全国大会2019の集中開発コースX-IV リバースエンジニアリングゼミに応募する際に実際に記述したこと、そして病んだことなどを深夜のテンションで赤裸々に綴る黒歴史の一種です。よくわからないけど傷が抉られそうだ...という方は今すぐ本ページを離れてくださいませ。
 なお情報が正確であるかについては保証いたしません。あらかじめご了承ください。(日常会話で言うところの「知らんけど(((」ってとこです。)

セキュキャンとは

 さてあえて言うまでもないかと思いますが、セキュキャンとは

日本における将来の高度IT人材となり得る優れた人材の発掘と育成を目的とした独立行政法人情報処理推進機構(IPA)の事業の一つ

です。

セキュリティ・キャンプ全国大会2019 セキュリティ・キャンプ全国大会とは:IPA 独立行政法人 情報処理推進機構www.ipa.go.jp


 参加者はエントリーを行う際にコース登録を行い応募課題に取り組みます。詳しくは以下を参照してください。

セキュリティ・キャンプ全国大会2019 応募要項 :IPA 独立行政法人 情報処理推進機構www.ipa.go.jp


 なおセキュキャンは合宿形式で開催され、参加者は宿泊費・食費・教材費などの負担をすることなく参加できます。(ここ重要)

問題の注意点

 まずエントリーに関しては60min入力がないと入力が無効となってしまいまい、途中まで書いていたとしても消えてしまいます。そして無事エントリーが完了すると登録したメールアドレスに登録完了と回答ID、そして応募課題に関することが書かれたメールが届きます。エントリーする時に記入した確認番号や回答IDは応募課題を送る時と審査結果を見る時に必要となるので必ず保管してください。
 そして応募課題に関しては上記のID等が必要で、なおかつエントリーの時と同様に60min入力がないと入力が無効となります。また個人的に設問ごとに記入欄があると思っていたのですが、課題回答ページには記入欄は1つです。驚かないように...!!です。

応募課題

 一通り概要等を記述した...はずなのでお待ちかねの晒しを始めましょう。
なお見た人が「ウヘェ〜....」って声が出るくらい駄文なのでご注意ください。それでも審査していただいた方々、本当ありがとうございます。

第1問目

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

回答

 私は機械の内部構造や電気電子系に以前とても興味があったため、大学に入ってからいくつか分解などを行いました。そのことについて書きます。


 まず学部の必修の授業内で機会の分解をしてみると良いという言葉を聞いて実際に分解を行なってみました。その当時の私は学び始めたところで、電気電子系のことはもちろん情報系に関する基礎的な知識が全くありませんでした。そんな中初めて分解したのは大学の先生に提供していただいた「DX妖怪ウォッチ」というおもちゃです。そこに様々な妖怪のメダルを挿入すると各妖怪に対応づけられた音が鳴ります。
 友人達とどのようにして挿入されたメダルの種類を判定しているのか気になったため詳しく調べてみました。するとメダルの裏に多数の突起があり、それらが妖怪ウォッチ本体にある4つ並んだスイッチを挿入時に組織的に押し上げる構造だったため、これが0/1のデータ入力となり、種類の判定をしていると推測しました。実際にそのスイッチをあるメダルと同じパターンで押すとそのメダルに対応した音がなることでその推定が正しいことが確認できました。
私と友人達では上記の事しか解析を行うことができませんでしたが、後から加わった別の友人がさらに解析を進め、Arduinoを用いて妖怪ウォッチのスイッチを押さなくても想定するメダルに対応した音がなる機器を作成していきました。それはさらにFelicaなどのカードをかざすとカードから情報を読み取り、音を鳴らせる仕組みとなりました。
 どんどん私たちではわからなかったことが解明されていき、応用されていく様子が私には衝撃的で、面白いし私もやってみたいと感じました。このことはハードウェアを分解するだけにとどまらず、分解した機器の仕組みを理解した上で応用していきたいと思うきっかけとなりました。


 上記を踏まえて分解するだけではなく、基盤やその周辺のパーツについても調べてみることにしました。この時、現在インターンさせていただいている研究室の先生にATMなどに使用されているPCを提供していただいて分解を行いました。このPCは市販のノートPCやデスクトップPCとは違い、ヒートシンクが何倍も大きく、配線に使用されているコードの太さは太くて量も多かったです。また各パーツが大きい割に集約された作りでした。
 私は基盤上のパーツがどのような役割をしているか興味がありましたが、それ以上にどのようにしたら分解し尽くせるか、部品がどのように配置されているかなどに興味がありました。そのため私は「フラットケーブルを切断することなく外すにはどのようにしたら良いだろうか。各インターフェースの先はどこに接続されているのだろうか。そういえば何故コンデンサがこんなにあるのだろう。」と考えながら分解していました。PCを分解している時に友人に各パーツの名称や役割を簡単に解説してもらったのですが、あまりの多さにその時は全てを頭の中に入れることはできませんでした。
 このPCを分解してしばらく経ったのち、このままでは分解したPCだけでなくPC全般に対して仕組みを理解することはできないだろうと思いました。そのためコンピュータアーキテクチャについて書かれている本を読み、デスクトップPCを自作し、自作するにあたって各パーツの企画やさらなる補足情報についても調べてみました。調べていくうちにメモリやCPUというパーツの名称と、実際に自分の目で見て触った感触、そしてどのような動作や役割を担っているかといった情報が自分の中で急速に結びついた感覚がありました。このように急に得た知識とそれまでの知識などが一致していく過程が私としては心が躍り、そしてもっと知りたいという好奇心が湧く感覚がしました。


 そして分解にとどまらずリバースエンジニアリングのようなことをしてみようと思い実際にやってみました。ただの分解ではなくリバースエンジニアリングをやってみようと決めた時、私はWebカメラリバースエンジニアリングしてみようと思いました。この時題材として決めたWebカメラは現在インターンとして出入りさせていただいている研究室で一通り解析されたものでした。そして研究室の方が解析されたところ、不審な通信を行なっているなど不思議な点があるが、それ以上のことはわからないとのことでした。
 しかしハードウェアの面から解析されたようではなかったためハードウェアの面から解析をしてみたいと思いました。ただ単に興味が湧いたからというだけでなく、そのWebカメラの運用方針がその当時決まっておらず手付かずだったため、その点リバースエンジニアリングを行うには最適な題材であると考えました。もちろんインターン先の先生にはリバースエンジニアリングをする許可をいただいた上で行いました。リバースエンジニアリングを行うのは初めてでしたし、知識もなかったため本などを参考にしながら行なってみました。ですがちょうどリバースエンジニアリングを初めて少し経った頃にWebカメラの運用方針が決まり始めたため、徹底的に思考をすることはできませんでした。
 そのためWebカメラヒートシンクをもし取っていればもう少しどうすればよかったかわかったかもしれないと悔しさを感じました。したがってこの応募課題に取り組んでいる頃に話題となっていた、とあるチェーン店で独自販売されているWebカメラを入手してリバースエンジニアリングをしてみようとしました。私が行った店舗では取り扱いがなかったようなので入手できなかったため残念ですが、このままでは腑に落ちないため題材とよさそうなWebカメラを見つけて解析してみようかと思います。

コメント

 さて、まず第1問目ですがハード歴1年弱なのでやったことを大まかにギュギュッと凝縮して記述してみました。改めて振り返ってみると...もうちょい頭使おうぜって分解していた頃の自分にツッコミたくなりましたがスルーします!((

第2問目

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

回答

 現在私はIoT機器などのファームウェアリバースエンジニアリングに取り組んでみたいと考えています。
 ファームウェアの他にもファームウェアの他にもBlueborneを含むBluetooth機器や、Webカメラリバースエンジニアリングも行ってみたいと思いました。なぜなら無我夢中で機器を分解していくと、その機器にはどのような部品が使われているかと行ったことが知れて大変楽しいからです。しかし私がしてきた分解は存在するネジを全て外して機器が再起不能になる程だったため破壊行為と変わりません。破壊行為で止まってはいけないと思い問1にも記述したように様々なアプローチの仕方で理解しようとしてみました。ですがハードウェアに注目するだけでは機器の仕組みを理解することにはつながらないと思います。
 そのためまずはハードウェアとソフトウェアの両方と密接に関係しているファームウェアリバースエンジニアリングをしてみたいです。私はハードウェアをリバースエンジニアリングする技術力がないため、確実にファームウェアリバースエンジニアリングができるだけの技術力はありません。しかしリバースエンジニアリングを通じて自分の中でどこかブラックボックス化している様々な機器の仕組みを理解したいです。

コメント

 課題に取り組んでいておそらく最も悩んだのがこの問題です。今まで私は転がってるものをとりあえず分解してみよう!というような感じでした。そのため自分はどのようなものを分解し、リバースエンジニアリングし、仕組みを知りたいのだろう…?????と改めて考えたのですがビックリするぐらい思い浮かばない(汗)
 ちなみにファームウェアの案を出す前はBuletooth機器とか医療用のIoT機器とか考えたのですが書くことが思いつかなかったです。本当案出ししんどかったなぁ(遠い目)

第3問目

[問3] 以下の技術用語について解説してください。またどのようなところで使われているかも述べてください。
「UART」「JTAG」「SPI(Serial Peripheral Interface)」「I2C(I-squared-C)」

回答

 UARTとJTAGはインターフェースとして利用でき、SPIとI2Cはシリアルバスであることがわかりました。以下に説明を書いていきます。

1.UART
 UARTはシリアル信号をパラレル信号に、もしくは逆にパラレル信号をシリアル通信に変更するための集積回路です。UARTはデータの信頼を保つためにパリティエラーやオーバランエラー、フレーミングエラーなどを検出します。集積回路ではありますが、外部機器とのインターフェースとして利用されることが一般的です。使用例としてばモデムが挙げられます。

2.JTAG
 JTAGはシリアル通信を用いてIC内に設けられたテスト用の回路にアクセスし、ICの状態を操作してテストを行う際に用いられます。またバウンダリスキャンやテストアクセスポートのことで、出荷時に集積回路や基盤の検査を行ったりします。

3.SPI
 SPIはICなどデバイス間を接続するバスです。シリアルインターフェイスの中でも高速で、配線が少なくて済むという特徴があります。使用例としてはA/Dコンバータ、D/Aコンバータ、SDカードなどがあります。またIoT機器などにおいてフラッシュメモリを使用するシステムでSPIが搭載されていることがあります。

4.I2C
 I2CはD/Aコンバータなどの周辺ICを専用のシリアルインターフェイスで高速で接続するバスです。使用例としてはマザーボードと低速な周辺機器の接続、組み込みシステム、携帯電話、温度センサーなどです。ホットスワップという仕組みであるためホットスワップが必要とされる用途には特に向いています。


 またSPIとI2Cはシリアルバスの一種であるため類似していますが、I2Cは個々のスレーブがアドレスを持っており、データの中にアドレスが含まれている点で異なっています。

コメント

 この問題は調べてこいというような設問だったかと思います。どれもリバエンをする際に必要なことであると思うのですが、何を思ったか自分はハードウェアとしての仕組みの方を掘り下げてしまって収拾がつかなくなってしまいましたね...軌道修正をかけた結果上記のようになりました。
 各用語の意味が合ってるかちょっと自信がないですが、おそらく問題はないはずです。

第4問目

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

回答

 「安全なファームウェアアップデート」における「安全」とは、複数の側面から考えることができます。それは以下のようなものです。


1. アップデートするファームウェアが安全であること
2. 攻撃されることのない安全な環境
3. システムが堅牢であること
4. ソーシャルエンジニアリングが有効でないこと


上記に挙げた項目ごとにもし安全ではない場合はどのような攻撃が可能かも合わせて説明していきます。


1. アップデートするファームウェアが安全であること
まずアップデートするにあたってファームウェアそのものが安全である必要があります。もしどれほど安全な環境だとしてもファームウェアそのものが改ざんされていた場合、アップデートした機器そのものが起動不可能になるなどの影響を与えることができます。
 したがってファームウェアそのものの安全性を確保することが重要だと思います。安全性を確保するためにSHA-256を用いて改ざんの有無を確かめてからアップデートをする手段が有効です。


2. 攻撃される事のない安全な環境
 また信頼できるネットワークであること、媒介する機器がマルウェアに感染していないことである必要があります。もし信用できないネットワークを経由した場合、正規の製品ベンダーのWebサイトではなく攻撃者によって偽造されたWebサイトに誘導されてしまう危険性があります。
 また安全にファームウェアをダウンロードできたとします。しかし媒介するためのUSBメモリなどがマルウェアに感染していれば様々な影響を受けてしまうため攻撃手段としては有効になってしまいます。
 したがって攻撃されることのない安全な環境下でファームウェアのアップデートを行う必要があります。


3. システムが堅牢である事
 まずファームウェアのアップデートを定期的に適切に行っている必要があります。例としてWi-FiルータAtermシリーズに脆弱性が見つかったことがあります。見つかったのは情報漏洩やCSRF、OSコマンドインジェクションといった脆弱性でした。このような脆弱性を放置していた場合、攻撃を受けやすくなってしまいます。
 またファームウェアを提供している製品ベンダーのWebサイトに脆弱性がないことも大切です。Webサイトが脆弱であればファームウェアマルウェアを仕込むことが可能です。例えば脆弱性が存在してWebページが改ざんされたとします。そしてもしIoT機器を対象としたファームウェアにBrickerBotが仕込まれていた場合、アップデートした機器は再起動不能になってしまいます。
 そのためシステムが堅牢である必要があります。


4. ソーシャルエンジニアリングが有効でないこと
 またソーシャルエンジニアリングが有効でない必要性があります。例えばファームウェアアップデートを行う際に友人や製品ベンダーを偽装した攻撃者から最新のファームウェアが入ったUSBを受け取ったとします。もしこれがマルウェアに感染していて、しかも何も疑うことなくアップデートする機器に刺したとします。そうするとアップデートする機器がマルウェアに感染してしまう危険性があります。そしてアップデートを途中で中断するようなコードが入っていた場合、ハードウェアを動かすための情報が中途半端となってしまい電源がつかなくなるなどの被害が出てしまいます。
 そのためソーシャルエンジニアリングが有効でないことが大切です。

コメント

 一瞬設問が何を言っているか理解できなかったですが、自分は「安全なファームウェアアップデートとは安全な環境下で行うか、それともファームウェアそのものの安全に関して言っているのだろう。そして安全を維持するための条件を満たしていない場合、どのような攻撃ができるかについて書けばいいのだろう。」と解釈しました。
 安全についてやどのような攻撃ができるか考えてるうちに、凄く危機管理コンテストに参加した時の感覚に近いなーと感じました。そのためおそらく一番楽しく回答できた気がします。
 なお、ちょっと苦しい部分があると思いますが気にしないでくださいマジで。

第5問目

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

回答

 自由に書いてよい、ということでちょっとセキュリティと関係あるようなないような小話をさせていただこうかと思います。

 まず1つ目は現在細々と学んでいるFPGAに関することです。
 私が分解することに重きを置いていたのはおよそ昨年の春から初夏にかけてでした。その頃インターン先の先生にかねてよりやってみたかったCPUの作成を行うためにVerilog-HDLを学ぶ他に何をしたらいいか伺いました。私はまだまだハードウェアを学んでいくための土壌となる知識がない状態だったためまず電子工作をしてみるように薦められました。そのため夏休暇中に集中して取り組んでみてArduinoを用いた歩行者用と車両用の信号機や、Wiiリモコンで操作できるラジコンカーなどを製作しました。
 その中でも私個人としてはラジコンカーに特に思い入れがあります。ラジコンカーを製作するにあたり回路にモーターを加えて試行したところ、想定していた挙動をしませんでした。そしてさっぱり原因がわからなかったため1週間かそれ以上四苦八苦しました。根気強く試行し、更に検索等をしたところコンデンサーをモーターに隣接して設置するとノイズ除去をするということを知りました。実機で試行したところ、想定通りの挙動をしたため大変うれしくて仕方なかったです。
 他にもWiiリモコンとラジコンカーを通信させて通信が確立していることを示すにはどのようにしたら良いかや、デバッグをしやすくするためにタクトスイッチを回路に追加し、状態を示すLEDを追加するなど持てる力全てを使って四苦八苦しました。
 わからないことが多かったため苦しさもありましたが、じゃあ次はどのようにしたらいいか考えることが楽しくて仕方なかったです。そのため特にこのラジコンカーには思い入れがあります。
 ある程度電子工作を行なってみて、やはり自分はCPUを作成したいと思ったため改めて何を学ぼうか調べてみたりすることにしました。その結果私は論理回路をしっかり学ぶことと、Verilog-HDLを学ぶこと、FPGAを使ってみるという結論に至りました。そして漠然とCPUについて知っているという状態だったためコンピュータアーキテクチャについても学んでみることにしました。どれもこれも今までやってきたことと比較してはるかに難しく感じたためそれほど身についている気がしていません。ですがCPUを作成してみたいですしどのような仕組みかやはりきになるため牛の歩みかもしれませんがまだまだ学んでみようかと思います。

2つ目はなぜハードウェアに重きを置いているのにセキュリティについても学ぼうと思ったかです。
 きっかけとしては複数あるのですが、1つ目は大学の先輩方が日頃からセキュリティに関する情報を発信していらっしゃっていたことです。時々Twitterなどをみているとその先輩が情報を発信して共有していらっしゃったため、凄くセキュリティって面白そうだと感じました。
 きっかけの2つ目は昨年10月頃にAppleなどで使用されているサーバ用のマザーボードに不正なチップがあるのではないかと問題になったことです。それまでの私はセキュリティというとサイバーセキュリティを真っ先に思い浮かべていました。しかしこの時初めてハードウェアにもセキュリティの観点が必要なのだと実感しました。
 そして3つ目は昨年リバースエンジニアリングゼミの修了生の川上さんが総関西サイバーセキュリティLT大会でセキュリティ・キャンプやリバースエンジニアリングに関してLTをなさったことです。実を言うとこの時初めてリバースエンジニアリングということがあると知りました。LTの内容はリバースエンジニアリングが主でとても面白かったです。
 このLTがあった頃、私は学ぶことをハードウェアに絞るかセキュリティに絞るか迷っていました。しかしハードウェアの方面で学んでいることやこれから学ぶことをセキュリティでも活かせるかもしれないと感じてワクワクしましたし、やってみたいと感じました。
 以上3つのことがハードウェアに重きを置いていたのにかかわらずセキュリティについても学ぼうかと思ったきっかけです。

 小話と言いつつとても長くなってしまいましたが以上のことが他に書いておきたいことです。回答のどこかに書いているかも描いているかもしれませんが私には技術力も知識量も不足していると感じています。しかしそれでもセキュリティ・キャンプを通じて講師の方々に教えていただき、他の参加者さんと切磋琢磨して学びたいです。

コメント

 まず一言、この問5は黒歴史です。もう嫌だ!!どっか穴ないですか!?隠れたい!
 えぇっとでもまぁ冗談はさておき(?)ハードウェア屋さんな自分がTry&Errorした軌跡のようなものと、なぜセキュリティについて学ぼうと思ったかについて徒然なるままに書きました。
 個人的には1年の間にこんなにも変化があったんだっと思ったため感慨深かったですね〜そのためここ以外で書けなかった分、自己アピールを兼ねてとにかく書きなぐりました。悔いはないけどめちゃくちゃ恥ずかしい(笑)

最後に

 なかなか自分の書いたポエムのようなものを公開するのは恥ずかしいですね...!!それでもとにかく行きたい!という気持ちをできる限りぶつけるため書いたものですし、何より来年以降リバエンゼミに行きたい!という人の参考になればと思いとりあえず公開します。
 ビックリするぐらい弱々ですがそれでも審査通ったようなので、興味があるけど自分には無理だ...と感じていても応募してみるといいかもしれません。
 そしてこれから怒涛の日々が始まると思いますし大変な気がしますが、それでも凄く楽しみです...!