セキュリティ・キャンプ 応募課題

はじめに

セキュリティ・キャンプについて

セキュリティ・キャンプとは,22歳以下の学生が参加できる,IPAによる人材の育成発掘事業です。普段は合宿形式で行われているようですが,昨年度および今年度はオンラインでの長期開催になっています。 地方大会,全国大会,ネクストの3種類が存在し,ネクストのみ年齢制約が25歳以下に設定されています。
セキュリティ・キャンプ全国大会2021 オンライン ホーム:IPA 独立行政法人 情報処理推進機構

課題とトラックについて

Xトラックは自らの取り組んでいることと講義内容との距離がとても近く,興味がある分野であったので,迷わず選択しました。それゆえに課題も(他と比較すれば)理解できる部分が多かったです。
課題に取り組んでみると,自分は電気に対する知識が足りないし,まじめなリバースエンジニアリングも全くしたことがないんだなと思い知らされることになりました。

本文

[2021] キャンプ全国大会2021 集中コース X【IoTセキュリティトラック】 課題

問1への回答

オームの法則

電圧は電流に比例するという法則。この法則の式 V = IR を利用することで,電圧,電流,抵抗,の任意の1つを他の二つから求めることができる。電気回路の設計のあらゆるところで利用される。例えば,LEDを光らせようと思ったら,電流制限抵抗をつける必要があるが,この抵抗値はオームの法則によって求められる。

「UART」

非同期式,一対一のシリアル通信のプロトコル。同期を取らないので,ボーレートを指定して通信を行う。マイコンとPCの間の通信などに使われることが多い。UARTで情報の送受信を行うときは,RX,TXという機能を使う。RXは受信側で,TXは送信側。比較的低速なので,高いサンプリングレートで値を知りたいセンサのような,高速なデータの送受信が求められる場面には向かない。一方,非同期式であるので,クロック線がないぶんだけ配線が少なくて済むというメリットがある。

「SPI(Serial Peripheral Interface)」

シリアル通信としては高速な通信を行えるプロトコル。全二重通信を行うが,片道の通信モードなど,いくつかのモードが用意されている。また,EEPROMや高頻度で値が欲しいセンサとの通信などに用いられる。スレーブ選択用の端子を用いることで,一つのマスターが複数のスレーブと通信を行うことができる。

「I2C(I-squared-C)」

配線が少なくて済むシリアル通信のプロトコル。センサや表示器などのデバイス間での通信でよく使われる。一般に,UARTより高速でSPIより低速。SCL(クロック線)とSDA(データ線)のみで信号のやりとりを行う。マスターもスレーブも複数にすることができるが,デバイスが固有のアドレスを持ち,それを通信時に送信することで,接続するデバイスを増やしても通信線は増えない。信号線を電気的にプルアップする必要がある。

「ソフトウェア無線(SDR)」

無線機のハードウェアをデジタル技術で置き換えたもの。従来の無線機に比べ柔軟性が高く小型。非常に多くの場面で利用されているが,身近なものには携帯電話がある。理想的には,A/Dコンバータで無線信号をディジタル信号に変換して,信号の処理をソフトウェアで行う。しかし,無線信号には高周波数のものがあり,現在のA/Dコンバータでは,速度が不足してしまう。そのため,一度ハードウェア的に中間周波数と変換を行なったあとに信号処理を行うというような構成がとられることが多い。

問2への回答

交流の方が危険だと思う。なぜなら,電圧の実効値が同じであっても,交流では,瞬間的に直流より高電圧になっているタイミングが存在するからである。これだけでは直感であり,電流の総量によって感電の影響が決まっているのか,最大の電流によるのか,明らかではない。しかし,調べてみると,人体の反応曲線図というものがある。そこでは電流値と通電時間を軸に取ってあるが,低い電流値では長時間の感電であっても人体に危害は少ないのに対し,200mAを超えたあたりでは,一瞬であっても重大な影響が及ぼされるということがわかる。

