#えむけーろぐ

間違った事を書いていたらやさしく教えてください

#本当にひどい実験 実施報告書

※この記事は苫小牧高専アドベントカレンダー2018 1日目の記事です。

f:id:mktakuyax:20181001122518j:plain

ロットネストアイランドの海。記事とは全く関係ない。

はじめに

今回は、情報科学・工学系第3学年で行われた #本当にひどい実験 の実施報告を書いていく。思ったより長くなったので、興味がない人は最後の「#本当にひどい実験 クソツイグランプリ2018」だけ読んでもらえればと思う。

#本当にひどい実験 とは

#本当にひどい実験 とは、Twitterのハッシュタグである。苫小牧高専 創造工学科 情報科学・工学系3年の情報科学・工学実験Ⅱにおいて、後期6週分の日程で行われた「セキュリティ」というテーマの実験のハッシュタグとして使用された。

twitter.com

最初は僕やツイ廃の3年生達が悪ノリでハッシュタグをつけてツイートしていただけなのだが、2週目には実験を行っていた教室(a.k.a.ダンス部部室)のホワイトボードに「#本当にひどい実験」と書かれていたので、公式(?)なのかもしれない。*1

優秀な学生はこちらの意図に気づき、ハッシュタグを用いて実験や教材に関するフィードバックを書き込んでくれていた。頂いた意見をもとに来年度以降、同じ研究室の後輩である専攻科1年のてっぴーくんや未来の土居研の学生がなんとかしてくれるはずだ。

実験の目的と内容

今回の実験の目的は、IoTセキュリティに関する基礎知識を習得することである。そんな感じのことを実験指導書に書いた気がする。

実験では、僕の専攻科特別研究のテーマ「IoTセキュリティに関する教材の研究開発」のもと開発している、「IoTセキュリティに関する教材」を使用した。この教材は、IoTカーと実験指導書、スライドや補助用の資料から構成される。

IoTカーとは、Raspberry Piを搭載したラジコンカー的なモノである。このIoTカーには、操作用のWebアプリケーションが搭載されている。前進・後退、右左折といったラジコンカーとしての基本機能から、IoTカー搭載のWebカメラを利用した写真撮影機能、撮影した画像の管理機能(ユーザ名・パスワードによる認証付き)といった機能を持つ。

ちなみに僕が開発したのはIoTカーに搭載されているソフトウェアや指導書等の教材であって、ハードウェアそのものは某社から買ったものだ。某社の人曰く、「オモチャを作って各高専に配ったらmkくんの卒研になっていた。」とのこと。

f:id:mktakuyax:20171126220738j:plain

IoTカーの外観。前後左右に走行可能な筐体に、Raspberry Piとモータドライバ回路等が搭載されている。

このIoTカーには、プログラムの不具合や設計ミス、設定の不備などが原因となって発生したセキュリティ上の欠陥、つまり脆弱性が埋め込まれている。これらの脆弱性を発見・修正することによって、攻撃者の立場からIoTセキュリティについて学ぶことができるというのが、この教材のアピールポイントだ。今回の実験は、その初運用も兼ねていた。実験の担当教員はshigyo先生で、僕はTAとして実験のお手伝いをしつつ、教材の評価を行っていた。

実施結果

今年度の実験は、10月11日(木)から11月15日(木)まで、毎週木曜日午後に以下のような日程で行われた。2週間を1つの区切りとして、3つの小テーマに分け、実験レポートも、2週間に1通の提出とした。なお、実験は2人1組で行った。

1〜2週 Raspberry Piのセットアップと動作確認、PythonによるIoTカーの制御

最初の2週間では、Raspberry Piそのもののセットアップと動作確認を行った。作業内容としては以下の通りだ。

  • 配布したmicroSDカードへのOSイメージの書込み
  • SSH接続の設定
  • 基本的なUNIXコマンドの確認
  • PythonによるIoTカーの制御(モータの制御、カメラの制御など)

