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

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

f:id:msz3nhen:20191206193347j:plain

先月学会発表を終えた後に食べたカレー。記事とは全く関係ない。

#本当にひどい実験 とは

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

twitter.com

昨年度の実験のころに使われたハッシュタグで、「今年も使ってね!」と言わんばかりに前のホワイトボードにハッシュタグを書いていたのだが、昨年ほどこのハッシュタグは盛り上がらなかった。(やはり昨年が盛り上がりすぎただけなのでは?)

昨年度の実験の様子については、この実験で用いた教材を作成したmkさん昨年のアドベントカレンダーの記事として書いてくれている。

blog.m6a.jp

 

実験の目的と内容

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

実験では、僕の専攻科特別研究のテーマ「情報セキュリティに関する教材の研究開発」のもと開発している、「情報セキュリティに関する教材」を使用した。この教材は、IoTカー、Digispark USB開発キットの上でBadUSBとして動作するサンプルプログラムやライブラリ、実験指導書、スライドや補助用の資料から構成される。

研究で開発している教材はDigispark USB開発キットを用いたBadUSB開発演習教材と、IoTカーを用いたIoTセキュリティ教材の大きく2つに分けられる。

BadUSBをざっくりと説明すると、外見はUSBメモリ等一般的なデバイスだが、ファームウェアを書き換えることでキーボードやマウス等に擬態して、PCに危害を加える操作をインターネットを介さずに行うことが可能なデバイスである。

今回は安価でUSBに直刺しして使うことができ、Arduino IDE上で開発ができるDigisparkと呼ばれるマイコンを使用し、キーボードの操作を自動的に行えるライブラリを日本語キーボード向けに改修して、疑似的なBadUSBとして開発演習を行った。

f:id:msz3nhen:20191206200227j:plain

Digisparkの外観。実際は大人の親指に乗るほど小さい。

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

ちなみに僕が開発したのはIoTカーに搭載されているソフトウェアや指導書等の教材であって、ハードウェアは昨年の研究で使われていたものをそのまま引き継いでいる。

f:id:msz3nhen:20191206200627j:plain

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

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

 

実施結果

今年度の実験は、10月3日(木)から12月5日(木)まで、間に休みを入れつつも毎週木曜日午後に以下のような日程で行われた。1週目のBadUSBの開発演習は個人実験で、それ以降のIoTカーを用いた実験は2人1組で行った。

 

1週 BadUSB開発演習

1週目は僕が改修したキーボードライブラリや自分で作成したBadUSBのような動きをするサンプルプログラムが用いられるBadUSB開発演習を行った。 

 

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

昨年度1週目~2週目で行っていた、配布したmicroSDカードへのOSイメージの書込みが本題の情報セキュリティと関係ないのにも関わらず、実験室で行うにはダウンロードに時間がかかりすぎてただ時間を食うだけになっていたので、OSイメージを予め焼いたmicroSDカードを渡すことにして他の内容を1週分にまとめた。作業内容としては以下の通りだ。

  • SSH接続の設定
  • 基本的なUNIXコマンドの確認
  • PythonによるIoTカーの制御(モータの制御、カメラの制御など)

OSイメージの書き込みをやめたことで班ごとの作業時間のムラは少なくなったが、PythonによるIoTカーの制御はどうしても班によって達成度の差が出てしまった。

 

3週 PythonによるWebプログラミング

実験内容を細かく分けると以下の通りだ。

  • Apacheのインストール
  • サンプル用HTMLの作成と確認
  • 2週目で書いたIoTカーの制御プログラムをWeb上で動作させる作業

PythonCGIがプログラムの改行コードがLFでないとプログラムが上手く動作しないこと、プログラムに実行権限がないと動作しないということを初版の実験書に明示しなかったことからほとんどの班がこの週の実験を予定通りに終わらせることができなかった。

実行権限を与えるコマンドについては実験書にも書いていたが、それをプログラム毎に適用すべきなのを明示するべきだった。学生の事前知識をきちんと理解していなかった教材を作る側である僕らに責任があるので、学生には申し訳ないことをした。

この場を借りてお詫びいたします。

 

4週目 操作用アプリケーションの設置と設定、動作確認

3週目の内容が元々多かったこともあり、4週目の内容は比較的少なめにした。そのことから3週目で詰まっていた学生たちもこの週の内容はあまり詰まらずに進められたようだ。

 

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

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

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

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

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

 

所感

BadUSBの演習は上々

1週で完結する実験だったため、最後にBadUSBの動作を見て楽しんだりしてくれたようで、学生の教材に対する反応は良かった。

そして何より、自分が改修したライブラリが上手く動作していたのがうれしかった。

IoTカーの実験も楽しく行えるよう、次週に内容を持ち越さないように来年度以降は上手く週毎の作業の配分を行いたい。

学生にとってはじめてのことが多すぎたIoTカー

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

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

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

今年度TAをやった立場としてはmkさんのブログの3~4週目の項で書かれていた

ドキュメントルートに配置するファイルのパーミッションとか、UNIXの扱い方的なところでハテナマークを浮かべる学生がいたのもまた事実だ。

の”ハテナマークを浮かべる学生がいた”レベルで去年の学生達が収まっていたのが信じられない。やっぱすげえよ1期生達は…

だからといって今年度の学生が「自分達全然できないな…」と気分を落とす必要はない。(実際実験中に落ち込んでいた学生には自分なりに励ましの言葉をかけた)

やっぱりこの実験は3年後期でやるにはこのままだと荷が重すぎる気がする。

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

とりあえず体験してもらえたことが何より

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

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

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

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

 

今後

これで第2回目の運用は終了した。僕はこの結果を卒業論文にまとめるつもりだ。また、皆さんから頂く(予定の)フィードバックを元に、来年度以降僕の研究を引き継いでくれる学生が教材の改善を行ってくれるだろう。

 

#本当にひどい実験 ベストツイート2019

昨年と同じ内容は昨年のブログをパクっ参考にしたとはいえ、長い文章をダラダラと書くのは疲れたので、 #本当にひどい実験 というハッシュタグ付きのツイートの中で、一番面白いと思ったツイートを紹介して、この記事を終わりたいと思う。

 

おわりに

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

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

 

明日は堤君の担当です。