工夫
  • 絶縁を確実に行う。例えば,皮膜つきの導線は皮膜の厚さや耐久性などを考慮して選定する,端子部は露出しないようにする,など。
  • アースを行い,人体が高電位の場所に触れてしまっても電流が流れないようにする。
  • 大電流が流れるものでは,むやみに触ったり,分解したりしないように警告する。
  • 漏電遮断器などを取り付け,感電が起こっても,極力短時間しか電流が流れないようにする。

問3への回答

・この機器は日本で使用できますか?(ヒント:技適

技適を取っている(認証番号211-161007)ため,使用可能。
http:// https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=211&TC=N&PK=1&FN=115bacl&SN=%94F%8F%D8&LN=12&R1=*****&R2=*****

・電源電圧と電源ピンのピン番号はそれぞれいくつですか?

電源電圧は3.3V(3.0V〜3.6Vで動作)。p15の5.2 Recommended Operating ConditionsのPower supply voltageが,typical 3.3Vであるため。
電源ピンのピン番号は3V3。p8の2.2 Pin Descriptionに「Name:3V3 Function:PowerSupply」とあるため。

・この機器でSPI通信は使用できますか?

使用できる。p .7,Overviewの,HardwareのModule interfacesに記述がある。

・この機器に搭載されている水晶振動子の発振周波数はいくつですか?

40MHz 。p.12 3.3 Crystal Oscillators に「The module uses a 40-MHz crystal oscillator.」とあるため。

・GPIO 1ポートから最大何mAまでの電流を出力できますか?

40mA。アウトプット強度を最大にしたときに,ソース電流で40mA,シンク電流で28mA出力できるとp.15,26の5.3 DC Characteristicsに記述があるため。

・GPIOに5.0Vを入力しようと思います。この機器は正常に動作しますか?

Table 6: DC Characteristics にGPIOの入力電圧の最大値について記載がある。「VIH High-level input voltage max VDD+0.3 V」ここで,VDDは低損失電圧ジェネレータから出力される電圧のことだが,1.8Vまたは3.3Vである。したがって,この最大値は5.0V未満なので,正常に動作しない。
それどころか,電源電圧より高電圧であるので,ポートから電源側へ電流が流れるなどの危険性があり,マイコン及び周辺機器が破壊される可能性がある。

問4への回答

全体の構成としては,ESP32がセンサ値を読み取り,それをRaspberry piに集めるような構成にする。なぜなら,IoT温度計を設置したい場所が1つであるとは限らないし,その場所に電源があるかどうかもわからないので,無線でデータが送受信できるバッテリー駆動のモジュール複数個と,それをまとめてインターネットに送信するモジュール1つに分けた方が,実用的だからである。また,直接ひとつひとつのデバイスWiFi接続するという方法もあるが,主に2つの理由によって避けたい。1つは,WiFi接続は消費電力が大きいため,もう1つは,ESP32はWiFiSSIDとパスワードを保持しているため,例えば家の外に温度計を設置してしまった場合,悪意のある他者が温度計を盗んでESP32を手に入れ,WiFiの情報を入手できてしまうためである。
ESP32-WROOM-32の開発ボード(divkitC)と温度センサを用意する。ESP32のADCは誤差がやや大きいので,ディジタル出力の温度センサを選ぶ。ESP32は,温度センサを読み取って,BLEでブロードキャストする。ESP32の電源には,9V角型電池を使う。3.6〜3.0Vの範囲の電圧を安定して供給しようと思うと,降圧回路を作らなければならないが,ESP32-divkitCでは5Vピンに降圧レギュレータがあるので,別途回路を作らなくても,5Vピンに5V以上の電圧を供給すれば良い。データを送信したあとはdeep sleepすることで,消費電力を抑えるようにする。Raspberry piWiFi接続が可能で電源がある場所に設置し,DCアダプタから電源供給する。Raspberry pi側では,python3でbluepyを用いて情報を受信する。受信した情報は,Azure IoT Hubに送信するなどして活用する。

問5への回答

リバースエンジニアリングでは,家にあった不要なおもちゃや家電を分解して,回路や使われているICを調べてみたことがある。また,ソフトウェアに関しては,主にCTFで,簡単な実行ファイルを読んでみたことがある。
リバースエンジニアリングに分類されることかはわからないが,ライブラリを使うときにソースコードを読んで実装を調べたり,不都合なところを書き換えて使ったりしたことがある。
ものづくりに関しては,主に電子工作やロボット制作を行なってきた。今までに,センサの値に応じてテープLEDが点灯する服や,ロボカップジュニアのための機体や,LINEでのメッセージに応じてサーボモータが動作するデバイス,Webサイト上またはprocessingのプログラム上から操作できるラジコン,画像処理で進路を判別するライントレーサなどを作った。また,高等学校の課題研究で,Webサイトからでの予約を受けて動作するロボットを製作した。このロボットは,駅のホームと電車との高低差の解消のためのスロープの運搬を自動化することを目的として製作したもので,回路部分の設計製作と,Webサイトや制御のプログラムは私の自力で行なった。
2020年度にはSecHack365に参加し,チャットアプリとスマートスピーカーを製作した。ここではセキュリティに注意を払っての開発について学んだ。チャットアプリはWebサービスとして製作したため,WebサイトにできてしまいがちなXSSSQLインジェクション,不正操作などの脆弱性に対処しながらの開発になった。また,スマートスピーカーはものを置く場所を音声で記録するというコンセプトであったため,どのような状況での使用が考えられるか,どうすれば安全になるかについて考えた。例えば,財布や通帳の位置は記録できないようにするなどの対策を行なった。

問6への回答

私が今一番ものづくりしたいものは,二足歩行ロボットである。いままで製作したロボットは全て車輪走行のロボットであり,内界センサを使ってみる,モータの制御方法を変えるなどの工夫はあったが,技術的な挑戦が少なかった。関節で走行するロボットを製作することで,制御やハードウェア設計に関する知見を深めて,普段使わない部品や技術に触れたいという好奇心が,製作の大きな動機である。四軸の比較的やさしいものから始めて,ゆくゆくは人間的な機構のロボットも製作してみたい。高機能なものになると,画像処理や深度センサの値の処理で外界の情報を取得することが多いが,特に画像処理は攻撃に対して弱い。例えば,敵対的摂動によって,画像認識の結果を誤認させられてしまう場合がある。ロボット制御のために,そのような情報科学の分野の技術も深く学びたいと思う。

問7への回答

最近はCTFに参加していて,5/22,23日に行われたctf4bでは,webの問題をいくつか解くことができた。また,AtCoder競技プログラミングに参加している。
高校と大学での専攻が機械系で,ソフトウェアの面ではロボットの制御などを中心に行ってきた。しかし,今まで学んできたセキュリティについての事項は,純粋にソフトウェア的なものであったり,コンピュータの低レイヤのものであったりと,実際に手で触れて改造できないものについてのことが多かった。身近に取り組んでいる技術のセキュリティについて学ぶことで,専攻分野と自分の興味を結びつけて技術的に進歩したい。

お気持ち表明

こんなことを書いては怒られそうなのですが,かなりの締め切り駆動で応募課題を仕上げてしまっていて,まさか選考に通過するとは思っていませんでした。
実のところ,わたしは他の方の応募課題晒しを読んでおらず,存在も知りませんでした。通過して初めてそのような文化があることを知りましたが,数件読んだ限り非常に高レベルで,応募前に読んでいたら,自分のレベルでは届かないと思って応募する気をなくしてしまっていたかもしれません。

応募課題を公開するのは,自分の少ない知識量や稚拙な文章構成を晒すことであるので躊躇しました。しかし,自身のそのような感情があるからこそ,わたしの課題を読んで,応募してみようかなと思う人が増えることを願って公開することにしました。それに,誰も他人の文章力とか知識量になんて興味はなくて,自意識が過剰なだけなので心配するだけ無駄ということもあります。

私が雑に実績として列挙した製作物でわたしが迷惑をかけた方々,本当にごめんなさい。

おそらく誤りがたくさんあります。特に,知ったかぶりで書いた,触ったことのない技術についての部分はひどいと思います。もし何かありましたらコメントであったりTwitterで指摘していただけると本当に嬉しいです。
選考に通過しただけではまだ何も始まっていないので,今夏は昨年度の反省も活かしてバリバリ学んでいきたいです!
以上です。拙文に目を通してくださってありがとうございます。何かの助けになりますように。