読者です 読者をやめる 読者になる 読者になる

ロマンティック・アイロニー

好きなこと・気になったことについて書いていきます!

セキュリティ・キャンプ全国大会2016応募用紙晒す 前半

seccamp

はじめに

私は今回はじめてセキュリティ・キャンプ全国大会に応募しました。このキャンプの存在は昨年から知ってはいたのですが、応募用紙を見た段階で固まってしまい応募には至りませんでした。レベルの低さを痛感させられた私はctf4bや勉強会に積極的に参加し知識・技術の向上とモチべーションの維持に励みました。ようやく今年のセキュリティ・キャンプの概要が発表され、応募用紙を見た段階で今なら挑戦できると感じ応募してみることにしました。そして応募用紙作成と並行して行っていた私用もひと段落し落ち着いたので、私の応募用紙を晒してみようと思いました。正直内容はめちゃくちゃで何言ってんだっていう部分もあり、晒したくはない気持ちもありますが自分の成長のために...と言い聞かせて晒しますw (個人的な部分も含まれていますので、実際に提出したものとは少し違います。)

共通問題

共通問題1

(1)あなたが今まで作ってきたものにはどのようなものがありますか?いくつでもいいので、ありったけ自慢してください。

iPhone用Push通知API
 これはアルバイトで作ったもので、その会社では従業員全員にiPhoneを支給しそのiPhoneで連絡・お知らせをしたり、社内の独自通貨を管理しています。そのため社内には独自のアプリ開発をしている部署があります。そこにおられるエンジニアの方々の利便性向上のため、iPhoneのPush通知を手軽に組み込めるAPIを作成しました。  そもそもiPhoneのPush通知は
 1.短いメッセージを表示する
 2.効果音を鳴らす
 3.バッジに数字を表示する
ということが行えます。そして、Push通知がユーザに伝わるまでのフローは
 1. プッシュ通知をアプリが有効にするためにはユーザがプッシュ通知の受信を有効にしなければいけない
 2. 各デバイスには固有のdevice tokenが存在する。アプリはdevice tokenをデバイスから取得する。
 3. アプリがサーバにdevice tokenを伝えておく
 4. お知らせを送りたいタイミングでサーバがプッシュ通知をApple Push Notification Service(APNS)に送る
 5. APNSがユーザのデバイスにお知らせを送る
というものです。ただし、このPush通知はベストエフォート型なのできちんとユーザに通知が届いたかは考慮されません。
 私が作成したAPIは引数として社員番号を取得し、それをキーとしてデータベースからdevice tokenを取得し本社のサーバにあるAPNS用サーバへ送信するというものです。これを作成するまでPush通知の知識はなくJavaの経験もないに等しい中、一時期社内のPCがウィルスに感染したということでネットが使えないというなんとも苦しい期間がありましたが、社員さんと話しながら、勉強しながら作り終えることができました。