OSイメージのダウンロードがめちゃくちゃ遅くて大変だった。教室に設置された1つのルータで20台以上のPCを捌くんだから、そりゃそうだ。また、SDカードへの書込みも、展開前のzipファイルをそのまま書き込む人がいたりした。

また、PythonによるIoTカーの制御も、班によって達成度にかなり差があった。

3〜4週 PythonによるWebプログラミング、操作用アプリケーションの設置と設定、動作確認

次の2週間では、Webで動作するIoTカー制御プログラムを買いたり、操作用Webアプリケーションのセットアップと動作確認を行った。

  • Apacheのインストール
  • サンプル用HTMLの作成と確認
  • 1〜2週目で書いたIoTカーの制御プログラムをWebアプリとして移植する作業
  • Webアプリケーションの設置、動作確認

こちらは、1〜2週目で感覚を掴んでくれたのか、躓く学生は少なかったように感じた。ただし、GPIOやカメラを扱うためのRPi特有の設定や、ドキュメントルートに配置するファイルのパーミッションとか、UNIXの扱い方的なところでハテナマークを浮かべる学生がいたのもまた事実だ。

5〜6週 脆弱性の発見と修正

最後の2週間では、脆弱性の発見と修正を行った。最後の2週間にして、やっとセキュリティっぽい話が始まった。

  • セキュリティに関する簡単な講義
  • Webアプリケーションに埋め込まれた脆弱性の発見
  • IoTカーそのものの脆弱性の発見
  • 脆弱性の原因の調査と修正方法の提案
  • 可能であれば、脆弱性の修正

まず最初に、セキュリティに関する簡単な講義を行った。スライド資料は僕が用意し、講義はshigyo先生がしてくれた。スライドには、これまで扱った要素技術とIoTカーそのものについての説明に加えて、これまでに起きたセキュリティに関する有名な事件とその原因、対処方法についての説明、課題のヒントの説明を行った。

課題は、IoTカーに埋め込まれた脆弱性を発見し、原因の調査と修正方法の提案を行うというものだった。前述したスライドを配布し、課題の文章にもキーワードを散りばめておいたので、だいたい自力で発見をしてくれていたようであったし、そうでない学生も段階を追ってヒントを与えていくとなんとか答えを見つけてくれているようだった。

所感

IoTセキュリティといいつつも……

IoTセキュリティに関する教材といいつつも、埋め込まれた脆弱性はWeb寄りなものが多かった。ハードウェア的な脆弱性もあるにはあるのだが、正直言って物足りなかったと思う。実験後に実施したアンケートにも、「IoTカーである必要がよくわからない」と書いていたが、全くそのとおりだ。

せっかく自動車の形をしているのだから、自動車に関するセキュリティの事例をもっと研究して、教材にもその要素を盛り込むべきだった。RPi 3にはBluetoothモジュールが載っているので、そのあたりを使ってみても良いのかもしれない。まぁ、ハードウェアの要素を入れると実験の難易度はだいぶ跳ね上がると思うけど、そこはどうにでもなる。

学生にとってはじめての事が多すぎる

今回対象となった3年生が持っている授業や実験で得た知識は、せいぜいUNIXコマンドの基礎とC言語の基礎くらいだ。一方、今回の実験で扱ったような要素技術を列挙してみると、こんな感じだ。

  • Linuxサーバの構築
  • ApacheによるWebサーバの構築
  • HTMLによる簡単なWebページの作成
  • Pythonによるプログラミング
  • PythonによるGPIOやWebカメラの制御
  • リレーショナルデータベースとSQL
  • Webアプリケーションにありがちな脆弱性

正直、これだけの要素技術を初めて扱うものとして6週間の実験に詰め込むのは無理があると思う。課題やレポートでは、これらについて理解していなくても、「さらっとでも触れて、こういうものがあるんだと知ってくれれば良いよ〜」くらいの難易度にしたつもりではある(実際、コードを書くような課題はほとんどサンプルコードのコピペで済んでしまう)が、それでもこんなに新しい事が次々と出てこられては、戸惑う学生も多かっただろう。

この実験は授業や実験でコードを書く経験を積み、RDBやHTML等の要素技術についてもサラッと習った4年生や5年生になってからやったほうがいろいろ楽しめて良いかなとも思う。とはいえ、まぁなにか新しい事をするとなったらやっぱり学科再編後の人達向けになるだろうし、4年生からはコースが分かれてしまうので、タイミングとしては3年後期のこのタイミングしか無かったのではないかと予想している。(もちろん、カリキュラムを決める権限は僕にはないので憶測でしかない。)

とりあえず一通り体験してもらえたし、何よりみんなでワイワイやるのは楽しい

セキュリティに関する実験とはいえ、セキュリティ以前にまず普通にモノを作ったり、環境を作ったりした事が無い人たちがほとんどだろうから、この実験の前半はそういう経験を積んでもらうことに重点をおいた。

これまでの授業だと、教員や技術職員さんが用意してくれた環境の上で課題のプログラムだけ書くという体験しかしてこなかったはずなので、ゼロから体験してもらおうという意図だ。たぶんわかってる人は勝手に進んでいったし、わからない人は、実験書に書いてあるコマンドをよくわからないまま書き写して、それっぽい結果が返ってきたら次へ進むという感じだったと思う。

今回扱った要素技術については、これから進級して授業や実験で扱ったり、資格試験の勉強で体系的に学ぶことが出来ると思う。また、今回の実験をきっかけにRPi買うなりVPS借りるなりして趣味や自学として触れることもあるだろう。その時に、今回手を動かしてそれぞれの技術に触れたという経験が生きてくると良いなと思っている。

肝心のセキュリティに関しては、「こうするとこうなる」とか、「こういう脆弱性がある」くらいは体験してもらえたと思うので、今回ですべてを理解していなかったとしても、今後なにか自分で作る時に思い出すきっかけになれば良いんじゃないかなと思っている。

そして何より、3年生の皆さんと一緒に実験するのがとても楽しかった。僕が気づきもしなかったような事に気づいてフィードバックをくれたり、実験の進行を助けてくれたりして、とても助かった。3年生の皆さんは学科再編後の第1期生ということで、こういう事には慣れているというか、もう飽き飽きしているかもしれない。しかし、今後もこういう事は続いていくと思うので、引き続き活躍(?)してほしい。

今後

第1回目の運用は終了したので、僕はこれからこの結果を卒業論文にまとめるつもりだ。また、皆さんから頂いたフィードバックを元に、てっぴーくんが来年度以降の実施に向けて教材の改善を行ってくれるはずだ。

そのへんの話は、おととい公開した樽前FM EP17でてっぴーくんとお話させて頂いたので、そちらも合わせてどうぞ。

tarumaefm.com

#本当にひどい実験 クソツイグランプリ2018

もう長い文章をダラダラと書くのは疲れたので、 #本当にひどい実験 というハッシュタグ付きのツイートの中でも、特に僕がおもしろいと思ったものを3つ紹介して、この記事を終わりたいと思う。

おわりに

以上で、#本当にひどい実験 実施報告書は終了とする。

この教材の開発について電気学会の全国大会で発表したところ、優秀ポスター賞をもらうことができた*2。さらに、この実験の実施報告(マジメなやつ)を書いた論文の査読が通れば、査読付き論文デビューだ。これから研究者としてのキャリアを進んでいくつもりは特に無いのだけれど、それでも「専攻科2年間、ただ遊んでただけでは無いんだぞ!」と言える程度には業績を残すことが出来たっぽいので、それはそれで満足かなと思う。

担当教員のshigyo先生、その他アドバイスをしてくださった情報工学科の先生方、そして何よりも、実験を受けつつフィードバックをくれた情報系3年の皆さん、本当にありがとうございました。

明日は #本当にひどい実験 の本当の首謀者である @shigyo先生の担当です。

*1: "本当にひどい○○" の元ネタはたにったさんとない子さんがやっていた飲み会のハッシュタグ #本当にひどい飲み会 である。

*2:優秀ポスター賞 受賞者 | 電気学会 電子・情報・システム部門