・OS
 これは個人的にOSの仕組みを理解するために作り始めました。GithubのURLを添付します。(https://github.com/ether0x2ca/OS)今はFDブートを前提に作っておりQemuの仮想環境で実行しています。川合秀実さんの「30日でできる! OS自作入門」を参考に制作しています。まだ制作途中で、今は仮想記憶と割り込みの設定をしている段階です。最初に申し上げましたがこのOS開発はOSの仕組みを理解するために始めたのですが、作り終わっていないこの段階ですでに始めてよかったと思いました。その理由はOS開発を通じて仕組みを理解出来るということ以上に得るものが大きかったからです。私はOS開発をはじめる前まではC言語のポインタという概念がつかめておらず、C言語は嫌いではありませんでしたが多少の苦手意識がありました。しかしOS開発を始めてからは、ポインタはただ表現の違いであり、アセンブラレベルでは配列などと差異はないということがわかりました。また、これまであまり興味のなかったハードウェア分野の大切さやそれを理解することのおもしろさにも気づくことができ、以前よりもプログラミングが好きになり、楽しいと思えるようになりました。さらに以前は同じ「好き」でもプログラムでアプリケーションを作ったときの達成感があるから「好き」だったのですが、これを経験してからは、達成感がるから「好き」に加えてプログラム言語で書かれたアルゴリズムが理解できて楽しいから「好き」になりました。これは参考にさせてもらっている川合秀実さんの本やos-wiki:http://oswiki.osask.jp/?FrontPagehttp://hrb.osask.jp/wiki/?FrontPageのおかげです。今はまだ途中ではありますが、今後は卒業研究の一環で学んでいる機械学習を取り入れたOSを作れないかと考えいます。具体的には「機械学習によるタイピング傾向を利用したセキュアなOS開発」です。機械学習とOSとセキュリティという今私自身の中でホットなキーワードをどうにか組み合わせられないかと考えた結果、タイピングの打鍵間隔には個人差がありそうだと思い至り、それを利用することでID・パスワード方式の欠点である「管理」を改善できないかと考えています。

サイバー攻撃風ゴミ箱用センサ
 これは学校の活動の一環として作成したものです。プロトタイプではありますが、GithubのURLを添付しておきます。(https://github.com/ether0x2ca/cyber_trash)学校の教室のゴミ箱にセンサを取り付け、ゴミ箱にゴミを捨てると、それをサイバー攻撃のパケットに見立て管理サーバに信号を送り各クラス間で戦うという構想を元に作成したものです。またそれを可視化し誰でも楽しめるようにしました。可視化のイメージはこれを参考にしました。http://map.norsecorp.com/#/ この活動は授業としての活動なのですが、これまでのイメージする授業ではなく説明が難しいのですが、簡単に言うと「学生主体の学科学年ごちゃまぜの社会貢献活動」です。なので電気電子分野の学生が建築の勉強をしたり、環境・土木分野の学生が電気・電子分野の勉強をすることがあります。このような活動は日本では珍しくほとんど行われていません。そのような活動の中で唯一の学生発案型の活動で本当に学生のみで全てを行なっていたのが私たちの活動でした。そのため金銭的な面で学生程度のお小遣いしかないため、全クラスに設置するというのは実現できませんでしたが、ワンチップマイコンを2つ用意しプロトタイプを作成しました。可視化の役割を担うWEBページは友達が担当したので私はゴミ箱に取り付けるセンサを作成をしました。プログラム自体は難しいものではなかったのですぐにできたのですが、電子回路の作成に慣れていなかったこともあり時間がかかってしまいました。しかしそのおかげ電子工作の面白さと難しさがわかりました。まずこのセンサはゴミ箱にゴミが入ったかどうかを判定するため赤外線センサを使いました。また教室にはEthernet有線回線がない代わりに無線LANがあるため無線通信を行うための無線モジュールが必要でした。今回は勉強も兼ねてRaspberryPiとArduinoの両方を使用しました。RaspberryPiはUSB端子があるため無線LAN子機を取り付けるだけでできるのですが、ArduinoにはUSB端子がないため別途無線モジュールを用意しなければいけません。そこで無線モジュールを探しているとArduinoカーネルが組み込まれた無線モジュールがあったのでそれを使用することにしました。電子回路はうまく動作しなかったときのハードウェアデバッグが大変ですが、問題の切り分けをしていき解決に近づいていくプロセスはソフトウェアと似ていてとても面白いものがあると感じました。

(2)それをどのように作りましたか?ソフトウェアの場合にはどんな言語で作ったのか、どんなライブラリを使ったのかなども教えてください。

・Push通知API
 その会社の方針として言語はJavaを使用し、データベースはpostgreSQLを前提とし、統合開発環境eclipseを使用しました。プログラムはその会社にしかなく持ち出しできず、今は手元にはなく、アルバイトが終わってから数ヶ月経っているので記憶が定かではありませんが、インターネットが使えない期間が長かったので、標準ライブラリしか使っていません。

・OS
 作成したOSの実行環境はMac OS X上のQemuで実行しています。エディタはvimを使用しています。使用言語はアセンブラ(Intel記法)とC言語を使用しています。

サイバー攻撃風ゴミ箱用センサ
 RaspberryPi2とスイッチサイエンス社Arduino互換開発ボードのESP-WROOM-O2https://www.switch-science.com/catalog/2500/を使用しました。その他秋月電子などで、赤外線センサhttp://akizukidenshi.com/catalog/g/gI-02499/や赤外線LEDhttp://akizukidenshi.com/catalog/g/gI-04779/、各種抵抗を使用しました。ArduinoではESP8266WiFi.h https://github.com/itead/ITEADLIB_Arduino_WeeESP8266を使用しました。RaspberryPiではOSはraspbianを使用し、開発言語はPythonを使用しました。GPIOピンを使用したのでRPi.GPIOやurllibを使用しました。

(3)開発記のブログなどあれば、それも教えてください。コンテストなどに出品したことがあれば、それも教えてください。

 開発ブログと呼べるほどのものではありませんが、私が今もっているブログです。http://nonkuru.hateblo.jp/ 上記のArduinoセンサを作った際に試しにLCD表示を行なってみた時に書いてみました。それ以降投稿できていません。ただ学んだことをアウトプットすることは大切だと本やネットを読むと必ず書いてあり、大切だととても感じているので、来月の受験が終わったタイミングで本格的に始めていこうと考えいます。

共通問題2

(1)あなたが経験した中で印象に残っている技術的な壁はなんでしょうか?(例えば、C言語プログラムを複数ファイルに分割する方法)

カーネル仮想メモリを実装する方法

(2)また、その壁を乗り越えるために取った解決法を具体的に教えてください。 (例えば、知人に勧められた「〇〇」という書籍を読んだ)

 川合秀実さんの「30日でできる! OS自作入門」を読みながらOSを作成していたのですが、セグメンテーション方式の仮想メモリを実装する方法が自分の勉強不足でわかりませんでした。その解決法として私はまず、そもそも仮想メモリとはなにか、なぜこのような技術が生まれたのか、どんなメリットがあるのかなどの基本的なことを本やインターネットで調べました。その際に(http://note.chiebukuro.yahoo.co.jp/detail/n106523)などのサイトや「応用情報技術者試験の教本」や「コンピュータアーキテクチャのエッセンス」(http://www.shoeisha.co.jp/book/detail/9784798109909)、「ヘネシー&パターソン コンピュータアーキテクチャ 定量的アプローチ 第4版」(http://www.shoeisha.co.jp/book/detail/9784798114408)などの本、「SoftwareDesign」などの技術系雑誌です。そして概念が理解できたら、実際に実装していくためにはハードウェアとどう関わっているのかを理解しました。その際にも「ヘネシー&パターソン コンピュータアーキテクチャ 定量的アプローチ 第4版」を読みました。またGDTやIDTに関しては「0から作るOS開発」(http://softwaretechnique.jp/OS_Development/kernel_development02.html)を参考に理解していきました。

(3)その壁を今経験しているであろう初心者にアドバイスをするとしたら、あなたはどんなアドバイスをしますか?

 まず、(2)で書いた本やサイトを読み漁ってみるといいよとアドバイスします。その時に実装の答えを探すというよりは、ハードウェアの動作と概念の結びつきを意識して読むようにするといいとアドバイスします。その理由はこれまでにプログラムなど技術的に詰まったところがありましたが、その度にたくさんの本やウェブサイトを読んできました。しかしその中に無駄なものはなかったと思うからです。たしかに、現在ぶち当たっている壁を最短で越えるということを考えれば無駄な事も多くあったかもしれませんが、その無駄が後々のりしろとなり別の壁や知識と出会った時に結果的に原因を探るヒントになったり、点在していた知識の結合に役立ち体系的な知識へと昇華できると思っています。そのためこのようにアドバイスします。

共通問題3

(1)あなたが今年のセキュリティ・キャンプで受講したいと思っている講義は何ですか?(複数可) そこで、どのようなことを学びたいですか?なぜそれを学びたいのですか?

私はセキュリティ・キャンプで以下の講義を受けたいと考えています。その理由は普段私は技術を学ぶ際に本やインターネットから情報を得ることが多いです。その情報を得たときはわかったつもりでいるのですが、数日経つとうろ覚えになってしまっています。そのため私は実際に手を動かすようにしています。そうすることでプログラミングでも思ってもみないエラーが出ることがあり、それをデバッグしていくことでより理解を深めることができます。また本を読んでいて新しい知識や考え方を得たときにもワクワクはあるのですが、私は実際に手を動かしている方がよりワクワクとそれに加えて実際にモノができていくワクワクが大きく感じることができ、読むだけ聞くだけよりは手を動かしている方が好きです。以上の理由から全体的に手を動かすことができる講義を受講したいと思いました。
専門(1):【検知】公開鍵暗号のハードウェア実装と攻撃〜ICカードが持つ脆弱性とその対策〜
専門(2):【検知】人工知能とセキュリティ
専門(3):【解析】The OOM CTF
専門(4):【解析】実行ファイルの防御機構を突破せよ
専門(5):【IoT】USBメモリからブートしてみよう
専門(6):【集中】インフラセキュリティ・ブートキャンプ
専門(7):【集中】インフラセキュリティ・ブートキャンプ

これ以下より各講義を受けたい理由と学びたいことをについて述べます。
専門(1):【検知】公開鍵暗号のハードウェア実装と攻撃〜ICカードが持つ脆弱性とその対策〜
 この講義は今まで私が疑問に思っていることを解決してくれると期待しています。私は普段、交通系ICカードやキャッシュカードなど多くのICカードを利用していますが、その便利さと引き換えに私たち利用者にはその仕組みがブラックボックスになるというトレードオフの関係にあります。そんなICカードで偽造やスキミングなどの犯罪が行なわれているということを知り、カードの中身はどのような構造になっているのか、また偽造できるのであれば私たち一般人にも書き込みはできるはずなのでその方法などを知りたいと思いました。またそれらを学ぶことでその対策はできないのかということを知りたいです。

専門(2):【検知】人工知能とセキュリティ
 私は学校で機械学習に関する研究室に所属しています。実際にC言語でXORを自己生成ニューラル木立を生成することで判別するプログラムやそれを拡張した菖蒲の花の種類を判別をするプログラムを作りました。今後はこれらをセキュリティに役立てないかということで利用者のタイピングの特徴により正規利用者と不正利用者を判別し認証するものを作れないかと考えています。私自身人工知能に関連することを学んで活用しようと考えている当事者として今後人工知能が人間を脅かす日が来るのか、来るとしたらその対策方法はあるのかということについていろいろな人の考えを聞かせていただいた上で自分の考えを深めていき、今後の研究に役立てていきたいです。

専門(3):【解析】The OOM CTF
 私はOSやカーネルの仕組みに興味があり、OSを自分で作り始めました。もともとはLinuxカーネルソースコードを読んで勉強しようと思ったのですが、どこから読めばいいのかわからずなかなか手が出なかったので自分には難しそうと感じました。そこでOSを作った方が簡単なのではと思い作り始めるとOS開発がとてもおもしろく、他のカーネルなどについてももっと知りたいと思いました。OS開発の中で仮想記憶が少し難しくなかなか進めなかったのですが、メモリ管理の仕組みがわかりとても興奮しました。世の中的にも少し難しい分野なのかなと思いつつ、だからこそメモリに関する脆弱性が多く存在しているのではと思いました。以上のことからLinuxカーネルのメモリ管理についてもっとよく知りたいと思いました。

専門(4):【解析】実行ファイルの防御機構を突破せよ
 この講義では専門(3)のThe OOM CTFで学んだ知識を活用できると感じました。専門(3)では管理側としてLinuxカーネルのメモリに関する対策について学び、この講義では攻撃者側の視点に立つことでメモリ管理について多角的にみることができより深く学ぶことができると思います。また私はこのような攻撃についての知見に乏しいため、本講義を受けることによりこれから学んでいくための足がかりとしたいと考えています。

専門(5):【IoT】USBメモリからブートしてみよう
 既に書いた通り、私は今OSを作っていますが、FDブートを前提としておりあまり現在においてあまり実用的ではありません。そのため、今作っているOSをUSBブートできるように改造したいと考えています。そこでこの講義を受ければ、それも実現できると感じたのでこの講義を受けたいと思いました。

専門(6):【集中】インフラセキュリティ・ブートキャンプ
専門(7):【集中】インフラセキュリティ・ブートキャンプ
 以前、学内SNS制作する活動に参加した際私はインフラ担当としてサーバの構築・運用に携わりました。そのときはCentOS7を使用し、SSH・WEB・FTPサーバを構築しました。本格的にサーバを構築をしたのはそれが最初でしたので、どうすれば安全に構築できるのかということを常に疑問に思っていました。特にファイルなどのパーミッション制御やSELinuxの設定、不要サービスの停止などどのような設定が最適なのかそのときに答えを見つけることができませんでした。そのため構築が終わった後も不安が付きまとう原因となってしまいました。その時解決できなかったことをこの講義に参加すれば解決できると思いましたので、この講義に絶対に参加したいと思いました。また、昨年のCTF for Beginners AT&D 博多に参加した際、初めてのAT&D形式だったこともあったのですが、それ以上に自分の力不足を痛感させられました。あのときの思いをもうしたくありません。そこでこの講義に参加することで、サーバのセキュリティについてどう考えていけば良いのか、その足がかりだけでも得たいです。

(2)あなたがセキュリティ・キャンプでやりたいことは何ですか?身につけたいものは何ですか?(複数可) 自由に答えてください。

 私はセキュリティ・キャンプで技術や知識は大前提として、同じことに興味を持った同世代の仲間を作りたいです。私は高専に在学していますが情報学科もなく情報系の授業も少ないので趣味(授業時間以外)でプログラムをしている学生は数える程しかいない上、セキュリティに興味をもって勉強会(セキュリティもみじやCTF for Beginners)に参加するなど実際に活動している人は全校生徒の中で私だけです(今回のセキュリティ・キャンプのポスターやチラシを学校や寮に張ったり、面白さを力説した結果1人興味を持った後輩がいました)。先生方を含めても情報系の方は少なく、私の疑問に答えてくださる人が身近にいません。そのため普段は1人で本やネットで勉強していますが、このセキュリティ・キャンプに参加することでその疑問を解決できると思っています。また、普段1人でやっているだけは疑問に思わないところや気付かない考え方などに多く触れることができ、より楽しく学ぶことができると思います。そこでセキュリティ・キャンプでは全員に名刺を配る勢いで参加し、コミュニティの輪を広げたいです。
 そして私はセキュリティ・キャンプを通して自分がまだ知らない分野に積極的に挑戦し自分の可能性を広げたいと考えています。私は今までネットワークやサーバに興味を持ちそれらについては勉強してきましたが、それ以外の例えばカーネルであったり、ハードウェアについては興味はあったのですが、なかなか手を出しづらいと感じていたのでこの機会を利用しそれらに挑戦しそれらに対する気持ちのハードル下げセキュリティ・キャンプが終わった後も学んでいく為の入り口としたいと考えています。また自分が学んで終わりにするのではなく、学校に帰ってからセキュリティ・キャンプを通して学んだ知見や経験を生かしこれから興味を持つ可能性のある後輩に還元していきたいと考えています。具体的には、セキュリティ・キャンプの内容や参加者の様子などをパワーポイントなどを用い発表したり、実際にセキュリティが破られる様子を見てもらうことでその脅威を感じてもらったり、簡単なCTFをすることでそのような技術に興味を持ってもらいたいと思っています。そして今後自分みたいな後輩が出てきた場合にバックアップできる環境を学校に少しでも残しておきたいです。しかし、セキュリティや情報系に限らず技術には悪用されるリスクが伴うのでそのあたりの倫理観であったり、学校で発表や勉強会、実演を行う上での注意点やコツなどのアドバイスも経験豊富な講師の方々にぜひお聞きしたいです。

まとめ

長くなりそうなので今回はここまでにします。選択問題については後半に書くことにします。

nonkuru.hateblo.jp