HappyNote3966’s blog

備忘録、作業記録的なことを書きます。低レベル注意。ご指摘等ございましたらやんわりとお願いします(´;ω;`)

サイバーディフェンス研究所見学記

 3月某日、サイバーディフェンス研究所(以下CDI)の方にお邪魔させて頂きました。

www.cyberdefense.jp

見学させてもらうまでの経緯

 私が昨年の8月に参加したセキュリティキャンプ全国大会では、CDIの福森さんが「ZENIGATAになりたくて」という題で講義をされました。

happynote3966.hatenadiary.com

 CDIの福森さんの講義を聞いた後、CDIのポロシャツを欲しいとTwitterで呟いたところ…

 ポロシャツなどCDIグッズを頂きました。夏の間はキャンプTシャツとCDIポロシャツを着て過ごしていました。

 話はそこで終わりではなく、そこでCDIのオフィスに見学に来ませんか?とのお誘いを受けました。滅多にない機会なので、お邪魔させてもらうことに。
(見学の約束は夏にしたのですが、僕の個人的な都合で3月上旬まで伸ばしてもらいました。申し訳ないです…)

 CDIのことを知るようになったのはキャンプに参加してから。あまり詳しくは知らなかったけれども、セキュリティの会社だということは想像が付きました。
きっかけはNHKで放送されていたプロフェッショナル~仕事の流儀~でのこと。名和さんがセキュリティ業務に対してストイックに取り組む姿勢を見てすごいなぁと思い、ちょっとだけ調べてみたら、名和さんがCDIに在籍されていたのを知りました。

ちなみに、見たのはこちら↓

www.nhk.or.jp

オフィスにお邪魔すると

 CDIオフィスの場所は、東京駅前の八重洲センタービル4階。
(正確には〒103-0028 東京都中央区八重洲1-6-6 八重洲センタービル4Fです)

https://goo.gl/maps/h6YLJxCYGNT2

 許可を貰ってるとはいえ、企業のオフィスに一人でお邪魔するなんてことは初めてなので少し緊張しました。
エレベータで4階まで上昇し、案内掲示に従って進むと…CDIのオフィス入り口がありました。そこには、CDIのロゴが壁に埋め込まれています。

f:id:HappyNote3966:20170316155450j:plain

ハッカーが使うプロンプトを連想させるような色の組み合わせ。カッコいいですね…( *´艸`)

f:id:HappyNote3966:20170316155446j:plain

 そこで迎えてくださったのは、CDI営業部の佐藤さん。見学まで何度かやり取りをさせて頂いた方です。また、同じくエンジニアの丑丸さんと松隈さんにも同席して頂いて、CDIの概要などを伺うことができました。

CDIってどんな企業?

 CDIのことを知った時、「CDIはセキュリティの企業」というイメージを持っていても、じゃあ何をやっているかと言われると…「サイバー『ディフェンス』なのだから、守ってる企業なんじゃないのかな」というイメージが強かったのが本音です。

 では実際のところどうなのかな?と、佐藤さんからお話を伺いました。

 CDIは主に4つの活動を中心として、その内訳としては、

  • セキュリティ診断(脆弱性診断)

 自分たちのシステムやサービスがちゃんと安全な状態か実際に確かめるものです。一般的なネットワーク診断やプラットフォームの脆弱性診断は、ホスト単体で安全かどうかを確かめますが、CDIでは複数のホストやネットワーク機器を含む組織のネットワーク全体を対象として診断を実施します。具体的には、ホスト単体への侵入を試行するだけではなく、あるホストから入手した情報に基づき、別のシステムなどに攻撃を仕掛け、新たに情報を入手し、攻撃…といった感じで、実際のハッカーが全力で攻撃を仕掛けたことを想定した診断を行います。びっくりしたのがハードウェアの診断です。製造メーカーからの依頼に基づき、ハードウェアをオシロスコープ、等で何の通信をしているか調べたりもするそうです。

io.cyberdefense.jp

  • トレーニング(人材育成)

 セキュリティの技術的なことを学べる講義です。企業など様々な団体がこれを受講しているそうで、ほとんど定員が埋まるそうです。どんな講義があるかというと、マルウェアやプログラムの解析、Webやネットワークの攻撃、セキュアコーディング、メモリフォレンジックなど、実際に手を動かして学べます。企業によってはプライベートな講義内容にすることもできるそうで、その中で好評だったものが正式なコースになることもあるそうです。

  • インシデントレスポンス(緊急対応支援)

 セキュリティの事故(インシデント)が起こったとしても、その被害を最小限に食い止めたり、再発を防止したりするための対応(レスポンス)活動のことです。セキュリティ診断の時と同様に、ログやマルウェアなど個々の解析だけなく、対象となる全て(ハード・ソフトなど)を調べ、様々な情報を入手・解析します。

 企業や団体に応じた問題を解決・サポートするものです。事例がいくつかあったのでピックアップすると、サイバー攻撃の対処演習や、その演習環境の企画開発、CSIRTの構築や機能の強化などです。面白そうなものになると、組織内でのCTFを実施するための支援や、CDIハッカーによる講演やデモンストレーションなどもあるそうです。そういえば、サイトのなかにMAGUROというオンラインのCTFもあるみたいです。

MAGURO

f:id:HappyNote3966:20170316160631p:plain

 他にも色々ありますが、共通して言えることは、「人間がもたらす脅威には人間しか対処できない」という理念の元で様々なサービスを行っているということです。

CDIってどんな人が集まってるの?

 CDIの企業についてを伺った後、同じくエンジニアの福森さん、ラウリさんと一緒にお話をさせて頂きました。

 いきなり結論ですが、CDIの方はとてもレベルの高い方々の集まりだということが分かりました。お話をしているときは↓の繰り返しです。

 未熟な僕が何かしらの技術的な単語を使って質問を投げる→それに対して濃い内容で返ってくる→理解しきれず圧倒される

 何度か質問しても結果は同じで、今考えてみると貴重な経験をしているんだなぁという気持ちになります。普通の学生が5人の本職の方と同席しているのですから、非日常的な空間を体験してきました。

 でも、みなさん色んな経歴をお持ちでしたが、共通しているのは技術が好きだということ。
分からないなりに話を聞いていてそれは感じました。好きだからこそたくさん話してくださったのだと思います。その話の内容が分かったらもっと楽しいだろうなぁとも思いました。

 …で、やっぱりCDIという企業を知ったからには、採用関係のお話も気になるところ。でもなんだか採用しているイメージがあまりないので、色々と聞いてみることに。

 そもそも採用をしているかということについては、YES。それはウェブサイトを見ても分かるのですが、見たところ募集時期が「随時」となっています。
「ということは、大学を卒業してから就職するのはできないのですか?」
CDIは新卒も求めています」
あっ、新卒も大丈夫なんですね。
ただ、一般のIT企業とは異なり、一定以上の技術力・能力が求められるため、万人受けするような企業ではないとのこと。その逆から言えば、やる気があって、セキュリティで役に立ちたいと思う人であればむしろ来てほしいとも仰っていました。「我こそは!」という方なら新卒でも中途でも挑戦できるということですね。
(いつか会社説明会もやりたいなーとも…)

 また、セキュリティなどの分野に頑張る学生を支援したいとのことです。セキュリティキャンプ全国大会で講演をしたり、今回のように僕が企業の見学をさせてもらえたのもその一環だと思います。

最後に

 色々とお話を聞いて、大切だなぁと思ったことをいくつか取り上げます。

  • 数学、英語は大切

 福森さんは今機械学習を勉強しているのだとか。大学で学んだ微積線形代数などの知識は、当時勉強する理由が分からないまま勉強していましたが、今はその必要性を強く感じているそうです。数学や英語に限らず、大学で学ぶことに無駄なことはないみたいです。

  • ハッキング技術は悪用しない事

 当然といえば当然ですが、ハッキングが成功したときに得られる達成感に魅了されて、悪いことをしない事が大切です。あくまで技術は良い方向に使いましょう。

 全体として、たくさんお話を聞かせて頂いて、普通に勉強するだけでは得られない貴重な経験をさせて頂きました。この場を借りて、佐藤さん、丑丸さん、松隈さん、福森さん、ラウリさんにお礼を申し上げます。ありがとうございました!

おまけ

 お土産を貰いました。夏にCDIグッズを貰っているのに、今回も頂きました。ありがとうございます!

f:id:HappyNote3966:20170316160929j:plain

CDIパーカーです。CDIグッズが充実してきました。春休みはこれを着て過ごします。

 それと、ラウリさんの持っているデバイスの数が多かったです。スマホ×2、タブレット×1、PC×2。計5台を持ち歩いていました。そしてその中のPC一台が異常でした。形がスタイリッシュな湯たんぽかと思うほど大きく、分厚い。そして性能も桁が違いました。メモリが64GBもあるんですよ。64GBもあれば操作が軽快みたいです。この桁違いのPC、お国では普通のことなんだとか。そのPCが入ったカバンは重すぎて持ち上げることができませんでした。

セキュリティ・ミニキャンプ in 北陸 2016(金沢) 今更ながら参加記

 12月3日、4日に開催された、セキュリティ・ミニキャンプ in 北陸 2016(金沢)に参加してきました。今更ではあるのですが、その報告をさせて頂きます。今後参加を予定している方の参考になれば幸いです。

f:id:HappyNote3966:20161226172531j:plain

f:id:HappyNote3966:20161226172533j:plain

f:id:HappyNote3966:20161226172536j:plain

 

 

応募用紙

 そういえばミニキャンプの応募用紙を晒している人をあまり見ないですね。
折角なので全国大会と同じように晒してみます。項目を選択するようなところは飛ばしています。興味ない方はスクロールしてください()↓

 

1.「Lチカ」とは何か、自分の言葉で説明してください。もしもLチカの初体験があればそれもお書きください。

 「Lチカ」とは、Raspberry Pi(に限る必要はありませんが)のGPIOなどの端子にジャンパーワイヤーなどを用いてLEDと抵抗を接続し、LED、抵抗、Raspberry Piからなる一連の回路が動作するかを確かめる作業のことを指します。そこでLEDが光っているか確認し、回路が正常に動作することを確かめます。

 私のLチカの初体験は今年の10月16日です。IPAの試験日であるにもかかわらず、一部免除のために時間が余ったので、何気なくLチカをやってみようと思ったのがきっかけでした。もとからRaspberry Piは購入済みで、自作問題サーバの運用として使っていましたが、あくまでソフトウェアの範囲での利用でした。
なぜ試験前にLチカをやろうと思ったのかは分かりませんが、少し考えてみると「ここでLチカをやらないと今後もやらない気がする」という結論に至ったので、Webサイトを探してみながらやってみました。

 その時は「すぐ終わるだろ」と安易な気持ちでブレッドボードにLEDと抵抗、ジャンパーワイヤーを指してみました。Webサイトの指示通りにGPIOを操作するPythonスクリプトを作成し、実際に動かしてみましたが、LEDが点灯しませんでした。うまくいかないと思っていると、たくさん並んだGPIOのピンを間違えて配線しており、本来挿すべき場所に挿していませんでした。それが分かるまで時間がかかり、イライラしながらも何度かサイトを読み返しながら間違いがないかを確認していると、ようやくLEDが点灯しました。
 そこで思ったのは、LEDが点灯させるのが楽しいと思ったことです。普通のC言語のようなプログラムでHello Worldを出力させても、パソコンの画面に表れている文字を眺めるだけなので達成感はあまり感じないのですが、物理的に自分が触れられるものだからこそ結果が目に見えて、その場で配線を変えたりしてわざとLEDを消してみたりなど、プログラミングで言うデバッグ作業がとても新鮮で、面白かったのです。
 時間の都合上、Lチカ自体はそこで終わりましたが、当日の試験中も、試験終了後も、帰って早くLチカの続きがやりたいと考えてしまうほど夢中になってしまいました。翌日に提出しなければならない課題があるにもかかわらず、色々と配線を組み合わせて遊んでみました。まるで理科の実験受ける小学生の気分でした。(※もちろん課題はLチカで遊んだ後にやりました)

 そこからは、Lチカを発展させてもっと面白い回路を作ろうとしました。Lチカの話題から少し脱線しますが、ブレッドボードで電子工作をする際に思ったことを挙げてきます。
 ①部品やパーツの数、そしてそれらの配置を工夫しないと、ブレッドボードの中に収めることができないときがありました。逆から言えば、部品やパーツの位置を適切にして、配線を最小限にすれば、キレイでコンパクトな回路が作れると思いました。市場に出ている電気製品の中身は配置や配線を極限まで最適化し、空間と言う資源を節約しているのだろうと思いました。
 ②ジャンパーワイヤーの色を調整することで、回路の中の流れが把握しやすくなると思いました。LEDに繋げる色、電源からの色など、色分けをして配線の全体図を分かりやすくすることは自分の頭の中の整理にもつながり、後で回路を見返したときに理解しやすくなると思いました。
 ③中学高校で勉強した抵抗値や電流・電圧の知識が必要にもなってくると思いました。その様な知識はテストで点数を取るためにしか使わないと思っていたのが、今更電子工作で必要になるとは思わなかったため、当時の勉強をしっかりしておけばと後悔しています。せっかく勉強したカラーコードの値も忘れてしまったので、現在勉強中です。また、Raspberry Piの出力電圧が5Vであることを意識し始めました。端子によっては3.3Vのものもあり、電圧には気を付けなければならないと思いました。
 ④回路に電流を流し、LEDなどを光らせておしまいではなく、回路の動作中にも利用者が介入してインタラクティブな操作ができるようにできないかと考えました。トグルスイッチを用いて実際にちょっとした操作ができるように遊んでみると、ゲーム機を操作しているようで面白いものでした。
 ⑤LEDに慣れてくると、今度は音声など他の出力も使いたいと思うようになりました。光らせるだけでなく、音や振動などを付け加えることによってより面白い回路の動作内容に幅を持たせたいと思いました。
 ⑥プログラミングによってより精密な動作ができると思いました。最初はGPIOのピンを操作するPythonスクリプトを書いていましたが、あくまでGPIOが電流を流すようにするだけのプログラムだったので深く考えていませんでした。しかし、スクリプトの内容を理解すると、時間ごとに電流のON,OFFを切り替えたり、GPIOからの出力を受け取り、センサの値などを読み取って数値化できると思いました。
 ⑦論理回路の勉強内容を活かしたいと思いました。NAND回路を使うことで全ての基礎回路を表現できることは分かっていたので、NAND ICを複数個用意すれば加算回路程度は実装でき、ゆくゆくはその回路をたくさん集めてCPUレベルの回路を作成できたらいいなと思いました。
 ⑧機能を複数持った回路を作ろうとする際に、持っていたブレッドボードの大きさが足りなかったので、ブレッドボードの使い方をうまくしてスペースを節約するか、新しい大きなブレッドボードを買ってもっと広く使いたいと思いました。いずれは大きなブレッドボード上で、もしくは基板上で電子工作をしたいと思います。
 ⑨当初はジャンパーワイヤーのオスとメスの存在の意味が分からず、3種類のうちどれか一つで十分だろうと思っていました。しかし、Raspberry Piだけでなく持っていたGR-PEACHで電子工作を行おうとした際、端子がRaspberry Piと違っていたのです。この時にジャンパーワイヤーはちゃんと複数種持っておくべきだと思いました。
 ⑩トグルスイッチを使っていると、トグルスイッチそのものに対して興味を持ち始め、トグルスイッチやその他の部品の中身の回路を気にするようになりました。回路をブラックボックス化し、外から入力と出力を気にするだけでよくなるのが好きな私は、いずれは自分オリジナルの部品を作ることができるのではないかとも思いました。

 話は脱線しましたが、最初のLチカで電子工作に対する関心や意欲が爆発的に大きくなったのは確かです。Lチカと言うのは、電子工作をする際に勉強する意欲となる「楽しさ」を教えてくれるよい「通過儀礼」のようなものだと思いました。今後も趣味と勉強を兼ね合わせた電子工作を進めていくつもりです。

 

5.「コンパイル」と「リンク」の違いについて知っていることを教えて下さい。

コンパイル」はある言語で書かれたソースコードを、別のデータ形式に変換する作業のことを指します。例えば、C言語ソースコードアセンブリ言語に変換することなどが挙げられます。一般的な参考書には説明の簡易化のために、ソースコードから実行可能ファイル(ELFやexe)を生成することをコンパイルとしているところもあるのですが、コンパイルアセンブリ言語を出力するところまでです。具体的には、ソースコードを読み取り、その中で字句解析や構文解析、意味解析などを通して中間表現と言うプロセッサアーキテクチャに依存しない表現を作成し、アセンブリを出力します。
 「リンク」とは、複数のオブジェクトファイルや共有ライブラリなどを一つのファイルにまとめる作業を指します。オブジェクトファイルとは、コンパイルの作業結果として出力されるアセンブリ言語アセンブラ機械語に変換したものです。共有ライブラリとは、他のプログラムでも利用できる便利な関数群などが格納されたプログラムです。これらのファイルをメモリアドレスの配置などを調整し、プログラム実行に必要な情報を一つにまとめたりする作業をリンクと呼びます。

 つまり、「コンパイル」と「リンク」の違いとは、ソースコードから一つの実行可能プログラムを生成する過程での作業内容であり、「コンパイル」はソースコードからアセンブリ言語を出力するという最初の方の過程であり、「リンク」はアセンブラから出力されるオブジェクトファイルや共有ライブラリなどを一つの実行可能ファイルにまとめるという最後の方の過程です。

6.あなたがミニキャンプに応募された動機について教えて下さい。また、この講義で学んだことを何に役立てたいか教えて下さい。

 セキュリティキャンプ全国大会に参加して大きな実力不足を感じ、より継続的な学習が必要だと感じたのがきっかけです。特にハードウェアの方面で更なる学習が必要だと感じました。全国大会ではハードウェアとソフトウェアの両方を学ぶことが重要だということを意識しながら参加していましたが、ハードウェアの中身を勉強できて楽しいと思った反面、知識不足から分からない点も多く、楽しかったのに先に進めずもやもやするという不思議な気持ちでした。そして私は高レイヤーより低レイヤーの方に関心があり、低レイヤーこそがコンピュータを学ぶ上でのすべてだと思っていました。しかし、それはあくまでハードウェアが基盤を支えているから成り立つものであって、ハードウェアを知らなければ分からない低レイヤーの領域もあるのだと感じました。
 しかし、必要性を感じたからと言ってすぐさま勉強ができる環境ではありませんでした。まず大学ではハードウェアに関しての科目が少なく、あったとしても仕組みや内部の詳細な構造を学ぶものではく機能単位で学ぶものでした。自分で学習しようにも、そのための教材を揃えるのは金銭的な面からみても厳しく、シミュレータ上での学習は物足りないと感じてしまいます。

 さらに、参考書などをあさってみても、「電子」というワードしか見当が付かないため、書籍を探していても低レイヤーとハードウェアを同時に学べるものはそうそう見つかりません。探すのが下手なのかは分かりませんが、探すのに時間を割いて実際の勉強ができていないのでは本末転倒です。
 講師の方や先人達はそういったことを乗り越え、がむしゃらに勉強しながらも必要な事柄を少しずつ見つけて、自分のものにしてきたのかもしれません。自分だけ効率的な方法を探して楽をしようとしているのではないかと思われてしまいそうですが、私はハードウェアや低レイヤーに限らず全ての分野における知識を吸収し、周りを引っ張っていける存在になりたいのです。時間を少しでも有効活用していろんなことを学びたいと考えています。
 セキュリティミニキャンプ(北陸)の講義はハードウェアが中心であり、更にソフトウェアについても学べるため、先述した私のわがままにピッタリ合っています。全国大会と同じ講義内容であり、私はそのどちらも受講していないので、新たに得られる知識はあるはずです。こんな濃密な体験ができる機会はそうそうあるものではなく、絶対に参加すべきだと私は考えます。全国大会参加後に過去のミニキャンプに参加しなかったことをとても後悔しているぐらいです。

 ですが今からでも遅くはありません。他の人より出遅れたと感じているからこそ、その原動力を無駄にしないよう今やれることを全力で打ち込み、自分の更なるスキルアップに励み、そして周りのレベルも挙げていくべきであり、そのためにもセキュリティミニキャンプに参加すべきだと思い、今回応募に至りました。

 この講義で学んだことを何に役立てたいかというと、低レイヤー含むハードウェア全体に関しての知識を習得し、ソフトウェア上での事象だけでなくパソコンやマイコンなど電子製品全体を扱えるようになり、色んなものを「ハック」できる「ハッカー」になるための布石としていきたいと考えています。
 『BareMetalで遊ぶRaspberry Pi~入門編~』では、ブートプロセスやメモリの使い方を学ぶと書いてあるので、その講義についても実際に体験したいとは思いますが、一番気になるのは「…~データシートの探し方や読み方などの自ら学んでいくための方法を学び~…」とあるところです。ソフトウェアのことであれば慣れているのである程度Googleで検索すれば何とかなりますが、ハードウェアのことになると慣れていないので探す以前に何を探したらいいのか分からないことがあります。この時に、自ら学んでいける力がないと何も解決しないまま諦めるか足踏み状態のまま終わってしまいかねません。そういった意味でも、私は「自ら学んでいくための方法」とはどんなものか知りたいと思います。そこから共通点などを見出し、「さらに自分で学んでいくための方法」を自身で見出していきたいと考えています。
 『AVRマイコンで作るBadUSB自作』では、こちらもハードウェアに関する事柄などを扱うと書いてありますが、特に注目すべきだと思ったのは「USB入力装置のセキュリティ対策を考察します。」とあるところです。以前SECCONの大会内容の中にIoTセキュリティがテーマとして挙げられていたことがありました。私はそれをみてもイマイチ良く分かりませんでした。ハードウェアではなく、人的セキュリティであれば「壊す、盗む、すりかえる」などと言ったことが挙げられるので、ある程度は予測はつくのですが、人的ではなくハードウェアで、セキュリティを実現するとは一体どういうことか想像できませんでした。このような全く見当のつかない分野であるからこそ、得られることが最も大きく、「セキュリティ」についての考えも変わってくると思います。一度凝り固まった思考を柔軟にほぐすためにも、ハードウェアのセキュリティは是非学びたいと思います。

 もう一つ役立てたいと思っていることがあります。それは他の人にも「もっと強くなりたい」という気持ちを持ってもらうことです。
 以前、セキュリティキャンプ全国大会に参加し、自分のレベルの低さを痛感したと同時に、私は自分の置かれている環境下に危機感を覚えました。大学内で開かれている授業は質が高いとは言えず、それにもかかわらずほとんどの生徒がその内容に苦労しているということがあります。その環境下で成績が良かったとか悪かったとか言っているのが恥ずかしいと思えるほどです。当然、上を見ればきりがないのと同じように、下を見てもきりがありません。大学の教授の方々も苦労して分かりやすいように教えようとしている結果どうしても質の高いものを提供できなくなっているのは分かります。悪いのは学ぼうとしない学生が多いことで、どんどんレベルが低下していると教授陣も嘆いていることをよく聞きます。自分の大学に限らずどこでもそうなのでしょうが、少なくともより勉強しなくてはいけないことは自明です。それからというもの、私は校内で「自分たちで教え合うことを重視した勉強会」を開き、そこのリーダーとして活動しています。学校の授業に満足せず、自分でよりレベルアップをしてもらいたいと考えたからです。特に、このような考えが大きくなったのはセキュリティキャンプ全国大会に参加してからだったので、自分の経験をより多くの人にでも知ってもらいたいと、今回勉強会のメンバーには応募するようにお願いをしました。
 自分が学んだこと、というよりは他の人が学んだことに近いですが、自分が学んだことを他の人と共有でき、皆でいい方向に進んでいけるための環境は必要だと思います。
 きっと、勉強会のメンバーも僕と同じように、講義の内容は良く分からなくて大変だったと思うかもしれません。そこでどんな気持ちを持つかは分かりませんが、もっと強くなりたいと思うようなってほしいのです。それを糧に、レベルアップをしてくれればうれしいと考えています。それこそ、セキュリティ(ミニ)キャンプ参加がゴールではなく、そこから先の行動が大切なのであり、参加自体はきっかけに過ぎないというある方の言葉を、私も皆に伝えていきたいと思います。それと同時に、彼らにもいろんなコミュニティが存在していて、様々なことに取り組んでいるんだということを知ってもらいたいです。志を持ったレベルの高い人たちと関わることによって、少しでもいろんなことを知ってもらいたいです。それが功を奏して、彼らも私と同じような気持ちで周りの人を巻き込んで成長していけるような人になってほしいと考えます。それがたとえセキュリティに関わることでなくても、いい経験になってくれると思います。押しつけがましいですが、きっかけや知り得なかった何かを提供できるきっかけづくりを、このセキュリティミニキャンプでできると考えました。

 全体的には、自分や他の人も含めて成長できる環を形成し、自他問わず力強い存在になるための行動を起こすために役立てたいと考えています。

 

 ↑以上が応募用紙になります。偉そうなことが書いてありましたが気にしないでください。気分を害したらすみません。

 

 ミニキャンプに応募したきっかけは、上に挙げた理由に加えて、継続的な学習をしていきたかったのもありますし、見たことのない分野を勉強することが大切だと日に日に感じていて、その分野(今回はIoT関連)をミニキャンプで学ぶことができると思ったからです。
僕の悪い癖は、なんでも食わず嫌いをしてしまうところです。ラーメンが好物なのですが、地元の8番ラーメンというお店が好きで、外食に行くたびに「8番(ラーメン)が食べたい」なんてよく言っていました。他にもおいしいラーメンはたくさんあるのに、それを知らないまま18年近くも同じラーメンを食べ続けていました。大学に入学して、友達と外食をするようになった頃、ようやく他のラーメン屋さんのを食べ始め、おいしいことに気づきました。

 …まぁ、物は例えようで、これと同じことが勉強についても言えます。セキュリティの分野を勉強する際に一番魅力的だったのがバイナリで、マルウェアの解析だったり、Exploitをしてみたりと色々とやってみたのですが、WebやIoTなどの分野は触ってきませんでした。それは「僕はバイナリ系で生きていくんだ、だから他の分野は最低限知ってればいいから優先度低めでいい」と思っていたからです。WebやIoTにも面白いことがたくさんあるのに、それを知らないのは損でしかないですよね。働き始めて忙しくなっても勉強はできるでしょうが、学びの機会は学生の間より少なくなるはずです。だから今のうちに、色んなことを知っておきたくて、今回ミニキャンプに応募しました。後で詳しく書きますが、実際面白いことばかりでした。

 というわけで、話がそれてしまいましたが、その面白い内容をご紹介します。タイムスケジュールは以下のようになります。これに沿って詳細をお話します。詳しいことは、こちらのサイトをご覧ください。

www.security-camp.org

 

1日目(一般講座)
  • 13:00~13:10 『開会挨拶』
    北陸先端科学技術大学院大学 教授 丹 康雄さん
  • 13:10~14:10 『IoTにおける脅威と対策 ~「IoT開発におけるセキュリティ設計の手引き」を題材に~ 』
    情報処理推進機構技術本部セキュリティセンター研究員 辻 宏郷さん
  • 14:20~15:20 『サイバー攻撃の現状とCSIRTの重要性』
    NECソリューションイノベーター株式会社 北信越支社 北陸支社 上級プロフェッショナル 高江 茂さん
  • 15:30~16:30 『サイバーレンジ自動生成による効果的な人材育成』
    北陸先端科学技術大学院大学 特任准教授 Razvan BEURANさん
  • 16:30~17:00 『ライトニングトーク』
    石川県警察本部
2日目(専門講座)
  • 10:00~12:30 『BareMetalで遊ぶRaspberry Pi ~入門編~ 』
    セキュリティ・キャンプ講師 西永 俊文さん
  • 13:30~15:45 『AVRマイコンで作るBadUSB自作』
    セキュリティ・キャンプ講師 竹迫 良範さん

『開会挨拶』(講師:丹 康雄さん)

 ミニキャンプの始まりとして、北陸先端科学技術大学院大学の丹康雄さんからご挨拶を頂きました。

 石川県のセキュリティ人材育成は、ミニキャンプやIT-Keys,SecCap,CYDER(全国版、地方版),石川県庁(ISA),ミニCYDER,民間企業のサイバーセキュリティ研修など、様々なものがあるということでした。また、北陸のミニキャンプで全国大会への人材を見出したりなど、セキュリティ人材育成に力を入れているとのことでした。

 同じ石川県に住んでいながら、セキュリティ人材育成のためのプログラムが他にもたくさんあるとは知りませんでした。そういうのにも参加してみたいところです。

『IoTにおける脅威と対策 ~「IoT開発におけるセキュリティ設計の手引き」を題材に~ 』(講師:辻 宏郷さん)

 初めの講義として、情報処理推進機構技術本部セキュリティセンター研究員の辻宏郷さんより講義して頂きました。

 IoTで家電製品などが「つながる」と、セキュリティの対策が不十分であったり、責任分界点が曖昧であったりと色々な問題があるそうです。2010年にIPAから発表された10大脅威では、IoTに関する問題は17位でした。しかし現在ではそのIoT機器の乗っ取りなどが問題となっています。そのIoT機器とは、Webカメラスマートハウス、スマート冷蔵庫であったり、薬剤ライブラリや自動車など、人の命に直接かかわるものも含まれます。

 そこで、IPAから発行されている「IoT開発におけるセキュリティ設計の手引き」を元に、複数の例からどのような対策を取るべきかを考えます。まずはIoTの定義として、IoTの構成要素を5つに分割します。

  1. サービス提供サーバ…クラウドなど
  2. 中継機器…ルータやスマホ
  3. システム…病院内の医療ネットワークなど
  4. バイス…特定の目的専用に設計された機器など
  5. 直接相互通信デバイス…中継機器を介さずに通信ができるデバイスなど

 構成要素を分割したら、今度は以下の手順を踏んでいきます

  1. 「全体図」を明確にする
  2. 守るべき「資産」を明確化する
  3. 資産を脅かす「脅威」を明確化する
  4. 脅威に対する「対策」を明確化する
  5. 数ある対策の中からコストなどに見合ったものを選択する

 この手順を取る中で、脅威の分析を行う手法は二つあります

  • 一般的アプローチ(脅威を脆弱性を洗い出して考える)
  • 攻撃シナリオベースアプローチ(実際に攻撃されそうなことを考える)

攻撃シナリオベースアプローチの例として、ネットワークカメラを例に挙げると、ネットワークカメラからの画像を盗み見られたり、改ざんされたりといったことが考えられます。そこから対策を練ることになります。ただし、対策は対象機器のリソースやコスト、インシデント発生時の影響度合を考慮しなくてはなりません。

 さらに、脆弱性の対応は開発段階と運用段階によって異なり、開発段階では脆弱性をなくすように努め、運用段階では脆弱性情報を収集するとともにユーザに通知しなければならないとのことです。

 

ここからは4つのIoT機器を例に挙げ、特徴・脅威・対策を列挙します。

デジタルテレビ
  • 特徴:製品寿命が長いため、継続的なサポートが必須。スパムの踏み台にされることも
  • 脅威:ウィルス感染、物理的な侵入、ポータルサイトなどネットも脅威
  • 対策:FW,アンチウィルス、暗号化など
ヘルスケア
  • 特徴:患者の人命に関わったり、患者の個人情報などを含んでいたりとクリティカル
  • 脅威:ヘルスケアデータの「一括漏えい」、内部不正、改ざんなど
  • 対策:耐タンパ、セキュア消去、暗号化、紛失・盗難対策など
スマートハウス
  • 特徴:前住居者によるパスワード使い回しなどによって、在宅状況の確認などもできてしまう
  • 脅威:データ漏えい、盗聴・改ざん、不正アクセスDoSなど
  • 適切な遠隔操作の実装、認証強化、暗号化など
コネクテッドカー
  • 特徴:重大な事故、人命にかかわり、収集される情報は個人情報に相当
  • 脅威:データ漏えい、改ざん、使用者自身による不正な改造など
  • 対策:暗号化、不正プログラムの動作防止、セキュアな消去、OBD-2ポートへの対策

このように、各機器に対して様々な特徴と脅威があり、取るべき対策も様々です。中にはダイレクトに人命を奪いかねないものもあります。開発する際は、チェックリストのようなものを作成し、脆弱性を作り込まないことが大切です。その参考になるサイトを以下に示します。

 

こちらはIoTのセキュリティというページで、IoTセキュリティに関する資料等が公開されています。

www.ipa.go.jp

こちらのページはインターネットに接続されている機器を検索するサービスの活用方法などが紹介されているレポートです。

www.ipa.go.jp

 こちらのページはIoTの開発者が最低限検討してほしい事項をまとめたものです。

「つながる世界の開発指針」を公開:IPA 独立行政法人 情報処理推進機構

こちらのページはOWASPという団体が公開している、IoTセキュリティを理解向上を支援するための情報があります。Top 10 IoT Vulnerabilitiesというものもあります。

OWASP Internet of Things Project - OWASP

 こちらも同様に、OTAという団体が公開しているもので、31項目のベストプラクティスをまとめたフレームワークなどが載っています。

otalliance.org

こちらのページも同様に、GSMAという団体のセキュリティガイドです。ページには動画がよくみられて、(英語ですが)なんとなく敷居が高く感じられるものではなかったです。

www.gsma.com

 

 医療関係に少しだけ興味があるので、今回のお話に合った医療機器に対しての攻撃というのが恐怖しか感じませんでした。IoTによってセキュリティの甘い機器が悪用されると脅威になり、物理的に攻撃を与えられることは知っていましたが…医療機器になると、機能を落とすだけでも命を奪われるかもしれないと思うと、恐ろしいの一言に尽きます。

 「じゃあそういうものの対策をしっかりしなければならない」となるのですが…IoTのセキュリティはハードとソフトの両方を知らなければできない、と全国大会で学んだので、改めて脅威と対策の多さに圧倒された感じがしました。しかもIoTならではのスペックもあって、必ずしも強固なセキュリティ対策が取れる訳でもないため、実際に開発の場に立ったら対策の種類に迷ったりしてしまいそうです。

サイバー攻撃の現状とCSIRTの重要性』(講師:高江 茂さん)

 続いての講義として、NECソリューションイノベーター株式会社 北信越支社 北陸支社 上級プロフェッショナルの高江 茂さんより講義をして頂きました。

 現状のサイバー攻撃は、標的型攻撃(数か月から数年にかけて)、DoS(10~60分、長くて1週間)が依然として活発であり、特にランサムウェアに至っては急増しています。その攻撃者は国が関わっているものから俗に言うスクリプトキディまで様々です。

 近頃よく聞く標的型攻撃の手法は高度化しており、サンドボックス解析の回避をするようになったり、PlugXやEmdiviなどのマルウェア作成ツールの存在、そして情報収集対象が機密情報だけでなく様々な情報に拡大していることから、対策も困難になっているそうです。

 それでも以下のような対策をする必要はあります。

  1. 大容量の通信(つまりDoS)に対しては監視を強化することはもちろん、その予兆を検知することが大切(例えば現実で何かしらのイベントが発生する、とか)
  2. リフレクション攻撃(DNS,NTP,SSDP)に対しては脆弱性の対策を施し、攻撃に加担しない事
  3. 破壊型の攻撃に対しては、標的型攻撃の対策を取ること

 最近の攻撃例として有名なのは、アノニマスが銀行を攻撃したり(opIcarus)、Miraiのソースコードが公開されたことからDDoSが行われたりしたことです。海外でも日本でも攻撃は行われていますが、今後東京オリンピックの影響で日本が攻撃を受けることになるそうです。しかも、「東京」ではなく日本全体が。

 

 ここでランサムウェアとIoTのサイバー攻撃に目を向けてみます。

  • ランサムウェア
    ファイルの暗号化やシステムの防止(MBRの書き換えなど)の攻撃パターンが存在し、それらはメールやWebで感染します。大抵URLが記載されていますが、そのURLは表示されているものとは違ったURLへアクセスします。なので単にURLを見るだけでは騙される可能性が高いです。
    ランサムウェアなどマルウェアに感染した後、「感染端末をネットワークから切断する」といった対策が挙げられますが、これは有効or無効の意見が分かれているそうです。もちろんネットワークから遮断すれば漏えいは防げるでしょうが、マルウェアの中にはネットワークが切断されたことを検知するものもあるそうです。
    また、ランサムウェアの特徴として「データを返してほしくば金をよこせ」というものがあります。データの身代金として1000万するものもありますが、中にはデータの価値よりも安い身代金を要求するランサムウェアもあったそうです。これは推測らしいのですが、そのデータの価値を知らない「子供」がやったのではないかとも。
  • IoTのサイバー攻撃
    先程も説明した通りMiraiが有名です。Miraiは攻撃対象の機器が備えているであろう様々なアーキテクチャMIPS,PowerPCなど)に対応しており、しかもそのソースコードが公開されています。
    Miraiに限らず、他のIoT機器を狙うものもあります。特に、Telnet経由で不正アクセスされることが多く、工場出荷時のまま利用されているIoT機器は危険です。こういったIoT機器は、販売数が多い上に機器の性能が高いとは言えず、さらに利用形態も様々であるなど、脆弱性の対応が困難な性質を持っています。
    人命やインフラを狙った攻撃であるが故に、社会不安やテロとの連携も示唆されていたり、踏み台として利用したりすることもできます。いずれにせよ、これらはその社会不安やテロを狙っている可能性があるので、それを見極める必要があります。普通に見れば、狙っている社会不安よりも「攻撃」そのものが「目的」に見えてしまうので、リスク分析をする際は手段と目的を混同しないことが大切です。

 このようにサイバー攻撃が激化する一方で、その対応をしたり、人材育成を行う動きがありました。ここからはNECの方々の取り組みとなります。

 サイバー攻撃はあくまで人vs人なのであり、固定的な対応はほぼ無意味です。細かく対策ステップを踏んでいき、攻撃者の「投資意欲」を減衰させることが重要です。それらを助ける指針として、攻撃手法の明確化と防御の可視化が挙げられます。

 また、サイバー攻撃への対策はどこかの部署だけがやればいいというものではなく、色んな部署と連携して行う必要があります。サイバーセキュリティ総合演習では様々な部署との連携を確認しています。

 他にも、人材育成のためにCTFをすることもあります。CTFはOSやDB、マルウェアやメモリなどの知識が必要であり、社内でその腕を競い合うこともあります。

 

 ランサムウェアを送りつけてくるのはどこかのハッカー集団か何かしらの組織なんじゃないかな~、とか思っていましたが、今回のお話を聞いてちょっと考えが変わりました。サイバー攻撃は誰でもできるんですね。誰でもできる=誰でもやってもいいとかにはなりませんが、子どもがやっているかもしれないと聞くと、善悪の判断がまだ完全ではない子がやっているのかもしれません。段々と、サイバー犯罪の年齢が低くなるのかなと思いました。

 東京オリンピックが開催される年は、多分大学を卒業して就職している頃だと思います。セキュリティを意識した開発ができるよう、今のうちにたくさん勉強して、CTFや勉強会にも参加して知識と経験を蓄えておかないといけないと思いました。それもハードとソフトの両面で、色んな事を知っておかないといけないので、これからも様々な分野に目を向けることを忘れないで行動したいと思います。

 

『サイバーレンジ自動生成による効果的な人材育成』(講師:Razvan BEURANさん)

 3つ目の講義として、北陸先端科学技術大学院大学 特任准教授 Razvan BEURANさんに講義して頂きました。

 サイバー攻撃によって社会的信用の失墜や事業停止、事業継続が困難になります。Yahoo!のデータ漏えいでは5億人ものユーザの情報が漏えいするなどしました。他にも、Razvanさんの個人的な環境下では30分にTelnetに対するアクセスが11回も観測されるなど、サイバー攻撃は頻繁に起きています。

 こういったサイバー攻撃に対しての対策を立てる上で、やはり私達人間がその対策方法や防御手段を知らなければなりません。つまり、サイバーセキュリティ人材育成が必要になります。

 そのサイバーセキュリティ人材育成のためにはサイバーレンジと呼ばれるものも必要になります。

  • サイバーレンジとは
    サイバー攻撃や防御の演習を行うための仮想的な演習場みたいなもの。
    受講者・講師が演習環境にアクセスできるようにするのと、スタッフに対しメールなどで対応状況をやり取りできる環境と、模擬的な攻撃者のいる環境が用意されている。

 サイバー演習プログラム(セキュリティ人材育成のための環境・イベントやその名称)の代表例として、セキュアEggs、SECCON、セキュリティキャンプ、CYDER、Hardening Project、enPIT-Securityなどが挙げられます。しかしこれらの演習環境の構築は「手作業」が多く、規模に応じて時間がかかり、演習で用いられる問題などに間違いがある可能性もあります。その対策として、スタッフや攻撃者の役割や問題作成などを自動化させるといった事が必要であり、今回のテーマはそのフレームワークの開発です。

 サイバーセキュリティ人材を育成するためには多種多様なサイバーレンジ環境を「簡単に」構築できるようにする必要があります。例えば、受講者のレベルが高い場合にはセキュリティトレーニング、レベルがそれほど高くない人にはセキュリティの認識をさせるトレーニングなどが必要になります。サイバー演習もそのレベルに合わせて指向を変える必要があり、レベルの高い人には模擬的な環境下で技術的なセキュリティを学ばせ、そうでない人には基本的なことをゲーム要素も交えたクイズ形式などにすることも考えられます。

 実世界のインシデントでは、脆弱性の不正利用から攻撃を行います。それらに対応して、サイバー演習では主に三つの演習の種類があり、それぞれに目的があります。それらを繰り返すことで実世界のインシデントに対する対応力を上げます。

  • 攻撃系演習…不正利用の認識
  • 解析系演習…現象の理解
  • 防御系演習…対策などの立案

 Razvanさんが開発したのは、CyTrONE(サイトロン)と呼ばれるフレームワークです。問題のレベルや種類を設定し、確定するだけで自動的にそのサイバーレンジを生成してくれるもので、スマートフォンからでも操作ができるようにするそうです。

 演習用のサーバを用意すれば、演習内容の設定をするだけでサイバーレンジができあがります。その生成時間は簡単なものであれば5分程度でできるそうです。

 このCyTrONEはオープンソースで、誰でも利用できるよう年度末に公開する予定だそうです。今後の課題として、ビジネスモデルを考えなければなりません。Razvanさんは、インシデントエミュレーションや、IoT、セキュリティ認識などの問題のジャンルを追加するといったことを企業などが行うことでビジネスに繋げられるとしていました。また、インシデントやエクスプロ意図のデータベースなどと連携し、更なるサイバーレンジ生成の自動化を質を高めるとしていました。

 

 CTF for ビギナーズに参加して、自分でもあのような環境を作ってみたくてラズパイで頑張ったことがあります。とっても簡素なシステム(システムと言えるのかも疑問)にしたつもりなのに、構築にかなり時間がかかりました。問題内容も誤りがあったりして大変でしたが、CyTrONEのようなフレームワークがあるならそういったことも容易に行えそうです。一度は使ってみたいです。

 Hardeningやインシデントトレーニングなどは体験したことがなかったので、今後自分で問題を自動生成して、自分で攻撃しながら防御もするという一人Hardening?も行えそうです。サーバの用意は難しくないですし、問題を自分で作るという手間を学習に使えるというのも魅力的です。問題を作りながら学ぶというのもありますが、その自動化を行う機構を調べて勉強することもできそうなので、CyTrONEには今後注目したいところです。

 

『IoT時代の到来とサイバー空間の脅威~IoT時代におけるサイバー犯罪~』(講師:石川県警の方)

 1日目最後の講義として、石川県警察本部の方よりライトニングトークをして頂きました。

 サイバー空間の現状として、インターネットが当たり前であり、そこにはサイバー空間としての脅威がつきものです。

 全国のサイバー犯罪の検挙数は少しずつ下がってきていますが、それに対し相談件数は右肩上がりで、石川県内でも同様です。世の中が便利になった分、サイバー犯罪も進化をしているというところです。

 東京オリンピックが開催される2020念には約250億個ものデバイスが接続されます。ですが、組込みデバイスは10年遅れのセキュリティレベルとなってしまうかもしれません(数が多い上に長期間使用され、ハードとソフトが一体になっているなど、セキュリティ機能を向上させるのにはあまり向いていない性質があるため)。

 冷蔵庫やテレビから迷惑メールが送られてきたり、防犯カメラを利用したDDoS攻撃(Mirai)、IoTの攻撃も活発になっています。ちなみに、Miraiの開発者は日本人で、開発者の特定を困難にするためにあえてソースコードを公開したのではないか、という推測がなされているそうです。石川県内では、スマートTVの感染事案が発生しています。

 これから予想されるサイバー犯罪は、工場やビルの乗っ取り、警報装置の機能をOFFにする、自動車の事故誘発や病院を乗っ取り殺人、などが挙げられます。

 警察の視点からすると、捜査上の課題がいくつもあります。IoTデバイスなどの動作不良として処理されたり、新しい技術が出るとそれに対応しなければなりません。

 紹介した例はあくまで一例に過ぎず、予想を超えた犯罪がこれから発生するかもしれません。サイバー犯罪に関することで相談がある場合は石川県警の方に専用の窓口がありますので、電話やメールでご相談ください。緊急を要するものに関しては110番だそうです。

 

 ちょっと「上手いな」と思ってしまったのが、Miraiのソースコードの公開です。本当かどうかは分かりませんが、ソースコードの公開でMiraiの開発者の特定を困難にさせるというのが上手いやり方だと思いました。そこでたくさんの派生というか亜種が生まれれば、派生元を特定するのも難しくなりますし、その間にも新しい亜種も生まれるとなると…考えただけでも気の遠くなるような感じがします。

 

 1日目の講義は以上となります。ここからは2日目の専門講座となります。

 

『BareMetalで遊ぶRaspberry Pi ~入門編~ 』(講師:西永 俊文さん)

 2日目の最初の講義として、セキュリティキャンプ講師の西永俊文さんに講義して頂きました。

 まずはBareMetalとは何かということ、コンピュータ構成の基礎について学びます。BareMetalとはOSなどの入っていないコンピュータのことで、その間境界での開発をBareMetalをいいます。今回の目的は、BareMetal開発でLEDをチカチカと点灯させること(Lチカ)をすることです。

 コンピュータのハードウェア構成は入力装置、出力装置、中央演算処理装置、主記憶装置、補助記憶装置の主に5つに分けられ、それらの上でソフトウェアが動作しています。

 しかし、ソフトウェアを作成するときに書くソースコードのようなものは直接動作せず、そのソースコードコンパイルしてリンクして…と、色々な過程を経てようやくCPUが理解できるようになります。

 コンパイルもリンクも、ただgccのようなコマンドだけで終わるわけではなく、開発先の環境に合わせたツール群が必要になります。そして、開発先のハードウェア構成も考慮してプログラムを作成しなければなりません。CPUのレジスタ構成や、関数呼び出し規約、スタックやセグメントなどの考え方もここで使われます。

 演習ではCのプログラムを書いて、実際にLチカをしてみます。Raspberry PiのGPIOに接続されたLEDを点灯させるという、一見して簡単な事ように見えます。RaspbianなどOSが予めインストールされたRaspberry Pi上では、コマンドを少し打つだけでLチカができます。しかしBareMetal環境下では、GPIOの制御レジスタの値を変更しなければならず、そのためにはメモリマッピングを把握した上でビット演算を行う必要があります。そのためのCのソースコードを見ましたが、なんとなくは分かるものの実際のレジスタの値をセットしろと言われると計算が難しくて大変でした。

 Lチカが無事成功し、発展課題としてスイッチとプログラムを連携してLEDを制御できるか、と言うのがありましたが、うまくいかず時間となりました。やっぱり、普段からビット演算に慣れ親しんでいない上にハードウェアに密接なプログラミングをあまりしていないと、すぐにはコードを書けませんでした。コードを書けたとしても、「動く」コードとは限らないのが、実力不足を痛感させられたところです。

 普段なかなかしないようなアセンブリコードを読んだり、Makefileを編集したり、リンカスクリプトを読んでみたり…これがコンピュータを動かすために必要なことなんだと考えると、普通のパソコンやスマホのようなコンピュータはどれだけの構成を備えているのだろうと思います。

 しかも、その上でOSとして機能し、利用者が新たにプログラムを作成したり、それらを効率よく開発できるためにされた仕組みや工夫があるということは、OSというものは改めて凄いものなんだな、と実感させられます。WindowsLinuxソースコードは一体どのようになっているのか…膨大な量のソースコードを開発しているなんて、もう凄いとしか言えません。だからこそ、そのソースコードが気になります。OSの中身を勉強したいと思う気持ちがさらに強くなりました!

 

 二日目はお昼御飯を講師の方と一緒に食べます。美味しかったです。

f:id:HappyNote3966:20161226172537j:plain

 お腹も満足したところで、ミニキャンプ最後の講義です。

 

『AVRマイコンで作るBadUSB自作』(講師:竹迫 良範さん)

 続いての講義として、セキュリティキャンプ講師の竹迫良範さんに講義して頂きました。

 最初に見せてくださったのはマインスイーパの自動化です。PerlGUIを操作し、確率などを計算してゲームクリアをしてくれるというものです。なんというか、色々と圧倒されました。

 しかしこのアプリを開発している際にバグがあると、自分でコントロールすることができず、再起動するぐらいしか方法がありません。

 悪意のある似たようなものでBadUSBというのがあります。BadUSBとは、BlackHt USA 2014で公開されたもので、USBメモリをUSBキーボードとして認識させることができる技術で、USBに差し込んだだけで意図しない自動キー操作が可能となるものです。今回はそのBadUSBをAVRマイコンで作るというものです。

 BadUSBを作るのに必要な部品はいくつかありますが、その本体だけであればそれほど値段がかからずに作れるというから驚きです。

 まずはAVR開発環境のインストールを行います。(※Windowsの人限定かもしれませんが、もしかしたらこの時に環境変数が壊れるかもしれません。僕とキャンプに参加した友人二人は同じ現象が起きていました。ちなみに当時はBadUSBを作るのが楽しすぎて気づいていません)

 環境の構築が終わったら、今度はマイコンやその他ピン接続などの配線を行います。PS/2コネクタの穴に挿すのはそれ専用のコネクタであるのが普通ですが、ブレッドボードで使うようなジャンパーワイヤーを挿すのはとても新鮮味がありました。ちなみに配線を間違えると煙が出るそうです。正しく配線しなければならないのですが、煙が出る瞬間も見てみたい…

f:id:HappyNote3966:20161226172544j:plain

f:id:HappyNote3966:20161226172547j:plain

f:id:HappyNote3966:20161226172541j:plain

f:id:HappyNote3966:20161226172538j:plain

 あとはAVRライタに接続し、AVRマイコンにプログラムを書き込みます。書き込んだ後はPCに接続してメモ帳を開いてみます。すると「abcdefgh」が繰り返して入力されていました。マイコンで文字入力ができてしまいました。

 そして今度は、オリジナルのBadUSBを作る為、キーボードのスキャンコード表を参考にしながら自分なりの面白動作をするように改造します。参加者の中には画面を回転させたり寿司の絵文字を打ち続けたりとするものもありました。ちなみに僕はWin+Dキーでウィンドウを全て最小化⇔元に戻す、というのを作りました。

 

 自分だけの動作をするBadUSBを作るのは楽しくて、どんなキーコードにしてやろうかなとかどんなキーコードを書けば攻撃に繋がるか…とか考えることができました。ショートカットキーは覚えるに越したことは無いみたいです。そしてこれを作業の自動化にも使えそうなので、AVRライタを手に入れたら試してみたいと思います。

 マイコンの中身を詳しく知ることは時間の都合上できませんでしたが、ミニミニCPUを使いこなして何か作りたいとも思いました。そのためにもAVRマイコンの仕様書を読むということをしてみて、一個50円で売られているものがどれだけの時間をかけられてる作られているかを調べたいです。そして、ハードウェアも使いようによっては何にでも化けるんだというのが率直な感想です。ハードウェアって面白いですね!

 

 というわけで、2日間のミニキャンプはとっても楽しかったです。楽しかった上に、勉強にもなってとてもいい時間を過ごせました。理解できたところもあればそうでないところもあったけど、それが学習意欲を引き立ててくれている気がします。低レイヤーやバイナリに強くなって、それを他の人にも教えられたらいいなと思います。

 講師の丹さん、辻さん、高江さん、Razvanさん、西永さん、竹迫さん、そして参加者や関係者の皆様、貴重な経験をありがとうございました!来年も是非北陸へお越しください!

 

 ここからはまとめ&お土産紹介です。まずはミニキャンプ北陸の関係Tweetまとめとハイライトです。

 

togetter.com

 

www.youtube.com

 

 お土産です。まずは竹迫さんから演習でもらったBadUSBのキット。スイッチは西永さんに頂きました。

f:id:HappyNote3966:20161226172553j:plain

 お次はステッカーです。TomoriNaoステッカーは、友利奈緒さんに頂きました。

f:id:HappyNote3966:20161226172729j:plain

 最後に講義資料として使われた『IoT開発におけるセキュリティ設計の手引き』やそのスライド資料です。

f:id:HappyNote3966:20161226172556j:plain

 BadUSBはArduinoを購入すればライタとして使えると聞いて、購入を検討中です。あとRaspberry Pi 3が欲しくてこの前ポチりました。少しずつハードが増えていきます…ハードに興味の無かった昔に比べていろんなことに興味を持てたのも、キャンプに参加してからです。本当にキャンプに参加できてよかったなぁと思います。講義からお土産まで、ありがとうございました!

 (ミニ)キャンプに参加してみたいと思った人、是非参加してみてくださいね!

CTF for ビギナーズ in 金沢 参加記 + Write-Upもどき

 2016/11/26(土)、金沢工業大学でCTF for ビギナーズ in 金沢が開催されました。

今回はその体験記とそこで行ったCTF演習のWrite-Upを書いていきます。

f:id:HappyNote3966:20161128005011j:plain

CTF界隈でプロの人がこの目印をよくブログやTwitterに上げてるのを思い出して、自分もやろうとパシャリ。

 CTFの競技自体は学内やセキュリティキャンプ全国大会で体験してはいたけど、公式の大会に参加するのは初めてです。

 会場内では、ネットワーク周りの配線が行われていたり、運営の方があちらこちらに動き回ったり…着々と準備が進んでいました。

f:id:HappyNote3966:20161128005051j:plain

参加者も集まってきて、プロの気配も感じ取れました。

「ビギナーズ」と書かれていても、最後にCTFで競い合うことを考えると少し緊張してしまいます。

当日のスケジュールはこんな感じでした↓

  1. 開演、オリエンテーション
  2. Web講義
  3. フォレンジック講義
  4. リバースエンジニアリング、バイナリ講義
  5. CTFオリエンテーション
  6. CTF演習と答え合わせ

詳細なスケジュールはこちらをご覧下さい

2016.seccon.jp

 協賛企業は以下の通りです。他にもいろいろな方々のおかげでこのようなイベントに参加することができました。ありがとうございます! 

f:id:HappyNote3966:20161128012024j:plain

(キャンプの時もそうだったけど、有名な企業ばかりだからすごい…)

 

 私もPCのセットアップをしようとしたら、「会場内の電源タップには限りがある」とのこと。どうやら参加者に送信されたメールには「電源タップを持ってきてね」とあったらしい。完全に忘れてました。すみません。

なのでCTF for ビギナーズに参加する人は電源タップも忘れずに。

そういえば電源タップにはSECCONのシールが貼ってありました。こういう細かいところが好きです。あとSECCONシール欲しいです。

f:id:HappyNote3966:20161128005158j:plain

 

 準備が終わると、いよいよ講義が始まります。

 

オリエンテーション

 最初はオリエンテーションです。ここでは主に倫理面に関してを学びます。要点だけをまとめさせていただくと、こんな感じです。

  • CTFで行うような攻撃は、許可されたネットワーク上やサーバに対してのみ行うこと
  • それ以外のネットワークやサーバなどに対して攻撃を行うのはダメ
  • 善意の行動でも攻撃はダメ

 技術的な側面だけから見れば倫理的な部分は疎かになりがちですが、倫理面でも優れたハッカーになるべきだと思います。

 

Web講義

 続いてはWebについてです。CTF for ビギナーズリーダーのれっくすさんより講義をしていただきました。こちらもまとめさせていただきました。

 最近はWeb系の勉強を中心にやっていたので、躓くことなく演習をすることができました。SQLインジェクションは特に学んでおいてよかったと思います。パスワードなどを入力させるところでは、SQLインジェクションが成立する可能性があるので、CTFの際に使える攻撃の幅も広がりました。

 ディレクトリトラバーサルの攻撃は、好きなファイルにアクセスできるところまでは良いのですが、Linuxディレクトリ構造や設定ファイルの場所など、ある程度重要な情報が格納された場所を知らないといけないと思いました。定番の/etc/passwdや/etc/apache2/apache2.confは思い出せたけど、他のファイルの場所も覚えられたら攻撃の幅が広がるはずなのになー。

 

フォレンジック講義

お次はフォレンジックです。CTF for ビギナーズのメンバーであるバッタさんより講義をして頂きました。こちらもまとめさせていただきます。

  • フォレンジックスとは、ログや記録・状態などを詳細に調査し、痕跡や攻撃手法を解明することをいう
  • 今回はネットワークを中心としたフォレンジックを行った
  • HTTP,パケット、IPアドレス、ポート番号などの知識が必要
  • Wiresharkというネットワークの通信を解析できるツールで、パケットの中身を詳細に確認できる上、解析に便利な機能がたくさんある
  • パケットを読む際にはシナリオを意識し、通信の行われる状況を想像しながらやるのが重要
  • パーセントエンコーディングBASE64など、フラグなどの情報がエンコードされていることもある
  • 謎のファイルを調査するフローは、①ファイル形式の特定→②メタ情報の特定→③データ内容の特定
  • ファイル調査に必要なツールはたくさんあり、binwalk、ExifTool、The Sleuth Kitなどを扱えると便利

 フォレンジックは殆どやったことが無く、CTFの問題でも一番後回しにしていたジャンルでした。とにかく与えられるファイルが謎すぎて何もできなかったので、今回のツールの存在は大きかったと思います。ツールを使えることが前提の分野であるように感じました。

 stringsコマンドやfileコマンドを使うのはなんとなーく想像がつくのですが、それ以上のことが分からないことが多かったのが、今回ツールについて学んだことでフォレンジックに対する理解が深まりました。ツールでなくともLinuxのコマンドでも他に便利なものがあると知れて良かったです。

 少し気になったのが、ファイルシステムについてです。今回のフォレンジックの講義では、ファイルシステムの中に削除されたファイルがあり、その中身を読みだせるというのがありました。ファイルを削除してもデータが残るというのが興味深く、今後この辺について勉強してみよう。

 

リバースエンジニアリング・バイナリ講義

 最後の講義はリバースエンジニアリング・バイナリです。CTF for ビギナーズメンバーであるhytさんより講義をして頂きました。こちらもまとめました。

  • ReversingはPEとELFという実行ファイル形式を解析したり、スクリプトや謎ファイルも解析する
  • CPUとレジスタ、メモリの理解が必要
  • レジスタにはEAX,ESP,EBPなど様々な役割を持ったレジスタがある
  • メモリマップには機械語を格納するtextセクションやスタックなどがある
  • x86アセンブリには、代入命令、算術演算命令(四則演算など)、論理演算命令、分岐命令などがある
  • 関数を呼ぶ際にはスタック上に引数を積んでおき、call命令で呼び出した先の関数内で引数を取り出す
  • 解析プログラムにはobjdumpやIDA demo / Pro Freeがあるので、有効に活用すべし
  • リバースエンジニアリング、バイナリの上達のコツは、仕組みについて理解することと、たくさん読むこと

 バイナリ系のことについては勉強していたこともあり、理解できないところはなかったので良かったです。でもアセンブリ命令列を見てすぐさま実行内容を把握できるほど読み慣れてはいないので、今後たくさん読んでいく必要はありそうです。

 Linux上でバイナリ解析をする際にobjdumpを使いこなさなけばならないとも思いました。IDAのようなGUIベースのツールもいいのですが、GUIが使えない状況下も想定して、解析を早くできるようにしなければ。ここでもたくさん経験して慣れることが大切なのでしょうね。

 objdumpで実行してみても、本来の解析目的とは関係のないアセンブラがたくさん羅列されていました。今回は解析の範囲を指定されていたので難しくはなかったのですが、実際のCTFではその範囲も自分で考えなければならないので、必要な範囲とそうでない範囲を見極められるように頑張ります。

 

CTFオリエンテーション&CTF演習

 いよいよ戦いが始まります。時間は約80分程度、その中で以下の問題を解いていきます。フラグは共通してctf4b{(フラグの文字列)}となっています。

 

f:id:HappyNote3966:20161127221401p:plain

 

 ここからはWrite-Upとなりますが、解法が違っていたり、フラグの詳細な内容、画像があったりなかったりとクオリティの低いものとなります。完璧なWrite-Upは探せば出てきますので、気になる方はそちらの方へどうぞ。

 

今回解けた問題は以下の通りです。

  • [Misc] Warmup 10
  • [Misc] てけいさん for ビギナーズ 200
  • [Web] Fix it 100
  • [Web] Login as Admin 200
  • [Forensics] FileSystem 100
  • [Forensics] みてみよう 200
  • [Forensics] ICMP? 200
  • [Reversing] Welcome Reversing World! 100
  • [Reversing] Lecture Review 200

 順番にWrite-Upしていきます。

 

[Misc] Warmup 10

 フラグの送信ができるかどうかの確認問題のようなものです。問題文にはフラグが記載されており、コピペして送信するだけで終わりです。本当にそれだけなのですが、中にはフラグを送信できないという方もいらっしゃったので、ちゃんと正常にフラグが送信できるか確認しましょう。

 

[Misc] てけいさん for ビギナーズ 200

 Webページ上に計算式とその答えを入力するフォームがあるので、100問連続でその計算を行うえばフラグがもらえるという問題です。当然100問連続で手計算を行わない方法が正しいのですが、考えるのをやめて100問連続で手計算しました。運営側の想定解はPythonスクリプトを組み、自動化させるというものでした。

 最初はPOSTメソッドで何か送信されているのかなーとか思ってFiddlerを使ってみたのですが、送信されているパラメータの中に問題数を管理するような値が見つからず、「???」となっていました。この問題でプログラムをサクッと書けるような力が必要なのだと思い知らされました。今のままだとプログラムを作って自動化させるより手計算でやったほうが早いので、プログラミングも練習しないと…

 

[Web] Fix it 100

 たしかページにアクセスすると「このページはリダイレクトされるはずなのにされてない、さぁ直してくれ」といったニュアンスの文がありました。リダイレクトに関しては講義の時間にChromeの機能を使って遷移先を見ることができるのを覚えていたので、早速ヘッダを見ることに。

 Ctrl+Shift+Iキーを押してヘッダの情報を見てみると、遷移すべきページのURLが載っていたのでそこへアクセス。アクセス先にはフラグが表示されていました。

 

[Web] Login as Admin 200

 ユーザ名とパスワードを入力するフォームがあるだけのページでフラグを探せという問題です。ここは講義してもらったSQLインジェクションを使うところだと思ったので、以下のクエリをパスワード入力欄に書きました。 

A' OR 'A' = 'A';--

 セミコロンはSQL文を実行するため、SQL文の区切りを示しているものです。

 --はSQLのコメントに相当するもので、入力されているSQL文によって全体のSQL文の構造がおかしくなってしまうのを無理矢理打ち消しているものです。

 これでAdminでログインできたので、フラグが表示されました。

 

[Forensics] FileSystem 100

 for100という拡張子のついていない謎のファイルを与えられるので、まずはfileコマンドで調べてみます。

file for100

 

f:id:HappyNote3966:20161127221402p:plain

 .fatや、FATという文字が確認できます。つまりこのファイルがファイルシステムだと確認できます。なので今度は、このファイルシステムの中身をThe Sleuth Kitのコマンドであるflsで調べてみます。

fls for100

f:id:HappyNote3966:20161127221404p:plain

 すると、.flag.txt.swpというファイルが削除されていることが分かります(各行の数字の前についているアスタリスクは削除されたという意味)

 このファイルの中を見たいので、同じくThe Sleuth Kitのicatコマンドを使って表示してみます。.flag.txt.swpは6番目にあるらしいので、6番目を指定する数字も一緒に入力します。

icat for100 6

f:id:HappyNote3966:20161127222117p:plain

 するとctf4b{}で囲まれた文字列が出てきました。

ctf4b{ff97e486da08bfec774688ca3ef6ac42}
[Forensics] みてみよう 200

 for200という謎のファイルを与えられるので、まずはfileコマンドで中身を見てみます。 

file for200

f:id:HappyNote3966:20161127223604p:plain

 tcpdump capture fileとあります。つまりパケットのデータがキャプチャされたファイルですね。これをWiresharkで開いてみます。

f:id:HappyNote3966:20161127223819p:plain

 ICMPパケットの中にHTTPでやりとりしている部分があります。その中を見るとGETメソッドでflag.pngという画像をやりとりしていることが分かります。

 なのでFile→Export Objects→HTTP...を選びます。

f:id:HappyNote3966:20161127223605p:plain

 さっそくこのflag.pngを取り出して画像の中身を見てみたのですが、ただの真っ白な画像でした。どうやら調査が足りないらしいです。なのでこのflag.pngの詳しい中身を調べます。講義で習ったExifToolを使ってみましょう。

exiftool flag.png

 

f:id:HappyNote3966:20161127223609p:plain

 するとKeywordsの値がフラグになっていることが分かります。

ctf4b{f970e2767d0cfe75876ea857f92e319b}
[Forensics] ICMP? 200

 for200-2という謎ファイルを渡されるので、まずはfileコマンドで調査してみます。

file 200-2

f:id:HappyNote3966:20161127225509p:plain

 さきほどの問題と同じく、tcpdump capture fileであることが分かります。なのでWiresharkで見てみます。

 しかし中身はICMPのパケットしかなく、先程のようにHTTPでやり取りされている部分はありません。なので、フラグがこのICMPのパケットの中に隠されてるものだと仮定し、その格納しているパケットを探すことにします。その方法は、パケットの大きさで探す方法です。Lengthタブをクリックし、パケットサイズの一番大きいものを見つけます。すると、Lengthが352のパケットを発見しました。

f:id:HappyNote3966:20161127225511p:plain

 このパケットの中にはHTTPでやり取りされた旨のデータが入っていました。一番下の近くにあるデータはtext/plainと書いてあるので、テキストデータであることが分かります。また、"Y3"から始まる不思議な文字列がBASE64でデコードされていると思ったので、このデータを取り出します。

Wiresharkから直接それをコピペしたかったのですが、方法が分からずstringsコマンドに頼ることに。

strings for200-2

f:id:HappyNote3966:20161127225513p:plain

 stringsコマンドでBASE64エンコードされたと思われる文字列を発見し、コピーします。その後、この文字列をBASE64でデコードします。

echo 'Y3RmNGJ7NTM2ZGFjMzcxYWE2NTJmODY1YzIwYWJlN2I0MDk0ZGJ9' | base64 -d

f:id:HappyNote3966:20161127225514p:plain

 するとフラグが出てきました。

ctf4b{536dac371aa652f865c20abe7b4094db}
 [Reversing] Welcome Reversing World! 100

 bin100というファイルが与えられるので、fileコマンドで調べてみます。

file bin100

f:id:HappyNote3966:20161127231114p:plain

 ELF 32-bit LSB Executableと書かれているので、このファイルが実行形式であることが分かります。(いや、[Reversing]と書いてあるんですが念のためです)

 ただこのままだと実行できないので、このbin100を実行できるようにします。

chmod 777 bin100

f:id:HappyNote3966:20161127231116p:plain

 これで準備が整ったので、さっそく実行してみようと思います。余談ですが、CPAW CTFの序盤で、ELFの実行方法が分からずに悩んでいたことがあります。./を付けないと動かないなんて、当時は知る由もありませんでした。

./bin100

f:id:HappyNote3966:20161127231118p:plain

 実行できたのは良いのですが、Enjoy CTF!と表示されるだけでした。なので、このファイル全体に何かフラグが隠されていないかstringsコマンドで調べてみます。

strings bin100

f:id:HappyNote3966:20161127231119p:plain

 すると、フラグの文字列が現れました。

ctf4b{57r1n65_c0mm4nd_f1nd_fl46}
 [Reversing] Lecture Review 200

 bin200_1というファイルからeaxの値を求めて、その値をフラグとして送信しなさいというものでした。なので、まずobjdumpコマンドを使ってアセンブラを見てみます。

 

f:id:HappyNote3966:20161127233427p:plain

 main関数の中身です。この中を見てみると、calc関数が呼び出されていることが分かります。

f:id:HappyNote3966:20161127233429p:plain

 このcalc関数では色々な計算が行われた後にmain関数に制御を戻します。

 他の分野に時間をかけすぎて焦っていたので、素直にアセンブラを読むことはあきらめました(すみません)

 gdbを使って一気に解決したいと思います。chmod 777 bin200_1を実行した前提で進めます。

gdb -q bin200_1

f:id:HappyNote3966:20161127234509p:plain

 

まずはmain関数を見てみます。

disas main

f:id:HappyNote3966:20161127233432p:plain

 calc関数が呼ばれているようなので、同じようにして見てみます。  

disas calc

f:id:HappyNote3966:20161127233434p:plain

 このcalc関数が返ってきたところのeaxレジスタの値が知りたいので、ブレークポイントを仕掛けます。仕掛ける場所は、main関数内の、calc関数が実行された直後のアドレスです。

b *0x08048441

f:id:HappyNote3966:20161127233436p:plain

 仕掛け終わったら実行してみます。

run

f:id:HappyNote3966:20161127233439p:plain

 eaxレジスタの値が0xffffffe5になっています。この値を10進数に変換すると、-27になります。

ctf4b{-27}

 以上がWrite-Upになります。

 

 結果は9位でした。まだまだ勉強する必要がありますね。

(画面汚くてすみません)

f:id:HappyNote3966:20161128005528j:plain

 ちなみに全完を成し遂げた方もいました。プロとしか言いようがない…

 

 お土産に本とステッカーを頂きました。

f:id:HappyNote3966:20161128005703j:plain

f:id:HappyNote3966:20161128005636j:plain

 

感想

 初めて参加したCTFの競技は上位に食い込めるかすら心配でしたが、1桁台に入ることができて嬉しかったです。まだまだ勉強が必要だとしても、Linuxコマンドをまともに扱えなかったキャンプ参加時に比べて成長できたのではないかなと思います。

 また、Write-Upなるものを初めて書いたことで、解法を自分の頭の中で整理することができました。また何かのWrite-Upも書いてみたいです。それとWrite-Upを書く際に問題のページやデータなどはしっかりと保存しておくべきでした。最初の方は問題を解くのに必死で…(;´・ω・)

 心の余裕ができるぐらいにレベルを上げていきたいです。

 

 CTF for ビギナーズに参加できて、モチベーションが上がりました。人と競い合う良い機会を体験できてよかったです。運営やスタッフの皆さん、参加者の皆さん、お疲れ様でした&ありがとうございました!また金沢来てください!

セキュリティキャンプ全国大会2016 参加記録(+東京観光)

 セキュリティキャンプ全国大会2016に参加してきました。

事前課題とかについてもなかなか触れられなかったので、この記事で一気に書いていきます。次回以降、参加する方の参考になれば幸いです。

 

~Day0 非公式前泊(東京観光)

 キャンプ参加が決まってからは、色々な事を済ませなければなりませんでした。TODOリストは以下の通りです。

  • 新幹線の切符購入
  • 様々な提出書類
  • 名刺作成
  • 宿泊道具の事前発送
  • 事前課題

 

新幹線の切符購入

 キャンプ日程は8/9~8/13となってましたが、お母さんと一緒に東京観光もしたかったので8/8東京行きの切符を購入しました。日程がお盆と重なることもあって、新幹線の切符購入は購入可能日にすぐに買いに行きました。(その時活きたのが、切符購入は乗車日の一か月前から購入可能だという知識。知識は多いに越したことは無いなぁ)

 バイトとか学友会とかプロジェクトとかとかとか…色々な予定が重なって、購入が難しいと思った切符に関してはお母さんに買ってもらいました。いつもお世話になってます。

 

様々な書類提出

 50人近くの学生を集めるので、何があってもおかしくないということもあり、キャンプ参加に先立って保険や保護者の同意を求める書類などが送られてきました。

 大学生にもなると、印鑑を押す書類が増えてきたなぁと、なんとなく大人への第一歩を踏み出している感覚に浸りながら処理していました。働いたらこんなことが増えるのかな?いやきっとうそうなんだろうなぁ。

 

名刺作成

 キャンプには参加者・チューター・講師・企業の方・その他関係者など、たくさんの人が集まります。田舎者の私としては、これ以上に人と関わる機会はない!と思って、名刺作成には力を入れました(入れたつもりでした)。

 直前まで忙しかったという言い訳をしながら、名刺が完成したのは東京へ出発する前日。100枚ぐらいあるといいよ!というIPAの方から伺ったので、150枚印刷しました。

 印刷した名刺はこんな感じです↓

f:id:HappyNote3966:20160815175509j:plain

 

 中学から高校まで小説を書いていて、その時のキャラクターを名刺にしました。絵は描けないので頼みましたが…(;´・ω・)

 名刺を作ってくれる業者に頼めばよかったのですが、ぎりぎりと言うこともあってWordで作成しpdf化してからコンビニで印刷することに。その時に余白の設定などを完璧にできなかったせいか白の部分が目立ってます。しかもそれを裁断機で切ったので、お世辞にもきれいな仕上がりとは言えません。

 次回からは絶対に業者に頼んでやる。そう思った次第です。くそぅ…(´;ω;`)

 

宿泊道具の事前発送

 4泊5日(+1)の日程だったため、着替えなどの準備が必要でした。しかしそれを当日に持っていくのでは荷物になりますし、折角の東京観光も楽しめない。ということで、会場のクロスウェーブ幕張へ事前に送ることにしました。

 その時に初めてクロネコヤマトの集荷を依頼しました。本当に指定した時間通りに来てくださって、荷物を持っていって下さいました。

 その時に、「伝票ありますか?」と聞かれて伝票が何か分からなかったのは内緒です。疲れてたんでしょうかね。

 

事前課題

 多分みなさんが気にするのはコレ。事前課題は、自分が選択した講義をよりスムーズにするために、予め課せられている課題です。といっても、講師・参加者共に忙しい為に、事前課題は必ずしも必須というわけではありませんでした。

 私の選択した講義も「事前課題が無いor事前課題(提出)は必須ではない」のどちらか大半でした。

 事前課題を余裕にこなすかたもいらっしゃいましたが、私は無理でした。はい。事前課題ですら躓くレベルで…ここで既に警鐘が鳴り響きます。

 後述しますが、事前課題はしっかりやってください。でないと、当日は何もできなくなります。いや、何もできなかったのは私ぐらいですかね。地の学力が十分ではなかったので。

 

東京へ出発!

 いよいよ新幹線に乗って出発です。東京に行くのはMOS学生世界大会表彰式(日本代表には選ばれなかったけど)以来で、今回はその時に回り切れなかったところに遊びに行く感じになりました。

 まずは原宿です。前回は夜にしか行けなかったために、ほとんどの店が閉まっている状態でした。その時の印象は、「なんだかクレープ屋が多いなぁ」って程度でした。でも今回は昼間から原宿に繰り出せるということで、楽しみでした。

 

f:id:HappyNote3966:20160815175522j:plain

 

 うわぁ!人がいっぱいだ―!活気に溢れすぎているー!Σ(・ω・ノ)ノ!

なんだか楽しそうな雰囲気の中、人込みを突き進むことに。夏真っ盛りで人込みのダブルパンチと言うことで、ものすごく暑かったです。

f:id:HappyNote3966:20160815184228j:plain

 人も多かったけど、やっぱりクレープ屋さんも多かった。

 すれ違う人も色んな服装をしていて、コスプレしてる人もまれに見かけました。そして私は初めてスカウトなるものを目撃しました。東京でスカウトって、やっぱり存在するんだなぁとか思ったり。ちなみにスカウトされていた人はコスプレしていましたが、クオリティが高すぎました。

 途中で、サンリオのキャラクターグッズが売っているお店に入りました。ぐでたまとマイメロディのグッズが欲しくてつい入ってしまった。そこではぐでたまのメモ帳やクリアファイル、マイメロディの端末防水袋(名称はよくわからない)を購入しました。

 ぐでたまはあのやる気のなさ加減が好きです。マイメロディはアニメを見て非常に癖になってしまいました。何度も笑わせてくれたマイメロディが私は好きです。

 <<<サンリオのお店に入ったらお母さんに「えー」って言われました>>>

 

 通りを進んでいき、道路を出たあたりにLINE FRIENDS(?)を発見したので、そこにも行ってみました。中は、LINEのキャラクターであるサニーとかたくさんいました。

f:id:HappyNote3966:20160815183546j:plain

f:id:HappyNote3966:20160815183544j:plain

f:id:HappyNote3966:20160815183548j:plain

 東京っていいなぁ。真新しくて面白そうなものがたくさんあるし、色々と不自由しないんだろうなぁ。都会は違うなぁ()

 そこで友達へのお土産を少し買いました。お母さんもいくつか買ってたような。普段お世話になっているトークアプリなのでここで少しのお礼をしました。

 

 少しそこで過ごしてから、時間もお昼を軽く過ぎたころもあり、気になっていたクレープを食べました。

f:id:HappyNote3966:20160815183550j:plain

(※ボケてますが気にしないでください)

 すごい、クレープの上にプリンが乗っている!なんてことだ!アニメでしか見たことなかったものが目の前に!大きくて甘そうなクレープを、おなかが減っている状態で食べたらとても美味しかったです。クレープまた食べたいです。あ、買ったクレープ屋さんはLINE FRIENDS前にありました。名前は忘れてしまいました。すみません。

 原宿は全体的にかわいらしいところでした。人混みの多いところは苦手ですが、たまにはこういうところも悪くないのかなぁと思って楽しんでました。また行きたいですね。今度は原宿のいろんなお店も見て回りたいです。

 

 次は新宿です。南口NEWoManにある800° DEGREESというピザのお店に行きました。ここはお母さんの希望で、なんでもピザを自らセレクトして焼いてくれるのだとか。ピザ生地からトッピングまで全て自分好みにできます。

 幼い頃、地元の宅配ピザ屋さんがやっていたパイナップルのピザが好きでしたが、不人気だったのかいつのまにかメニューから消えていました。それ以来、パイナップルの乗っているピザと言うものが食べたくて仕方なかったので、迷うことなくトッピングに追加しました。

f:id:HappyNote3966:20160815183552j:plain

 とってもおいしそう!本格窯焼きピザなんてそう簡単に食べられるものではないので、感謝の気持ちを込めながらいただきます。

 ピザの上に載っているパイナップルが、口の中を潤してくれるのがまたいいですね。都会はちg(ry

 

 ピザも食べて満足したところで、今度は新宿西口近くのビックカメラにお邪魔しました。

f:id:HappyNote3966:20160815183558j:plain

 あらかわいい。

 ここではお母さんが足のマッサージ器を探していました。前回の東京旅行では気に入ったものが見つからなかったらしく、再度探したいとのこと。

 私はと言うと、まだそんな年齢じゃないので本に興味津々。”サイバーセキュリティテスト完全ガイド”を購入しました。

 

サイバーセキュリティテスト完全ガイド ~Kali Linuxによるペネトレーションテスト~

サイバーセキュリティテスト完全ガイド ~Kali Linuxによるペネトレーションテスト~

 

  キャンプの講師の方の中にこの本の関係者の方がいるので、思わず購入。サイン貰うつもり満々です。

 余談ですが、そこにインサイドWindows第6版[上]がありました。買いたかったけど、電子書籍を持っているので断念。出版社に問い合わせても手に入らないと言われて諦めていたときに、こういうところで見つけるとすごくがっかりします。やっぱり品ぞろえが違いすぎますね。いいなぁ、都会はt(ry

 あ、お母さんは結局気に入ったものを見つけられなかったようです。結構購入するか悩んでたとこまで行ってたんですがね。私は当分いらないかなぁと思いました。マッサージ器を使っていると体が痛くなったので。

 

 周りが暗くなり始めたころ、Tokyo Dome CityのTeNQに行ってきました。ここのプロジェクターが素晴らしいということで、中を見て回ることに。

f:id:HappyNote3966:20160815183556j:plain

 宇宙に関係するものがたくさんありましたね。面白い。

 ここで気になったのが、宇宙食というもの。テレビで見たことはあったけど、直接見るのは初めて。後で載せますが、なんだか宇宙食っぽい。

 もちろん、ここのシアターも見てきましたよ!

 

f:id:HappyNote3966:20160815183602j:plain

f:id:HappyNote3966:20160815183611j:plain

  

 シアターはすごかったですね。迫力満点。中に東京大学の研究室もあったりと、ここは面白いところだと感心していました。VR,AR,プロジェクションマッピングとかに興味のある友達にこのことを教えるつもりです。

 

 東京観光も終わり、ようやくホテルへ。クロスウェーブ幕張近くにあったところにチェックイン。東京駅で買ってきたおいしそうなものや宇宙食などを食べました。

f:id:HappyNote3966:20160815200132j:plain

f:id:HappyNote3966:20160815200135j:plain

 上は宇宙食。下は千疋屋のデザートです。

 f:id:HappyNote3966:20160815183623j:plain

f:id:HappyNote3966:20160815183626j:plain

 宇宙食の中身はこんな感じでした。フリーズドライ製法とかで、水分を飛ばしているらしい。なんというか、変わった味でした。一度は体験したいものだったので満足です。食べて思ったのは、やっぱり地上でそのものを食べたいってことですかね。

 千疋屋のデザートはおいしかったですね。その時に感動したのがスプーンの形状でした。四角い入れ物の中でも余すことなく食べることができるというのが感心させられました。あれはまた食べたいです。スプーンの形状について感動を周りに教えたいです(?)

 そういえば東京に来て芸能人を見かけることはできませんでした。一度くらいはチャンスあるかなとか思ったのですが。

 Day0の戦利品は以下のようになります。

f:id:HappyNote3966:20160815183631j:plain

 

Day1 東京観光+セキュリティ基礎+特別講演+チューター成果報告+グループワーク(1)

 ホテルをチェックアウトした後は、海浜幕張駅まで移動し、近くのイオンで時間を過ごしていました。そこで似顔絵を描く方を見つけたので、物珍しさに思わずお願いを地元じゃなかなかそういうのはないですからね。。内藤美奈子さんと言う方がお母さんと私の絵を描いてくださいました。似顔絵は流石に載せられないのですが、とても良いものを描いてくださいました。

 11時頃になり、そろそろということで、お母さんとはここで解散。

その時、「たくさん挫折してきなさい」と言われました。うーん、挫折はなるべくしたくなかったんだけど、多分キャンパーは圧倒的能力を保持していること間違いなしなので、何回かは挫折するだろうなぁとか思っていました。

 (この後お母さんはもう一度800° DEGREESに向かい、ピザを食べましたとさ)

 

 さて、ここからが本番です。↑までただの旅行記ですね。

f:id:HappyNote3966:20160815201910j:plain

 いよいよ会場に到着しました。ここに来て、本当にキャンプに参加するんだなと期待と不安で感情がオーバーフローしそうでした。

  会場内では既に名刺交換が始まっており、後れを取るまいと私も名刺を積極的に交換していきました。予め決められていた自分の席には大量のアメニティと講義資料、そして貸し出しされるPCがありました。

 もらったものに関しては後でお見せします。

 とにかく、名刺交換をしていく中で気づいたのは、そもそもの学力的な差ややってきていることのレベルの違いです。自分より年下の方もいれば、未踏クリエイターになった人、通っている学校がレベルが高いところだったりと…一言で言えば場違いな気がしたのです。この時はまだ、めげずに名刺を配り続けることはできましたが、心の内ではこの五日間が大丈夫なのかどうか心配になってきました。もう、圧倒されそうで胸が痛い。

 それとは別に、事前でTwitterで絡んだ人が現実に会うとイメージと全く違うことも分かりました。それは面白かったです。本名より、アカウント名で呼び合うことの方が多かったです。今後参加する方は、Twitterなどで絡んでおくとより親しみやすくなると思います。「はっぴーのーとさん」と呼ばれるのは何気に嬉しかったです。

 その後、開会式があり、とてもえらい方々のありがたいお言葉を頂きました。目の前にそういう方がいるかと思うと、なんだか不思議です。

 

 なおここからの話は、メモしてきたことが多いので(記憶容量の問題)、もしかしたら発言している人や内容が間違っているかもしれません。書いてはいけないことなど、間違っていたらご指摘ください。よろしくお願い致します。

 

セキュリティ基礎(講師:上野宣さん)

 まずはセキュリティについて上野宣さんが講義をして下さいました。この講義ではセキュリティの難しいところとは「何が問題か?」が分かる能力、つまり「問題発見能力」が重要になるということだそうです。

 その問題発見能力を養う練習として、キャンプの応募用紙提出システムにおける問題点をグループディスカッションすることになりました。

 分野がWeb系となっており、私は相槌を打ったりするしかありませんでした。しかもそこで発表者としてディスカッションのまとめをみんなの前で言わなければならないとなり、とにかくメモしまくって「それっぽいこと」を言いました。ああ、あの時チームのみんなには申し訳なかった。

 ディスカッションとかは学校で慣れていたつもりだったけど…根底にある知識が全く無かった。悔しい思いをしました。どっちかというとバイナリ系の人間なので、Web系はさっぱりなのです。バイナリ系でも何もできませんが。

 ディスカッションの後は、セキュリティ人材が足りないという話を伺い、上野さんが行ってきたDEFCONの話になりました。CGCというCTFの自動化に関する競技が行われていたことや、セキュリティ人材はいるにはいるんだけど、その大半はスキルが足りないということも伺いました。この二つの話から、現在はセキュリティ人材の不足が叫ばれているが、今後は脆弱性診断などが自動化され、時代が変わり人材不足などなくなるかもしれないともありました。

 現状で私達に求められていることは、セキュリティの研究・開発、人材育成、啓発活動、製品を導入すること、この四点についてです。特に啓発活動については、平易に伝える技術が必要だとおっしゃっていました。

 特にセキュリティの啓発活動についてとても共感しました。私は中学校でセキュリティの啓発講演をしてきたことがあります。また地頭が悪い分、分かりやすく解釈しないと覚えられない人間なので、今後は自分の身の回りだけでもセキュリティに関して啓発活動を行えたらいいなと思いました。

 

特別講演(1) ZENIGATAになりたくて(講師:福森大喜さん)

 第一線のエンジニアとして働く福森さんに「技術とは何か」について講演頂きました。技術と聞かれて想像するのは何かに対してのスキルだとか、能力だとかを意味すると思うのが普通ですが、福森さんの考える技術とは「手へんに支えると書く、つまり誰かを支えることができること」だそうです。

 福森さんは大学時代、それほどまわりより技術があったわけではなかったそうです。大学の課題としてFTPクライアントの作成をしていたとき、脆弱性があると指摘されたことをきっかけに文献などを漁っていたら自然とExploitができてShellも取っていたのだとか。現状の能力だけでは人を測ることはできず、努力次第で上に進むことができるのだと思いました。

 ちなみに、福森さんの意見では、バイナリ系をやっているひとはCTFで何でもできるようになる傾向があるそうです。私も頑張ってバイナリ系をやろう。

 他にも働いているときに出会った脆弱性についての話など、興味深い体験談をたくさん聞きました。

 

特別講演(2) サイバー犯罪の実態とこれに対処するための取り組み(講師:間仁田祐美さん)

 犯罪とは一体何かについて、間仁田さん(愛称:マニータさん)にお話を伺いました。

 現状はネットワーク利用犯罪の数が多く、詐欺などは一定レベルを保って数が多いそうです。ここでマニータさんは、人間が一番の脆弱性だと言っていました。言い換えればレイヤー8:人間だそうです。

 DD4BCと呼ばれる組織のDDoS攻撃や、法人メールの詐欺など、実例を交えてどんな犯罪があるかなどを教えて下さいました。圧縮ファイルやWordファイルなどによる標的型攻撃も増えてきているのだとか。特にWordファイルは気を付けた方がいいらしいです!

 マニータさんは、犯罪は「自分がやりたい欲求をすることで誰かが困るかどうか」が基準だとおっしゃいました。最終的には、誰と繋がるかが大切だとも仰っていました。私もこのセキュリティキャンプで得た人とのつながりを大切にしていきたいと思います。

 

チューター成果報告

 セキュリティキャンプ全国大会の修了者が自らのやってきた成果を発表するというものでした。詳しい内容は話せませんが、もうとにかくレベルが違いすぎました。同じ学生とは思えないほどのクオリティの高さと、レベルの高さを感じました。ただこれを見て絶望とか人権を喪失したとかはありませんでしたが、私も発表してくださったチューターのような事がしたいと強い憧れを持ちました。来年度のキャンプでチューターになれるよう勉強が早くしたい!と感化されました。

 ちなみに、あるチューターの方は勉強のうち9割の時間は読書に費やすのだとか。やっぱり読書は大切ですね。

 

グループワーク(1)

 同じチームのメンバーとある議題を決め、それについてディスカッションするというものです。提示されたお題は以下の4つです。

  • 未来:10年後のIT社会のセキュリティのあるべき姿
  • 倫理:こどもたちに正しくIT技術を身につけさせるために~ホワイトハッカーにするためには~
  • 対策:小規模企業(100人未満)におけるセキュリティ対策として何を行えばいいか
  • 回避:攻撃者に狙われない為に何をすればいいか

 自己紹介の後、この4つのテーマから1つを選び、さらにチーム名を決めることになりました。

 チーム名->めも帳(あいでぃーいー)

 テーマ->倫理

 教育という分野に興味があったので、倫理になってよかった。でも、チーム内でテーマを決める時に分かれてしまったから、いずれは他のテーマについても議論出来たら良いなと思っています。

 この後、キャンプの会場にいる人なら誰でもいいので、自分たちで質問を決めて聞いて来いとのこと。各担当講義の講師の方などに聞いてみることにして、Day1を終了しました。

 この時点で、22:00です。早く寝ないと翌日の講義に支障が出るため、アニメなどは見ずにお風呂に入って就寝。気づいたら24:00でした。みんなは他の人の部屋に行ったりしてたらしいおとなしく寝てたらしい。

 (地方だから深夜にアニメがやっているなんて感覚すら無かったのだ…(´;ω;`))

 

 そしてここからの講義内容はこんな感じになります。

これらを選んだ理由は前のエントリをご覧ください。全部書いてあります。

Day2 講義1・2+CTF

1-D Dissecting Malware - x86 Windows malware analysis - (講師:中津留勇さん)

 多分一番まともに受講できた講義です。もともとWindowsしか使わなかったので、Windowsマルウェア解析は興味がありました。ある程度練習していたこともあり、事前課題はなんとか終わらせることができましたが…本番の講義はもっとレベルが高く、ついて行くのがやっとでした。

 他の受講者のマルウェア解析手法で、IDAの使い方が上手い例として自分のやり方が取り上げられていたことが嬉しかったです。努力した甲斐がありました。人に褒められるととても嬉しいですね。でも他の人の方が見習うべきベストプラクティスだったので取り入れていきたいです。

 ちなみに、その手法とは、

  • とにかくコメントを付ける
  • 理解に基づいた名前を付ける
  • 定数を定数名に置き換える
  • 関数のまとまりだけでなくコードブロック単位でコメントする
  • 関数そのものにコメント、中身ではない
  • コードフローに色を付ける

といった感じです。

 また、最近のマルウェアのトレンドも伺いました。最近はばらまき型メール攻撃やマルバタイジングを介したランサムウェアが多いのだとか。ばらまき型メール攻撃による被害が急増している背景として、その文面が非常に完璧に近い日本語になってきているのだとか。昔の英語だけのメールや下手な日本語は通用しなかったのが、今では自然な日本語になっているらしいです。

 基礎知識として、PEファイルフォーマットや仮想メモリの仕組み、関数呼び出し規約やCOMインターフェースなどを知っておくと良いとのこと。

 今回の講義は中津留さんの前回の講義にパワーアップした感じで、主にパックと難読化について取り上げられていました。ちょうど私自身が躓いていた分野なので、受講してよかったと思いました。

 解析の前に注意事項があり、

  1. 全部のコードを読まず、効率的に読むこと
  2. IDAをうまく使いこなし、IDAが間違っていれば正すこと
  3. 解析自体は「目的」ではなく人に伝えて解決・報告するにはどうすればよいかを意識すること

 とありました。

 なお、講義資料は全て英語で、普段から作成する資料については英語にしているのだとか。そのやり方を見習ってこれから英語で書くことを始めてみようかと思いました。

 最後には持ってきた本のリバースエンジニアリングにサインを頂きました。サインも英語、カッコィィ!

2-A スマートフォン向けゲームのセキュリティ(講師:杉山俊春さん)

 一番最初に挫折を味わったのがこの講義。何故ならWeb系の知識が乏しかったからです。プロキシツールを使ったことはあっても、Fiddlerしか使ったことが無く、Burp Proxyを使うのが初めてだったというのも挫折の理由の一つです。

 まずBurpの起動で躓く。演習用PCには予めインストールされているはずなのに、どこにあるかが分からなくて聞いたら目の前にjarファイルとして存在していました。てっきり、アイコンがあるのかと思ったのに、恥ずかしかった。

 次に、Burpの使い方が分からなくて躓く。プロキシツールを設定するのは慣れないので、講師の方に教えてもらいながら進めて行きました。

 さらにさらに。PHPのコードが渡され、そこから特定の動作を実行させるためには何を入力させればいいかを指示されたのですが、それすらわからず…隣の参加者の方に教えてもらいました。多分みどりんごさんかな?本当に迷惑を掛けました…

 まぁ、失敗談ばかりじゃつまらないと思うので、座学の内容を。

 スマートフォン向けゲームのセキュリティ対策を行うにはゲームそのものの仕様を知らなければならず、対策はいたちごっこ。そしてチートは課金利益が損失するなどしてゲームの寿命を著しく縮めてしまうのだとか。チートユーザーは巧妙な人になると発見が難しく、BANをすることが難しいらしく、損失が少ないのであれば無視するという手法もやむを得ない場合があるそうです。

 具体的なセキュリティの対策は、リクエストとレスポンスの内容を改ざんできないようにすること、メモリ改ざんやデータファイル・アプリ自体の改ざん防止など、様々な手法が挙げられました。今回はhttpを用いましたが、独自のプロトコルによる通信も増えており、なかなか難しいのだとか。

 総じて、対策が容易なものから困難なものまで多種多様に渡るため、BANした方が早い場合もあれば、対策を取ったほうが良い場合もある、つまりバランスが大切になるそうです。

 あとサイン貰いたかったんですが…すみません、時間が無くてもらえませんでした。またどこかでお会いしたらサインください( ;∀;)

 

CTF

 結構な不安要素だったのがこれです。何せ初心者向けの常設CTFの一番最初ぐらいしか解けないので、不安でした。

 会場に向かうと、チーム名が書かれたボードが設置されていました。

f:id:HappyNote3966:20160815183628j:plain

 いいですねぇ。気に入ってます。

 問題形式は常設CTFやSECCONのような形式とは異なり、全ての形式を混ぜ込んだ感じだから名称募集中なのだとか。ちなみにその形式は、

  • Jeopardy形式:一問一答する感じ
  • Attack and Defence形式:自分のサーバーを持って攻撃と防御を行う感じ
  • King of the Hill形式:一台のサーバーに向かって各チームが攻撃を行う感じ

をミックスしたらしいです。えっ、Attack and Defenceやるの?

 これは勉強会のメンバーに良いネタを持って帰れるぞ!と思ったのに、いざ始まってみると「問題がどこにあるかすら分からない」。最終的にヒントとしてポート番号と問題のある場所を教えてくれたので、何とか問題を発見することができました。しかし解ける問題はせいぜいシーザー暗号しかなく、私はそれを報告して他の問題を発見しようとしただけでした。私自身は一度もフラグをSubmitできませんでした…

 結局、Attack and Defenceの要素を体感することができませんでした。常設CTFと変わらない。

 私はチームの役に立つことはできず、本屋を運営していましたとさ。おしまい。

 

 この一日で自分の人生をすべて否定された気分になりました。目頭が熱くなり、やけくそ気味でした。他の参加者でも鬱になった人がちらほら。自分だけじゃないとは分かっていても、悔しいことには変わりありませんでした。そんな感情を抱いて、Day2を終了しました。

 やけくそ気味でもちゃんと早く寝てました。アニメなんて見てませんよ。褒めてください()

 

Day3 講義3・4・5+企業・団体プレゼンテーション(1)+グループワーク(2)

 朝起きて、ブログにアップする物が少ないことに気づき、部屋からの写真を撮ってみることに。

f:id:HappyNote3966:20160815175820j:plain

 残念ながら曇天。タイミングが悪い。

 なお、朝食は毎日必ずバイキングで、自分のお腹の調子と相談して食べることができます。

 

f:id:HappyNote3966:20160815183638j:plain

 おいしそう。贅沢です。ここ本当に研修施設なんですかね。某研修も見習ってh(ry

3-C 脆弱性検出実践(ファジング技術と脆弱性報告)(講師:山下勇太さん、篠原祟宏さん)

 対象のシステムなどにバグを引き起こしそうなデータを送り込み、その挙動を確認することで脆弱性を発見するファジングと言う技法を用いて、実際の製品に対して脆弱性検出を行いました。どんな機器があったのかは言えませんが、本当に色々ありました。見た時は「嘘だろこんなのもファジングするの?」って思いましたから。

 ファジングするときは調べたい対象によってツールを選ぶ必要があり、今回は様々なツールを使用させていただきました。この講義中に脆弱性の一つぐらい見つける気持ちでいたのですが、残念ながら今回は発見できませんでした。

 (まぁ簡単に発見できるなんて考えが甘すぎたんですよね…)

 ネットワーク系の知識が少しだけ役に立ったのか、講義自体はついて行くことができました。ただファジングって暇なんだなぁとか思ったり、ファジングの設定自体もVMなどの機構を介していると複雑になって大変だなとか思ったり…

 色んなファジングをやっているなかで、そのファズの内容を見てみると色々な文字列や数字などが送り込まれていたので、もしかしたらそれがExploitの勉強に役立つかも…しれない。(やっぱりまだよくわかってない)

 後は、脆弱性を発見した後にどうやってそれを報告するか、報告時の注意などについても伺いました。ただ脆弱性を発見して「ありました」で終わるのではなく、どういう環境下でどういう再現性のあるものを与えるとどういう状態を引き起こすのかなど、発見してからもやるべきことは多いみたいです。いずれは脆弱性をみつけてIPAとかに報告したいですね。頑張ります。

 

4-A クラウドセキュリティ基礎(講師:仲山昌宏さん)

 クラウドというものが良く分からなかったので、この講義を受講しました。なんでもAWSを使ってサーバを立ち上げ、その中でサーバソフトをインストールしたりできるらしくて面白そうと思いました!

 自分でサーバを立ち上げたことが皆無で、クラウドとか怖くて使えなかったというのもありました。何せ課金とか怖くて怖くて…プリペイド以上の課金システムがあると手を出せずにいましたが、今回は指示通りにやっていれば課金は発生しないとのことで、安心して取り組むことができました。

 内容としては、まず与えられたアカウントを用いて仮想サーバを立ち上げます。そのサーバで認証情報などを取得し、それを用いて仮想サーバへログイン、linuxコマンドを使いながらApacheサーバソフトをインストールします。

 ここでも情弱ぶりを発揮し、周りの方々に教えてもらう羽目に。ご迷惑をおかけして申し訳ありませんでした…

 インストールのためのコマンドをググったりしながらなんとか進めていけたのですが、confファイル?を編集する際に、テキストエディタをどうやって使うか分からなかったのでどうすればいいか聞いてみたら

 「Vimはいいぞ」と一斉に言われました。えっ、えっ、ちょっと待って、同時に言わないで頭がパンクしそう()

 いやまぁ、テキストは今までWordかTerapadEclipseぐらいでしか編集できなかったので、こうやって布教してくれるのはとても嬉しいのですが、やっぱりびっくりします。

 この講義はちょっと成長できた気がしました。知らないLinuxコマンドがたくさんあるんだなぁとか思ってました。そういえば、CTFのチーム名がVimEmacsがあったね。宗教戦争できるのはある意味楽しそうです。混ざりたいので勉強します。

 

5-B USBメモリからブートしてみよう(講師:内田公太さん)

 この講義ではUSBメモリからOSの力を借りずにブートするというものです。USBメモリの先頭の領域にアセンブラ言語で記述したプログラムを流し込むことで、BIOSを用いて文字を表示することができるというものでした。

 BIOSの中にあるセキュアブートという仕組みなど、普段触らないことをしているので良く分からないけど動くんだなとか思ったりして、ハードウェアに近い何かをいじるのは楽しかったです。

 ちなみに事前課題として参考図書を頂きました。これになります↓

 

  この書籍の内容は半分ぐらいまで勉強できていたのですが、全部終わらなかったので少し不安でした。ですが同じくたくさん教えてもらったのでなんとかUSBメモリからブートすることができました。

 アセンブラの中身をじっくり読みながら、何か変えられないかなぁとか思ってましたが、とてもそんな時間はなく、この辺については事後学習の必要性を感じました。それと低いレイヤーに行くにしたがって僕の心がワクワクしているのを感じられた講義でした。こういう講義いいですね、是非ともハードとソフトの両方を学べる書籍や講義が増えてくれると嬉しいです。

 ゆくゆくは、自分もそういう書籍を出せたらいいなぁ。

 あ、そういえばこの書籍もサイン貰いました。ここで感じられたのが、皆さんサインするとき「字が下手ですが…」とおっしゃるのですが、そんなこと言わないでください、僕の難読化された文字列の方が字が汚いです。サイン頂けるだけで光栄なのですよ!ありがとうございます!(*´ω`*)

 

企業・団体プレゼンテーション(1)(株式会社野村総合研究所

 実はDay2だったかにどの企業・団体のプレゼンテーションが聞きたいかアンケートが配られます。私は幸いにも第一希望だけが通ったので良かったです。

 その内の一つ、まずは野村総合研究所の方のお話を伺いました。以前こちらの企業の方と関わりがあり、興味を持っていたのでお話を聞けて良かったです。

 一言でセキュリティの企業と言っても、やることは様々で、それぞれに役割が分かれているのだとか。セキュリティ診断という仕事においては、顧客のサービスに対しての脆弱性を発見し、それを報告するだけでなく、どうすれば脆弱性を減らすことができるかなどの継続的なサポートまで行うそうです。すごい、そこまでサポートするんだ…

 とても貴重な話を聞けて満足です。ノートまで頂いておなかいっぱいです。ありがとうございます!

 

グループワーク(2)

 講義の合間に集めた質問とその答えをとりあえず共有して、次に質問するべき項目などを決めようということから始まりましたが、今回は一時間しか時間が無く、次の質問を決めるだけで終わってしまいました。やはり、グループワークというものは難しい。学校でやっているグループワークとは環境が違いすぎてうまく進めることができず、どうも進捗を生めない日でした。

 そしてこの日もすぐに就寝。みんな、ちゃんと寝てるかな?とか思ってTwitter確認してたら結構TL上が賑わってたりと…

 

Day4 講義6・7+企業・団体プレゼンテーション(2)+グループワーク(3)

6-D リバースエンジニアリングを自動化せよ(講師:岩村誠さん)

 自動化ってかっこよくないですか?と言いたくなるぐらい、自動化には興味がありました。アナライジング・マルウェアなどの書籍を書いた本人が講義をしてくれるとのことなので、選ばないわけにはいきません。というわけで早速ワクワクしながら講義を受けたのですが…バイナリExploitが全くできない私にとっては講義を見ているだけしかできませんでした。

 特に、ここでもLinuxのコマンドが使えなかったのが致命傷で、そもそもELFファイルの実行方法すらわからないという恥ずかしいところをお見せしてしまいました。他の参加者の方は結構問題を解いていたようですが、私は一門も解くことができず、座学内容をメモすることで必死でした。

 何にもできないのが悔しくて悔しくて、この講義が一番何もできなくて、一番悔しいものとなりました。負の感情MAXです。人権喪失再び、挫折以上を味わった気分です。

 ここで私はセキュリティキャンプに参加したことを後悔するとともにセキュリティに向いていないのではないかと思い始めました。講師・チューターの方に質問してばかりで、迷惑がられているかもしれないともう散々で…(泣)

 ただ、その後に色々とお話を伺いました。岩村さんいわく、過去には全くプログラムを書けなかった人もいたが、そんな人でもDEFCONに行ったりするぐらい成長するので気にしないでくださいと。優しいですね、心のフォローアップまで万全のようです。

 とにかくその話を聞いて少しは元気が出ました。少なくとも諦めずにこのまま勉強しようという気にはなりました。今回の講義内容を勉強して色々と自動化していきたいと思います。

 ちなみに講義の内容としてはIPythonとangrを使った解析の自動化です。世の中には便利なツールがあふれてるんだなぁ…まだPythonのまともな文法すら使いこなせていない私にとっては知る由もありませんでした。

 とにかく勉強不足だということが分かったので、この講義はマスターしたいところです。頑張ります。頑張るぞい!

 そして安定のサインを頂きました。岩村さん憧れだなあ…

 

7-B 組込みリアルタイムOSとIoTシステム演習(講師:松原豊さん)

 エンベデッドシステムというものに興味を持ち始めていたころに、キャンプのこの講義を見て、これは是が非でも受けるべきだと思ったのです。IoTというキーワードがこれから当たり前のものになりそうだったので。あと、ES試験に不合格になったから実体験がしたいとも思ったんですね()

 事前課題ではなんと9000円相当もするGR-PEACHというマイコンを頂きました!ありがたい!写真はのちほど。

 Webコンパイラというものを使ってGR-PEACH用のC言語プログラムをコンパイルし、それをUSBケーブル経由で流し込んでLEDライトを光らせたり、HTTPサーバを実装したりすることができる講義でした。ソフトウェアが動くならまだしも、マイコンが自分の書いたプログラム通りに動いてくれるのは「結果が目に見えて」達成感があって嬉しいですね。ハードウェアと密接に連携したプログラミングをするのはこれが初めてだったので、慣れるまでが大変でしたが慣れると面白いものです。

 RTOSに必要な割り込みなどの概念は理論では分かってはいるものの、実装するにあたってはまだ理解が足りず、講義目標の半分も達成できませんでしたが、この講義はやっていて楽しかったです。

 その後松原さんにはGR-PEACHにサインを頂きました。あと、DEFCONのお土産も大量に貰いました。貰ってばかりですが、ありがとうございます!

 そして講義終了後、松原さんには私が周りに比べて遅れているとかいうことについて相談を受けてもらいました。松原さんは、「焦らずに自分のペースで着実に進むことが重要だ」とおっしゃってくれました。全講義が終わって、まともに内容が身に付いた気がしなかったので、気落ちしていたところをフォローして頂いて、申し訳ない気持ちとともに感謝の気持ちでいっぱいです。ありがとうございます。

 ちなみにですが、GR-PEACHの外箱が舞妓さんになっているのが「マイコンにかけているから?」と聞いてみたところ、松原さんもそうかもしれない?と疑問に思っていました。ちなみに最初の疑問に思ったのは私のお母さんです。お母さん、鋭い…w

 

企業・団体プレゼンテーション(2)(サイボウズ株式会社)

 キャンプの交流のために使われているサービスはサイボウズLiveというもので、私はこのサイボウズLiveをキャンプで初めて知りました。企業としては、脆弱性報奨金制度を日本で唯一扱っている企業だという認識でした。

 

f:id:HappyNote3966:20160815175805j:plain

 これはボウズマンというらしいです。かわいらしい。

 今回の企業・団体プレゼンテーションでは、質問を多く受け付けてくれたので色々なことを伺ってみました。私はそもそも地方に住んでいるので、テレワークというものがあれば私としても家族としても大変うれしいのですが…と質問したところ、環境はバッチリ整っているとか。実家に帰りながら仕事している方も普通にいるらしく、働きやすい環境はしっかり整備されているらしいです。これはサイボウズにラブコール…

 

グループワーク(3)

 翌日が発表ということもあり、最後の追い込み。だけど当然この時間帯で終わるわけもなく、ある部屋に集まって非公式のグループワークを開始。

 ひとまず解散し、私は28時までPowerPointでスライドを編集していました。大変だった…しかし、この後に悲劇が起きます。

 

Day5 グループワーク(4)+成果報告会

早寝早起きの生活が続いていた上に、ここにきて仮眠程度しか眠れず、体の調子は絶不調。最高です。

グループワーク(4)

 完成した資料を提出し、いよいよ発表です。ですが、ここで悲劇が起きます。

 何時間もかかって完成したスライドは、PowerPointの下で編集されていました。ですが、実際に動かしたPCではLibreOfficeが入っており、スライドの表示やアニメーションなど、色々と崩れていました。泣きたい。

 最終的には何の評価も得ることができませんでした。私の放送大学のような発表がダメだったのだと思います。スライドだけは評価してほしかったけど、あの表示じゃなぁ…

 

成果報告会

 各講義について参加者が自らの口で伝えるというものでした。選ばれたみんなは講義の内容をほぼ完璧に理解しており、楽しそうに語ってくれました。そこまでのレベルに達していない自分が悔しかったですし、彼らのようになりたいとも思いました。

 

感想

 以上、キャンプはこんな感じで終わりました。当初思っていたのと違う5日間でした。悔しい思いをしてばかりで、自分の浅はかさのあまり自暴自棄になりたい日々でした。

 キャンプ中は講師・チューターの方々に何度もご迷惑をおかけし、申し訳ない気持ちでいっぱいです。たくさん教えてもらわないと何もできませんでした。詳しいことは書いていませんが、技術的なことばかりではなく、勉学に対する姿勢やアドバイスなど、休憩時間や食事の時間などで色々とお話を伺いました。本当に、いろんなもの・ことを学ばせていただきました。

 だからこそ、教えてもらった分、教えられるようになりたいとも思いました。

 とにかく実力不足の穴を埋めるために、勉強し続けます。

 ですが勘違いしないでほしいのは、キャンプは悔しい思いをするだけの場所ではないです。今回は私が不甲斐ないばかりに醜態を晒し、主観で物事述べているだけなので、気にしないでください。他のキャンプ参加者もブログなどで綴っているように、参加して本当に良かったと思えるものになるはずです。

 私も、参加してよかったと思っています。楽しかったことはありませんでしたが、成長のために繋がる何かを見つけられた気がします。少なくとも「分からないことが何か」が分かりました。周りに負けまいとする気持ちも充電できました。

 この悔しい気持ちを糧にして、先に進みたいと思います。

 この場をお借りしまして、参加者・チューター・講師・企業・その他関係者の方々にお礼申し上げます。とても貴重な経験をありがとうございました。

 

 ある人の言葉をお借りして、皆さんにお伝えしたいのは

 「セキュキャンはいいぞ」

 です。皆さんも是非、来年度以降のセキュリティキャンプに参加してください。

 

お土産

 

 さて、お待ちかねのお土産紹介のコーナーです。一度に写真を撮るのは部屋の広さ的に無理だったので、小分けにして紹介します。

 まずは講義資料。今後の成長のために事後学習は必須ですね。

f:id:HappyNote3966:20160815175751j:plain

 続きまして、キャンプ終了後に貰った書籍です。

f:id:HappyNote3966:20160815175748j:plain

 お次は7-Bの講義で頂いたGR-PEACHです。

f:id:HappyNote3966:20160815175450j:plain

 さらに4-Aの仲山さんから頂いた技術本です。サインも貰いました。

f:id:HappyNote3966:20160815175545j:plain

 LINE株式会社様からはこちら。(横でごめんなさい)

f:id:HappyNote3966:20160815175745j:plain

 大日本印刷株式会社様からはこちら。

f:id:HappyNote3966:20160815175739j:plain

 株式会社野村総合研究所様からはこちら。

f:id:HappyNote3966:20160815175735j:plain

 トレンドマイクロ株式会社様からはこちら。

f:id:HappyNote3966:20160815175732j:plain

 一般財団法人日本情報経済社会推進協会様からはこちら。

f:id:HappyNote3966:20160815175726j:plain

 株式会社TCSI様からはこちら。

f:id:HappyNote3966:20160815175729j:plain

 伊藤忠テクノソリューソンズ株式会社様からはこちら。

f:id:HappyNote3966:20160815175718j:plain

 富士通株式会社様、富士通エフ・アイ・ピー株式会社様からはこちら。

f:id:HappyNote3966:20160815175713j:plain

 ヤフー株式会社様からはこちら。

f:id:HappyNote3966:20160815175622j:plain

 株式会社リクルートテクノロジーズ様からはこちら。

f:id:HappyNote3966:20160815175617j:plain

 エヌ・ティ・ティ・コミュニケーションズ株式会社様からはこちら。

f:id:HappyNote3966:20160815175607j:plain

 サイボウズ株式会社様からはこちら。

f:id:HappyNote3966:20160815175601j:plain

 さくらインターネット株式会社様からはこちら。

f:id:HappyNote3966:20160815175551j:plain

 こちらは…えっと、分からなかったけどありがとうございます!(すみません)

f:id:HappyNote3966:20160815175556j:plain

 7-Bの松原さんに貰ったDEFCONのお土産はこちら。

f:id:HappyNote3966:20160815175541j:plain

 キャンプTシャツもいただきました。

f:id:HappyNote3966:20160815175536j:plain

f:id:HappyNote3966:20160815175531j:plain

 シワシワで申し訳ないです…アイロンが無かったので、すみません。

 そして最後に貰ったステッカーの一覧です。

f:id:HappyNote3966:20160815175527j:plain

 今までステッカーを張ったことが無かったので、この機会に貼りました。キャンプ中にステッカーを求めていろんな人に「ステッカーありますか」って聞いて回ったのは私です。

 というわけでステッカー貼ってみました。貼り方にセンスが見当たりません。

f:id:HappyNote3966:20160816025848j:plain

 でもたくさんもらえて&貼れてうれしい( *´艸`)

 

 

f:id:HappyNote3966:20160815175458j:plain

 最終的にこんな感じの賞状を頂きました。

 お土産は以上になります。キャンプ参加時には余裕を持った荷物の量でないと全部しまい込めないので、郵送するなりキャリーバッグを2個持ってくるなりした方が良いでしょう。というかそうしました。

 

 また長文になってしまいましたが…ここまで見て頂けたでしょうか?

 最後になりますが、この記事が皆さんの参考になれば幸いです。是非ともセキュリティキャンプに参加してください。そこでもし私と会うことがあれば、仲良くしてくださいね。

 

 どうでもいいひとこと:セキュリティの小説が書きたいですね。

セキュリティキャンプの応募用紙で意識した事

同じプロジェクト、同じ勉強会、あるいは来年度に応募されるであろう方向けです。

プロジェクトの中でまた発表しますが、ひとまず僕が応募用紙を書く際に意識したことを挙げていきます。ちなみに実際に応募したときの応募用紙はこれ↓です。

happynote3966.hatenadiary.com

注意事項

  • 個人的な考え&経験談です
  • これを見て応募したけどダメだったぞ、って言わないでください。
    (参考にしたら受かりました!って方は、是非お友達に!そうでなくともお友達に!)
  • 「生意気だぞ」という方、すみません。見なかったことにして下さい。

 

①技術力よりも熱意を

 僕は(本当に)実力がありません。セキュリティの勉強は積んできましたが、実践となるとめっぽう弱く、CTFなどは全くできません。SECCONとかに出てみたいという気持ちはありますが、オンラインのCTFですらほんのちょっとしか解けないのですから、困りました。学内であったCTFで新入生が大量のスコアをゲットしていたのは羨ましくて仕方がなかったです。

 じゃあどうするのか。答えは簡単です。技術力じゃない部分…つまり、熱意で勝負しました。どんな些細なことでもいいから、用紙を埋める努力をしました。何日もかかってWordに中間保存を繰り返しながらやっていたので、手が悲鳴を上げていました。一日に8時間ぐらいパソコンとにらめっこして書き続けたこともありました。

 セキュリティ・キャンプのサイトで講師主査の方がこう仰っていました。

キャンプでは定員の都合上、受講者を選考することはあります。しかし、セキュリティの知識や経験の点数を競う試験を行っているわけではありません。あなたのセキュリティに対する知識欲であるとか、技術を伸ばそうとする熱意、セキュリティによって社会を良くしようという気持ちなど、そういったものの熱の総量を選考する講師陣は見ています。過去のキャンプ参加者も他人より多くの知識や技術があるから選考を通過したわけではありません。
応募用紙には難しい問題もあるかもしれませんが、あきらめずに取り組んでみて下さい。

 

www.ipa.go.jp

 

 この言葉に救われました。本当に。

 知識や技術力で勝負すれば、確実に選ばれていなかったでしょう。

 

 だからと言って、だらだらと文字を書き連ねるだけではいけないと思いますよ。

 どうしてもキャンプに参加したいのであれば、自然と書く内容も増えていくとは思います。「どうせ受からないだろ…」とか思わないでください。まずはだまされたと思ってやってみてください。

 ちなみに、問題内容は僕にとって面白いものでした。難しくてとても解けるものじゃなかったですが、解いてみる価値のあるものばかりです。過去の参加者の体験記から問題を探すのもいいのではないでしょうか。

 

②コピペ、ダメ、絶対

 論外ですよね。そんなので熱意が伝わりますか?他人の気持ちに自分を照らし合わせてもなにも起こりませんよ。

 あ、調べるのはダメではないと思います。調べて知識が付くならそれに越したことはありません。やっちゃいけないのは、自分の頭で理解せずに文章を貼り付けることです。

 僕のプライドはコピペを許さなかったので、もう小説家になった気分で自分の持てる考えを全て出し切りました。といっても、知識力を問う問題をあまり選ばなくて、自分の考えを書きなさい、というものばかり選んでいましたから、コピペのしようがなかったというのもあるんですけど…(こういうところでも知識や技術力の無さが表れてる)

 

③実際に受かったつもりで

 設問の中にはこんなのもありました。

(1)あなたが今年のセキュリティ・キャンプで受講したいと思っている講義は何ですか?(複数可)

 そこで、どのようなことを学びたいですか?なぜそれを学びたいのですか?

  「受講したいです!」って言うのは簡単なことです。なので、僕は実際に言ったつもりで時間割を考えて、その理由も含めて書きました。

 そりゃ、受けられるなら全部の講義を受講してみたいです。じゃあ全部って書けば?ってなりますが、それは違うと思いました。全部受けたいですなどと言えば適当に答えてるようにしか見えないからです。

 必要なのは、ちゃんと講義を絞って、自分に今後必要なのは何か、またそれは何故なのかを考えられることではないのでしょうか。

 あとは、セキュリティキャンプの過去の参加者の情報を集め、どんなことをやっているのかを見ました。着目したのは、講義以外のことです。

もし自分がそこにいたなら、何ができなくて後悔するだろうと考えました。

「もっとキャンプの人と関われば良かった…」

「興味を持っておけばよかったことがあった…」

そんな目に遭いたくありません。めったに行けない貴重な経験を無碍にしたくない。そんな気持ちがあふれてきて、脳内シミュレートをした結果、本当に些細なことだろうなぁと思われてもいいから書き連ねました。

 

④広く視野を持とう

 僕の一番興味のある分野はバイナリ解析です。あ、全くと言っていいほど解析できませんよ?興味があるだけです。はい。

 でも…仮にセキュリティキャンプに参加できたとして、バイナリ解析についてマスターしても、バイナリ解析の分野だけでしか活躍できないのって勿体無いですよね。卓越した才能はそれはそれでいいことです。その分野の発展に貢献して頂ければ尚良しです。

 すごい人たちが集まって、色々なことを教えてくれる場がセキュリティキャンプなのです。そこにいて、たった一つの分野だけを学ぶのはとても惜しいことだと思っています。セキュリティを学び始めたなら、「色々な分野があるんだなぁ」とか思いませんでしたか?

 そこなのですよ。それだけ色んな攻撃手法を用いて悪い人たちが攻撃してくるということになりますよ。そんな時、特定の専門分野でしか戦えないとなったら、もどかしい思いをすると思いませんか?(アッすみませんまともに戦えない癖に偉そうにスミマセン)

 そんな風になりたくないので、応募用紙には「いろんな分野を吸収して視野を広げたい」と書きました。今後は多様化する攻撃手法に対応するべきだと思ったからです。

 あと、セキュリティに限らず色々なことに視野を広げていくことは人生にとってプラスですよ。多分。少なくとも僕はそう思ってます。

 

⑤良い点、悪い点、改善点

 物事には全て良い点と悪い点がありますよね。セキュリティの話で言えば、強固なファイアウォールは侵入される危険性も減りますがサービスの可用性は落ちる、みたいな感じです。

 絶対安全など存在しないのが常識です。(あればいいですね、そういうの)

 同じように、なるべく物事の良い点と悪い点の両方を挙げるようにしました。物事の長所と短所を見つけられるようにという意味合いも込めてです。

 さて、それだけでは終わりません。良い点、悪い点を挙げるだけなら誰でもできます。重要なのは、いかに自分の考えを書けるかです。私は自分の考えとして、その短所についての改善点を考えられるだけ書きました。

 (問題でWindowsについて語ってみたのですが、良い点ばかりだと布教行為にしか見えなかったっていうのも理由の一つです。Windowsは好きですけど…(;´・ω・))

 正解はないのです。「自分はこう思う」ということしか書けませんが、それでいいのです。だって誰にも正解は分からないのですから。そこは、講師の方々も配慮してくれると思いますよ。多分。

 

⑥間違いを恐れない

 問題文の内容が分からなくても、とにかく書いてみてください。人間だから、何かしら間違えることはあります。試されているのは技術力じゃないですよ。熱意ですよ。間違いを恐れて何も書かない事を恐れてください。やったもん勝ちです。とにかく持てる知識をフル活用して、考えられそうなことや自分なりの見解を書いてみましょう。

ちなみに僕の解答用紙に間違いがありました。お恥ずかしい///

 

⑦まとめをかく

 4万字ぐらい書いたはずなので、読む方も疲れてしまうはずです。それを見越して、各回答の文章の最後には印象付けのためにまとめを書いてみました。そうすることで、自分自身にとってもどういった趣旨の文章を書いたのかわかります。

 書いたまとめを起点として、文章がおかしくないかをチェックすることもできます。
 (僕のおつむは良くないのでチェックしてもおかしい所があったり…)

 

 

じゃあ、締めくくりもかねてここでまとめをしてみます。

 

 

  1. 技術力よりも熱意を
  2. コピペ、ダメ、絶対
  3. 実際に受かったつもりで
  4. 広く視野を持とう
  5. 良い点、悪い点、改善点
  6. 間違いを恐れない
  7. まとめをかく

 

こんな感じでしょうか。また何か思いつけば追記するかもしれません。

是非、来年度以降のセキュリティキャンプに応募してみてください!

この記事が皆様の一助になれば幸いです。

 

セキュリティキャンプ2016の応募用紙を晒す(真似事)

注意事項

・技術的なことはそれほど難しいことを書いているわけではありません。
持てる知識をひねり出した結果、雑巾から汚水を絞った感じになりました。

・やたらと長いので読んでいると飽きるかもしれません。いや、絶対に飽きます。

・誤字脱字については直していません。

・一応合格を頂くことができました。来年の応募者様のご参考になれば幸いです。

 

共通問題1

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

 1つ目は、高校の頃に課題研究としてゲームを作りました。作ったゲームは、自分の書いた小説を基にしたノベルゲームです。当時、課題研究という高校の卒業研究のようなものの一環として何か一つの成果物を作るという授業があり、そこでは私はゲームを作ることにしました。ゲームは小説の世界観を味わってもらうため、一人称視点としました。このゲームではゲーム開発に使われるようなUnityなどのゲーム開発に特化した環境は用いず、EclipseJava,そして標準のAPIとJMFのみで作りました。スクリプトを組むことができる吉里吉里などを用いずに作ったので見た目は綺麗とは言えませんが、ゲーム内に出てくるウィンドウやパネルなどのGUIパーツは全て自分でグラフィックを調整することで実現しました。また、ストーリーに合わせて音楽がやキャラクターの表情が変わるようになっています。加えて、操作をするごとに効果音を鳴らすことができ、文字列の動きなどをアニメーションで表現していたりもします。他にもセーブ機能や、ストーリーをじっくり読んでもらうため話を進めるごとに操作を受け付けないようにする仕組みも追加されています。

 作ってよかったところは、全体を通してプログラミングになじむことができた上、年単位で構想していた自分の小説をゲームにできたことと、高校での良き思い出になったことです。グラフィックに関する処理についても学べましたし、チームで開発するということの難しさも痛感することができました。また、このゲームの発表が校内に留まらず、小松市で行われた課題研究発表会において褒められたことです。

 改良点としては、まず素材を除いてグラフィックがあまりにも前時代的で、きれいではありませんでした。今のモダンなGUIのようにきれいに表示できるようグラフィックの処理を変更しなければならないのと、既に読んだ部分をスキップすることができるように記録しておくこと、お話の分岐を作ることなどが挙げられます。このゲームは欠陥だらけではありますが、私の高校時代のとても印象に残る思い出そのものであり、私のレベルの低さを教えてくれる、いわば戒めのような存在でもあります。より上のレベルを目指さなくてはならない、自己満足だけで終わってはいけないということを学ぶことができた、一つの人生経験です。

 

 2つ目は内田クレペリンの生成プログラムを作成しました。このプログラムは2~9までの乱数をA4の紙に空白と交えて敷き詰めるというものです。プログラム自体は.txt形式で乱数をファイル出力し、それをWordで開き適度なフォントとサイズに調整し、プリンターが対応しているPDF形式に変換するマクロを組んでプリントアウトしました。卒業後就職する人が多かったので、内田クレペリンの練習が必要だったのですが、高校で配布された用紙だけでは乱数を覚えてしまう可能性があるので、何回でも生成できるこのプログラムを用いて就職試験をサポートしました。一度に十数枚印刷して渡すこともしばしばだったので、予めログを記録するファイルを作成し、そこからこれまでに出力したファイルと名前が被らないようにしました。こうすることでプログラムを実行する回数だけ.txtファイルが出力できます。

 作ってよかったことは、乱数を生成し、それをテキストファイルに出力するなどの基本的な処理を学べたところです。また、ちょっとしたマクロを組むのにわざわざVBAをいじらなくてもマクロの記録をするだけでマクロが作れるなど、Wordの機能も学べたことです。

 改良点としては、作ったクレペリンのテキストファイルは一度手動でWordに読み込ませていたので、この作業も自動化し、プログラムの起動だけで一連の動作が完了するようにすることです。

 

 3つ目は、0~49までの数字の記されたボタンがグリッド上に配置され、その数字を0から順番にクリックしていき、最後の49がクリックされるまでの時間を図るというプログラムを作りました。このプログラムも就職試験の注意力配分テストのために制作しました。Javaで製作したこのプログラムの特徴は、クリックされる数字が順番にならなければ操作を受け付けないようにできています。最期の49の数字がクリックされたとき、0の数字がクリックされてから49の数字がクリックされるまでの時間をタイトルバー上に表示するというものです。PC上で動くのはもちろん、PCが使えない状態でも練習してもらえるよう、問題はスクリーンショットを取得して印刷していました。

 作ってよかったことは、Javaでの基礎的なGUIアプリケーションの作り方が分かったうえに、タイマーを取得して時間を図れるようになったところです。加えて、このアプリケーションを作ったのがきっかけでオブジェクト指向のイメージが掴みやすくなりました。

 改良点としては、配置されたボタンを押した感覚があまり得られていないので、正しいボタンをクリックできた時とそうでない時にSEを鳴らして分かりやすくすることと、一度最後までやり終えると再起動しなければならないので、結果の表示を分かりやすくしたり、リトライするかどうかを尋ねるようにGUIを追加しなければならないと考えます。

 

4つ目は、規則性のある記号を(●、▲、▼、◆、■)などが記されたボタンをグリッド上に配置し、横一列に並んだ複数のボタンの中に仲間外れを一つだけ紛れ込ませるというプログラムを作りました。このプログラムも就職試験の一環となっているテストの対策として作りました。乱数で文字列内の違った記号を出力する位置を指定し、横一列に並んだほかのボタンとは違う並びの文字をボタンの中に書き込んでいます。特徴的な記号ばかりを使った簡単なものから似たような記号を用いた難しいものも作りました。こちらもPC上で何度も実行でき、PCがなくとも予めスクリーンショットを取得して印刷していました。

 作ってよかったことは、記号の並びを再現するために考え込んだので、良い頭の体操になったと考えます。

 改良点をとしては、もっと難しい配置や表現を考えなければならないと思います。そのためには実際の就職試験問題を自分で解いたり、心理系の本を読んだりしなければならないと思います。ここまで就職試験対策用のプログラムを作ったとしましたが、いずれ自分も使うことになるので更なる改良が必要だと考えます。

 

 5つ目は、換字式暗号解読プログラムです。こちらはCTFの対策としてJavaとCの両方で作りました。最初は単純に文字列の各文字に対して加算処理を加え、26通り分全ての文字列を出力していました。しかし、それでは非効率的だったので、CTFのサイトを見て回りながら良く出題されていたROT13の問題を参考に、13文字分ずらした文字列を表示するよう改良しました。また、仮にROT13でなくても対応できるよう、ずらす文字数を指定すれば正の方向と負の方向両方に関係なく対応できるように作りました。

 作ってよかったことは、プログラミングと文字の関係(特にASCII)が良く分かり、自分の作業を簡易に済ませられるよう便利なものを作りながら勉強するという姿勢が学べたことです。

 改善点をとしては、このプログラムは単なる換字式暗号にしか対応できていないので、他の暗号方式にも対応できるようプログラムすることと、コマンドラインベースで動作するので、GUIを実装してコピー&ペーストや復号したい暗号化方式の選択ができるようにするなどより使いやすいプログラムとすることです。

 

 

 6つ目は、アプリケーションなどのクイックランチャーです。私は学校の課題などでよく同じソフトを何度も起動させることがあります。従来はマウスを使ってダブルクリックを繰り返していましたが、私はマウスとキーボードの切り替えをすることが時間の無駄に感じていました。私の読んだ本には、人間にはCPUと同じくコンテキストを備えており、そのコンテキストを切り替えるコンテキストスイッチがあるのだとありました。更にその本には、人間はCPUのようにコンテキストスイッチを行ってもすぐさまそれが脳内で反映されないともありました。この本を読んでから、私は自身の行動を観察し、コンテキストスイッチに相当する場面が無いかと言うことを考えました。

 そこで私が思ったのは、よく使うアプリケーションをダブルクリックする時にコンテキストスイッチが行われていると思いました。私のデスクトップ画面はある程度ファイルを整頓してあるのですが、時々どこにアプリケーションのショートカットアイコンがあるのかが分からなくなります。起動したいアプリケーションは分かっているのに、そのアイコンの場所がどこかと探していると、自分がやろうとしていた作業の内容やひらめいたアイディアがすぐに頭から飛んでいってしまい、それを思い出すのに時間がかかることがあります。

 これがコンテキストスイッチに該当すると思い、私はコマンドラインを常時立ち上げ、必要なアプリケーションをコマンド入力することで起動させることにしました。Windowsであればショートカットキーでタスクバーにあるアプリケーションをクイック起動させられるのですが、数に制限があります。私は、そこをPowerShellエイリアスを作成することでクイックランチャーとしています。例えばInternet Explorerを開きたいときは、iexploreと入力することで起動できます。また、作成したエイリアスを忘れないように、PowerShellの起動時に作成したエイリアスの一覧を表示させるようにしています。何度も見ることで自然と覚えるようにしています。

 作ってよかったことは、以前、IEの起動の際に、引数としてURLを与えたところそのサイトを表示できたので、GUIアプリケーションでも引数を受け取れるのだと知ることができたことです。また、PowerShellがCMDよりも強力であることが分かり、シェル操作に慣れることができたのも良いところです。

 改良点としては、アプリケーション同士の連携が必要で複数同時に起動する必要があるときや、特別な引数を与えた状態で起動させるためのエイリアスを作成し、コマンドの使用頻度から覚えるべきエイリアスを一覧の上に、そうでないエイリアスを一覧の下に表示するか表示しないようにして、エイリアス一覧の表示を最適化する仕組みを追加すべきだと考えます。

 

 7つ目は、暗記を容易にするタイピングプログラムです。このプログラムはあらかじめ設定しておいた問題を表示し、タイピングしながら答えを入力していくことで繰り返し学習し、記憶に定着させるようにすることを目的としたものです。私が学習効率について悩んでいたころ、せめて暗記物の勉強ぐらいは楽しくできるようにしたいと考えたのがこのプログラムのきっかけです。私はタイピングをすることが好きなので、タイピングと勉強を両立できないかと考えた結果このようなプログラムを作ることにしました。

 作ってよかったことは、クラスやメソッドチェーンなどのやり方を再復習することができた点と、暗記の勉強の方法に光明が見いだせたことです。

 改良点としては、問題文と答えをプログラム内部に設定するのではなく、外部からテキストファイルやデータベース等を用いて連携させ、表示させられるようにするところと、正答率や時間などを計測し、苦手な問題や得意な問題などを区別できるようにすることです。

 

 8つ目として、これはプログラムではありませんが、発表用のスライドを作りました。私は中学の頃からずっとPowerPointを使っており、中学では所属していた科学パソコン部でPowerPointを用いて研究発表や部活動紹介を、高校では課題研究発表会で、大学ではグループ活動や勉強会などで数多くのスライドを作ってきました。そこで心掛けているのは、見ている人にとって発表を聞くのがつまらなくならないようにすることです。どの段階においても、私が使える最大限の能力を発揮して、アニメーションや視覚的に見やすいレイアウトなどを作ってきました。私の発表では、見てくれている方が必ず「すごい」や「どのようにして作ったのか気になる」と言ってくれるほどです。

 作ってよかったことは、自分の意見を周りに伝えられることができたことと、発表や教えるということが楽しくなったこと、イラストやアニメーションなどを用いて抽象的で視覚的な表現ができるようになったことです。

 改良点としては、より情報量を削減し、見てもらう人が情報を取り込むのが難しくないように配慮することです。加えて、もっと自信の発表のスキルを上げることです。

 

 ここまでで、私が作ってきたものは、自分自身のスキルアップに繋がるものや、自分以外の人の役に立つもの、そして人に自分の考えを伝えられるものです。

 

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

 1つ目のノベルゲームは、ストーリーをくだらないものにはしたくなかったので、半年をストーリー作成に、残りの半年をプログラミングに費やしました。その時のチーム配属で他にプログラミングをできる人がいなかったので、ストーリーとプログラミングを一人で担当していました。その間、友達の就職活動や自身の大学受験、応用情報技術者情報セキュリティスペシャリストの勉強に加え、まじめにやろうとしない人たちへ少しでもやる気を持ってもらえるよう徐々に課題を与えて少しでも仕事してもらえるように配慮したり、他のチームへの助言などをして、本来の活動以外にも真剣に取り組みました。その代わり自分の課題は家に持ち帰ってやりました。小説は、高校入学時に、「高校卒業時には3年間の成果として何か作品を作る『課題研究』をやる」と聞いていたので、2年間かけて構想と執筆を繰り返しました。また、プログラミングも中学の知識だけでは足りないと思い、ゲーム作りから学べるJavaのプログラミングの参考書を購入し、分からないなりに勉強を進めて行きました。中学の頃からプログラミングをしていましたが、どちらかと言えば娯楽要素の色合いが強かったのを覚えています。

 少し話はずれますが、プログラミングはVisual Basicから始めました。こちらもゲーム作りで学べるという参考書を購入して勉強しましたが、当時の私にはよく分からず、Visual Basicは同じでもWordやExcelなどで動くVBAの中でプログラミングしていました。当然、参考書と同じソースコードで動くはずなどなく、なぜ動かないのか悩み、よく理解しないままソースコードの断片だけで動かそうとしたため、基本構文(if,for,while)などしか分かりませんでした。オブジェクト指向のある言語だったのにもかかわらず、そこまで行けなかったのが悔しい思い出です。

 話は戻り、高校入学時に学んだJavaでは環境構築にてこずったりしましたが、オブジェクト指向も何とか理解し、ある程度APIの使い方が分かるぐらいになりました。その参考書ではどうやら誤植があるらしく、「本に書いてあることだから間違いないだろう」と疑わなかった当時は何故ソースコードが正しく動作しないのかが分からないまま参考書の最初に戻ったりソースコードを何度も打ち直していました。後で添付されていたソースコードをコピペして動作を確認し、誤植だったことに気が付いたときには悔しかったものです。また、Java基本情報技術者の試験の際に選んだ言語だったので、課題研究の活動に本格的に入る前にオーバーロードやオーバーライドなどの違いや基本型、参照型の違い、パッケージなど様々な事を学べたおかげで、ゲーム作りで基本的なことで躓くことが少なくなりました。ゲーム作りに関しては、1年生の頃から周りに協力を持ちかけていたこともあり、多くの人が興味を示してくれて、最終的にチーム決定時には10人という当時最大の人数でゲーム作りに挑みました。同じ学科の教員の方々には「やっぱりか」といった感じで見られていましたが、同じ部活動の顧問である方が担当教員になってくださるなど、人に恵まれていたこともあり、私一人では絶対に作れないものが作れると確信しました。私はお話を考えるのが得意なのですが、絵や音楽などマルチメディアを製作することが苦手な人でした。そこで、チームを複数の部門に分けることにし、それぞれシナリオ、プログラミング、サウンド、グラフィック、PVの5つの部門に分けてそれぞれに指示を与えました。私の指示で各自が指定した成果物を作り、その成果物を私がプログラムでまとめあげるという段取りで進めて行きました。まず、予め1、2年生の段階でゲーム作りに興味を持ってくれた人に作った小説を読んでもらい、キャラクターのイメージや物語の世界観などを覚えてもらいました。次に、3年生となり本格的に製作が始まった時、グラフィック班にはキャラクターの性格や特徴、バックグラウンドなどをまとめて提供し、キャラクターデザインをしてもらいました。

また、小説を再編し、シナリオを構成して必要なイベントCGの指定を行いました。サウンド班には、ゲームで用いるSEのフリー素材を探してもらうとともに、世界観に会うようなBGMを製作してもらいました。BGMはそれぞれ使用する場面を指定し、作りやすくなるよう配慮しました。PV班には動画作成の練習からしてもらい、後で完成するグラフィック班やサウンド班の素材を用いてPV動画を作ってもらうことにしました。

 完成した素材を用いて、まずは画面遷移の設計に取り掛かりました。主にタイトル画面、セーブデータセレクト画面、チャプター画面、ストーリー画面などに分けました。また、それぞれの画面で使うGUIパーツの設計を行いました。GUIは全てGraphics2DクラスとSwingクラスから作成したので、文字列幅との調整に苦労しました。特に、ウィンドウを作るところが苦労しました。Graphics2Dクラスで文字列を描画するのですが、この時の文字列の高さにあったウィンドウを作らなくてはならなかったので、目視で文字列のフォントサイズを変更し、測りながら、それに合わせてフォントサイズを算出する式を作り、それに合わせてウィンドウの幅を調整するようプログラムしました。ウィンドウから文字列がはみ出したり、ウィンドウが大きくなりすぎないようにするのが大変でした。そこから、あらかじめ作っておいたストーリーをキャラクターと連動して表示させられるよう、テキストファイルの中に表示する文字列と制御用の文字を書き込み、実行時にはそれを読み込んで適切な画像と背景調整を行えるようにしました。さらに、ストーリーを読み進めたところを保存し、プレイヤーの基本的なデータなどと共に保存するように現在時刻やチャプターとストーリーの進捗状況などを読み込んで保存するクラスを作成しました。さらに、ストーリーのチャプターの初めにはアニメーションでサブタイトルを表示できるように、同じくGraphics2Dクラスを用いて座標を時間ごとにずらしながら、そしてただアニメーションにさせるのではなく、途中で遅くなったり、早くなったりと動きのあるアニメーションにするようにプログラムを調整しました。加えて、完成した素材が足りなかったので、背景の無い画面をせめて何か面白いものにできないかと、水面の波紋が伝わるように円を書いたり、コンピュータの世界を表現するために座標を表示させたりと、これもGraphics2Dクラスを使って前時代的なコンピュータを表現してみました。ここまででプログラムはEclipseを用いて作成し、JMFというフレームワークを音楽再生のために導入しました。

 

 2つ目の内田クレペリン生成プログラムは、まずクレペリンと言うものがどういうものなのかを調べて作ることにしました。使用した言語はJavaで、SwingというAPIを用いることにしました。まず、手始めにA4の紙を全て埋めるだけのフォントサイズと文字数をWordで確認し、その数だけ乱数を出力するようにしました。乱数は3~9の数字が出るように調整し、生成した乱数を文字列として一つずつ結合させていきました。結合させた文字列をファイルストリームに出力し、.txtファイル形式として保存させるようにしました。また、プログラムを起動したときのカレントディレクトリ下に予めログファイルを出力し、これまでに生成したクレペリンのファイルを起動するたびに確認と記録をすることで、ファイル名が被らないようにしました。ここまでのプログラムを開発するのにEclipseを使いました。苦戦したのは、使ってもらう人にとってクレペリンをやりやすい文字の大きさを測ることでした。プログラム自体は苦戦することなく作ることができたのですが、利用者の目線にあった配慮をすることを知らずに自分なりに作っていたので、フォントサイズを少しずつ変えたクレペリンを作成し、使ってもらう人に見てもらい、レビューを得てからフォントサイズを調整するマクロを記録しました。

 

 3つ目の注意力配分テスト対策プログラムは、同じくJavaを用いました。そのなかでJavaのSwingクラスでウィンドウを生成し、Timerクラスを使って時間測定を行いました。この時クラスの概念が分かったというのは、50個のボタンを一気に配置する際に、一つずつクラスの宣言を形式的に行うのが面倒に感じられたので、なにか一気に生成する方法が無いかと探っていたところ、for文でインスタンスだけを生成してしまうというやり方を見つけたことでした。一つ一つの変数にアドレスを格納するのではないやり方があったのを知り、ここからオブジェクト指向というもののやり方が分かりました。また、Timerクラスで開始時間から終了時間までの差を求め、最終的な経過時間をJFrameクラスのウィンドウタイトルに設定するようにしました。そして、押すボタンを間違えた時には、sleepメソッドで操作を受け付けないようにしました。

 

 4つ目の記号を生成するプログラムは、これもまたJavaを用いました。まず、乱数を記号の種類の分だけの範囲内で生成し、3つ目のプログラムで培ったインスタンス生成の方法を用いてボタンをグリッド上に並べました。次に生成した乱数をそれぞれの記号に関連付け、関連した記号を正解の記号の組み合わせと間違いの記号の組み合わせの文字列にそれぞれ変換し、ボタンの表示文字列として設定し、間違いのボタンには予め配列の中に間違いを示す値を格納しました。ボタンが押された時、格納された値をチェックし、間違いかどうかを判定するようにしました。

 5つ目の換字式暗号解読プログラムは、CとJavaで作りました。まず、プログラムが受け取る可能性のある文字列を一文字ずつ文字型の配列に分解、格納し、指定された値(デフォルトだと13文字)分文字をずらすようにしました。このとき、小文字・大文字の区別はそのままの状態で維持されるようにし、記号や文字として認識されないものは元の状態から変更しないようにしました。

 

 6つ目のクイックランチャーは、PowerShellを用いました。まずは、普段よく使うであろうアプリケーションの一覧をリスト化し、そのアプリケーションのショートカットや実態があるディレクトリのアドレスもリスト化しました。次に、同時に起動させたいアプリケーションやプログラムなどの組み合わせもリスト化しました。それぞれリスト化したものを、PowerShellスクリプトを用いてエイリアスを作り、短縮表現ができるかを考えながら最適なエイリアスを設定しました。

 

 7つ目のタイピングプログラムは、Javaを用いました。まず、問題と答えからなるクラスを設定し、そのクラスに必要なメソッドや動作が何かを考え、設計しました。次に問題文を表示して解答文字列を受け取り、その問題と答えが一緒かどうかを確認する、プログラムの核となるクラスを設計しました。その後、設計したクラスを実装し、表示する問題の内容を考えました。暗記物のなかでもコマンドや何かの名前を覚えるためであればタイピングしやすいと考え、それらをクラス内に実装しました。

 

 8つ目のスライドは、PowerPointを用いました。視覚的に良いレイアウトを作るために、2007バージョンからはSmartArtという機能を使うことにしました。発表する内容に合わせ、階層関係やリストなど最適なSmartArtを選択し、見栄えも良くするためカラフルに設定しました。また、SmartArtだけでは表現が難しい時、アニメーションを設定することで説明したいことの流れを分かりやすくするようにしました。アニメーションは、ただ表示させるだけでなく、一つのオブジェクトが出現したり、変形したり、消えたりを繰り返すことで、ちょっとした動画のような動きをするようにアニメーションウィンドウで遅延や同時動作をするように設定しました。

 

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

 当時ブログを持っておらず、開発記のような記録も残していませんでした。また、コンテストには出品したことがありませんでした。唯一それっぽいものがあるとすれば、1つ目に作ったものとして挙げているノベルゲームが、石川県小松市の平成27年度課題研究発表会において作品として載っています。七尾東雲高校の課題研究発表会にも作品があります(公にされているかは分かりません。最近公式ホームページの改変があったらしいので)

 今更ではあるのですが、開発記やブログを通じて自分のやったことを記録しておくことは大切なことだと実感しています。それも、自分のやったことを記録することは、自分の記憶を整理することに繋がり、学んだことを後で見返すことができたり、現状の問題点などを明確にしやすいからです。今もブログのようなものは持ち合わせてはいませんが、大学の中にある研究室のサーバーをお借りすることができたので、そこで開発記やブログを作成する予定です。今は、ブログを作るのに必要な情報や、どのようなレイアウトにするかなどを考案中です。

 

共通問題2

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

 私が経験した中で一番印象に残っている技術的な壁は、マルウェアの解析や、リバースエンジニアリングをツールなどを用いて行うことです。

 

 まず私は、プログラムがどのように実行されているかがプログラミング言語のレベルでしか分からなかったので、今までの勉強を頼りにしてアセンブラ言語を勉強しなければならないと感じました。それから、アセンブラ言語を勉強したその先はどうすればよいかを調べていたのですが、良く分かりませんでした。当時は、「リバースエンジニアリング」という単語を知らず、「プログラムの中のさらにその中を勉強する」という概念だけが独り歩きしていました。

 ひとまずCPUの動作について勉強し、インターネットなどで調べてようやくリバースエンジニアリングという概念が分かってきたところで、初めて技術的な壁にぶつかりました。それは、そもそものプログラムの中を見る方法が分からなかったことです。実行可能プログラムの拡張子を.exeから.txtなどの適当なテキストファイルに変更して、中身を見てみようと考えたのですが、訳の分からない文字の羅列があったことを覚えています。私がそこで見たかったのは、実行プログラムの中身であるアセンブラコードでした。最初は実行プログラムの中身はアセンブラコードだけだろうと思っていたので、意味不明な文字列の文字コードアセンブラコードを表示するための文字コードとは異なっているだけだと思い、表示方法を変えたり文字列の読み方を無理やり変えてみたりしてアセンブラコードを出そうと思っていたのですが、うまくいきませんでした。今考えてみたら文字コードを変えたとしても機械語バイナリと別物であるため意味がない上に、実行プログラムはアセンブラコードに加え実行時に必要なパラメータ等が設定されているので、変なことをしていたと思います。本で読んだ知識をどうやって生かせばよいのか分からず、実際の動作部分のコードすら判別できないというのは苦痛でした。これが、1つ目の技術的な壁です。

 

更に、ようやくプログラムの解析に必要なツールやエディタが分かったところで、解析をしようと簡単なプログラムを自分で作り、それをリバースエンジニアリングにかけようとImmunity Debuggerでプログラムを開いたところ、自分の書いたコードが一体どの部分にあるのかが読み取れませんでした。分かりやすくするためにCで書いたプログラムには自分の分かる文字列を表示させるようにしてあるのですが、その文字列がImmunity Debuggerの表示されているどこにも見たらたなかったのです。表示されるアセンブラの動作は理解できるのですが、そのアセンブラが自分のプログラムでいうどのコードを実行しているのかが分かりませんでした。プログラムのエントリポイントと言うところも良く分かっておらず、抽象的な概念しか分かってない状態で物事を進めていてはいけないと実感させられました。これが二つ目の技術的な壁です。

 

エントリポイント、実行プログラムやインポートテーブルなどの理解ができ、ようやく自分の作ったプログラムとコンパイラやリンカが勝手に作った処理との区別がつくようになったころ、私はマルウェア解析の練習のため、先輩が自作した(害のない)マルウェアを解析しようとしてみましたが、今度はツールで知りたいことを知るための手段ややり方が分かりませんでした。Win32APIを用いたマルウェアだとどのようなWin32API関数を用いているのかを知れば良い、ということは分かっていたのですが、バイナリエディタでは見つけることができたKERNEL32.DLLやMessageBoxA関数などの一覧を、Immunity Debuggerでどのように表示するかが分からなかったのです。先輩がやっているようなDLLインジェクションなどの作業をする場合インポート関数の一覧をすぐに表示できるようにしなければならないのですが、リバースエンジニアリングをまともにやったことがないど素人にはImmunity Debuggerのようなツールはあまりにも機能が豊富で協力すぎるので、まともに扱うことができませんでした。これが、三つ目の技術的な壁です。

 

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

私が取った解決法は大きく分けて二つあります。1つ目は物事の根底の事象から不明確な事象をなくしていくということです。私が解析しようとしたのはWindows上で動作するプログラムで、ゆくゆくはWindows上で動作するマルウェアも解析したいと考えていました。そのためにも、OSとその上で動作するプログラムの仕組みを理解する必要がありました。そこで高校の頃まで馬鹿にしていたC言語を見直し、ポインタやメモリに関する事を再度復習しました。C言語の学習には「詳説 Cポインタ」という書籍を用いました。この本を読んでポインタに関する理解やバッファオーバーフローなど解析に関連する他の分野のことも学ぶことができました。また、発行元のオライリー・ジャパンつながりで「アナライジング・マルウェア」、「リバースエンジニアリング」「デコンパイリングJava」などArt Of Reversingシリーズ中心に様々な書籍を読みました。この本でリバースエンジニアリングに必要なツールや便利なプログラムを知ることができました。特に、WindowsのプログラムはPEヘッダーの理解がかなり重要だったので、アナライジング・マルウェアの存在はとても大きく、そこに載っているプログラムやサイトを漁ることである程度の知識を身につけることができました。他にも、「HACKING:美しき策謀」や「リバースエンジニアリングバイブル」、「楽しいバイナリの歩き方」、「デバッガによるx86プログラム解析入門」なども読むことによってリバースエンジニアリングに必要な知識や分かってきました。また、マイクロソフトの発行している「インサイドWindows」という書籍やMSDNなどの公式の情報を頼りにすることで、Windowsがどういった仕組みで動いているのかを調べました。他にも、CPUの動きを掴むために「コンピュータシステムの理論と実装」という書籍も読みました。これらの書籍を読むことで、コンピュータサイエンスの知識を深く掘り下げられた気がします。更に、インターネット上で見つけた「Reverse Engineering for Beginners」というPDFを見つけたので、それも翻訳しながら読んでいます。また、リバースエンジニアリングの書籍内容でデバッガを作るという内容に挑戦していたところ、x86の環境下でないと動作しないコードがあったので、その点についてはVMwareをインストールし、大学で締結しているDreamSparkからWindows 7の32bit版をダウンロードすることで対処しました。また、書籍やインターネット上の知識が英語ばかりになってきたので、英語の勉強もしました。まだわからない単語や文法、表現があるので、今でも勉強は続けています。英語を読むことが大切なのだと身に染みました。

 2つ目の方法は、人に聞くということです。すごく単純な方法だったのですが、私にはそれができないでいました。というのも、人に聞くのは自分にとって「敗北」を意味するからと人に聞けなかったのです。今、私はセキュリティのプロジェクトに所属しているのですが、そこにはWindowsマルウェア解析に関する技術にとても長けた先輩の方がいます。その人に聞くのもありだったのですが、私は「きっとこの人は自分なりに色々とやってみて、分からないながらも模索しながらここまでたどり着けたのだから、私もそうしなければこの先通用しないのではないか」と考えていました。そして負けず嫌いな性格とちっぽけなプライドが邪魔をして、誰にも聞かず、一人で黙々と進めればよいと考えていました。しかし、そううまくいくはずもなく、技術的な壁に遭遇してしまい、どうすることもできず悩んでいました。このままではいけないと、何かやり方を変えなくては前に進まないと思い、プライドを捨てて聞いてみることにしました。先輩の方は、嫌な顔一つせず私の疑問を解消してくださいました。聞き終わった後、私はこんなに単純なことで済むのかと今までの時間がとても無駄に思えてきました。そこで悟ったのは、一番恥ずかしいのは聞くことじゃなく、知らない事だということです。いつまでたっても意地を張り何も知らないまま役立たずになるよりも、恥を捨てて素直に分からないと良い、教えてもらって理解できればそれでいいと思います。ある程度は自分で考えて自分で模索しなければなりませんが、先に進めない状態というのが一番ダメな状態だと思います。

 また、先輩や友達から聞く話だけでなく、彼らがお勧めする書籍などを読むこともしてみました。私だけでは知りえなかった書籍がたくさんあり、もっと早めに知っておけばよかったと思うほど良い書籍もありました。先人から習うというのもいいですが、やはり良書に出会うというのもまた良いものです。

 

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

私がアドバイスを送るとすれば、以下のアドバイスを送ります。

 ①いきなり全てのことを学ぼうとしないでください。何かの技術(この場合はリバースエンジニアリング)をマスターしたい気持ちは分かりますが、それではいけません。周りの人たちがとてもその分野に長けているからと言って、焦ることはありません。最初はできる事から、あるいはできそうなことから始めてください。ハードルを高く設定するのは良いことですが、無理をして理解が難しい書籍を勉強したり、実際のリバースエンジニアのように短時間で高度な解析ができなければならないと思わないでください。大切なのは、自分が将来着実に能力を手に入れていることです。高すぎる目標の前でずっと苦戦して、なかなか知識や技術を手に入れられないようではいけません。常に自分自身が達成すべき適切な目標を考え、着実にレベルアップすることを心掛けて下さい。もちろん、勉強することがどうしても最初から難しいことだってあるでしょう。そんな時は、「分からない」と思うことを「何が分からないのか」と考え直し、それを明確にすることで、大きな問題を小さな問題に分解してください。そして、その小さな問題を少しずつ分かるようにしていって下さい。

 ②臆することなくまず手に入れた知識を実践してほしいです。どんな些細なことでもいいから、まずは自分自身のI/Oの力を強化し、少しでも何かに応用が効かせられるよう体に知識を刷り込ませてほしいです。本を読んでばかりでは何も進みません。教養を得るのは良いことですが、それを活かさなければ宝の持ち腐れになってしまいます。だからと言って、実践にこだわりすぎず、時には理論も大切にしてください。理論と実践のバランスが必要です。

 ③広く情報を収集してください。インターネットには様々な情報が落ちています。しかもそれは殆ど無料で手に入ります。お金のかからない勉強はとても良いものです。失うものは何もないのですから、とにかく情報を収集してください。また、情報を収集した後は、その情報を整理する必要があります。一度手に入れた情報は体系的に揃えることでより記憶に残ります。そして得られた情報で何かをやってみた後は、また情報収集してみてください。一度情報収集したからと言って満足せず、新たな情報を貪欲に集めてください。

 ④英語や数学などの基礎学力を疎かにしないでください。私は工業高校出身なのでそういった基礎学力が遅れています。私は当時情報系の勉強をひたすらすればいいと考えていました。ですが、大学に入学してからというものの、高度な情報系の勉強をするには英語や数学が前提条件として必要なのだと思い知らされました。今回のリバースエンジニアリングの例で言えば、Reverse Engineering for BeginnersやMSDNを読み解く際に英語力が必要になりました。英語は好きだったので翻訳しながら読んでいくのは苦痛ではありませんでしたが、もう少し真面目に英語の勉強をしていて英語力が備わっていれば、より効率よく情報を手に入れることができたと考えています。この例に限らず、新たな技術の発展は主に英語圏で行われることがほとんどですし、情報発信も最新の情報を手に入れるには英語が必要です。普段から英語に触れるなどして、慣れておいてください。最近ではTEDのアプリなど英語を学ぶ環境は非常に豊かになっています。だからと言って、完璧な英語力を求めてはいません。ある程度文章の内容が理解できる程度で十分です。必要以上に時間を割いてリバースエンジニアリングの勉強ができなくなるのでは本末転倒です。

 ⑤良い友人や先輩、先生と巡り合ってください。どんなに頑張っても、必ずどこかで行き詰ることがあります。いつまでも意地を張らず、素直に聞くということをしてください。直接その問題に対する答えが出るとは限りませんが、ヒントぐらいは得られるはずです。そして、競い合う仲間がいてもいいと思います。勉強を一人でただひたすら続けるのはモチベーションを維持するのがそう簡単ではありません。悔しいと思いながらでもいいですから、やる気を保ってくれるライバルのような存在を見つけてください。仮にライバルに負けていたとしても焦る必要はありません。負けていると感じるならば、自分が足りないものは何なのか、相手の長所を見つることも重要です。ライバルの存在は、きっと自分の能力をより高みへと導いてくれるはずです。

 ⑥勉強会やプロジェクト活動には積極的に参加してください。④と似たようなことなのですが、良い人を見つけるのに一番手っ取り早い方法は似たような考えや目標を持つ人の集まりに参加することです。幸い、今は勉強会と言うものが全国各地で行われています。その中でリバースエンジニアリングに関する勉強会も存在するはずです。そこで出会える人たちとコミュニティを形成することで、様々な情報交換をしてください。

 ⑦ここからのアドバイスは技術的な内容になります。まず、コンピュータサイエンス全般に関する事を学んでください。私は基本情報技術者応用情報技術者などの書籍を読むことで学習しました。これはリバースエンジニアリングとその後に繋がるマルウェア解析のために学んでほしいです。これが分からないとどの書籍を読んでも全体像すら掴むことが難しいため、絶対に学んでほしいです。資格の勉強にもなりますし、得られる情報はとても幅広いものです。決して損はしません。

 ⑧C/C++プログラミング言語を学んでください。Pythonのようなきらびやかな言語を学んでセキュリティを勉強するのもよいのですが、やはりC/C++はセキュリティの基礎的なことを知ることができる良い言語です。それは言語上の特性が脆弱性を多く秘めているということにもつながるのですが、自分で実践するには良い言語です。メモリの内容を直接操作することができる上、ポインタという概念にも触れることができます。それを学ぶ上での書籍が多いのも事実ですし、WindowsのほとんどがC言語で書かれているという事実もあります。Windows上で動くプログラムを解析したければ、Cという言語は必須ともいうべきです。もちろん、Pythonでも勉強することはできますので、一通りC/C++に慣れたら、Pythonや、他の言語を学ぶこともお勧めします。

 ⑨アセンブラ言語を学んでください。C/C++という高級言語を学んだら、次はCPUに近い言語を学んでCPUの動作を覚えてください。ここに来ると書籍が一気に少なくなり、内容も複雑になってくると思われます。しかし、やっていることは単純な動作の繰り返しです。アセンブラを読み解くときは、落ち着いて、確実に動作をトレースしてください。細かい動作を理解しないまま焦って一気に読み飛ばそうとすると後々躓きます。

 ⑩PEヘッダーなどのWindows固有の事柄について学んでください。リバースエンジニアリングをしようと思ったのなら、その対象となるプログラムが動く環境のことについても知る必要があります。特に、PEヘッダーにはプログラムを動作させるうえで重要な情報が大量に記されています。PEヘッダーに記されているそれぞれの数値の意味を知ることはプログラムの動作を学ぶ上でひらめきと発見をするための道のりであると考えています。また、WindowsというOS自体の勉強をすることもお勧めします。マルウェア解析において、マルウェアは外部との通信を試みる場合など動作は多岐に渡ります。その時、どのようなハードウェア資源にアクセスしどのようなことを行っているのか、などを知る必要があります。その上、WindowsAPIの理解も必須です。マルウェアは自身が解析されているかどうかを調べることもあれば、ウィンドウの生成やファイルへのアクセスなど、様々なことにWindowsAPIを利用するかもしれません。プログラムとAPIの仕組みについても理解することが重要になります。

 ⑪ツールの使い方を学んでください。ツールから全て自作するぐらいの力があるのは良いことですし、また深く知識や技術が身に付きますが、自作でもしない限り達成できないと言わないのであれば、既存のツールを用いて目的を成し遂げた方が効率的です。ツールの製作に時間を費やすのではなく、あなたがやるべき目的の本質に時間を費やしてください。良いツールがたくさんあるのに、それらを使わないのはもったいないです。また、ツールは一つだけとは限りません。デバッガの例で言うと、WinDbgやImmunity Debugger、OllyDbgなど種類は様々です。どれも一長一短ありますし、どれを使うのが正解ということはありません。状況に応じて使い分けができるようになってください。また、ツールはショートカットキーが豊富です。GUI操作は可能な限り避けて、ツールに設定されているショートカットキーを積極的に使いましょう。

 

共通問題3

(1)あなたが今年のセキュリティ・キャンプで受講したいと思っている講義は何ですか?(複数可)

 そこで、どのようなことを学びたいですか?なぜそれを学びたいのですか?

 私が学びたいと考えているのは主に低レイヤーに関することですが、ネットワークや検知など全てのことについて学びたいと考えています。ですが、それではけじめがつけられないと思ったので、キャンプの時間割を考えてみました。以下はその時間割とその理由です。

 

■1-D Dissecting Malware - x86 Windows malware analysis -

 マルウェアをひたすら読み解くというのが一番のポイントです。私はプログラム(マルウェア)解析のため書籍を読んでいますが、実力不足でどれも実践ができないことが多く、いざ解析をしようと思ってもツールの具体的な使い方や、自作デバッガでのアタッチの方法が分からない、あるいは知りたい挙動を見つけられないなどできないことが多くあります。マルウェア解析はセキュリティの企業をもってしても日々開発される亜種の数に追いついていないと聞いたことがあります。その膨大な種類のマルウェアを解析して少しでも追いつきたいのですが、それ以前にマルウェアを解析する実力が無いのでは話になりません。勉強していても、エントリポイントにたどり着いた後にトレースしてもコードのどの部分を見なければならないのかよく分からなかったという悔しい思い出があります。私はそれがとても恥ずかしいことに感じられます。書籍で身に付けた理論が分かっていても、実践で解析できないのでは笑われると思っています。私がこの講義で得られると考えているのは解析技術の経験です。経験を通して初めて分かることがたくさんあるのは他の講義でも同じですが、ナイーブな場所故に様々な解析上の障壁があるはずです。そういったことは実践で初めて得られると思われます。逆アセンブルコードを読み解くとありますが、講師の方が膨大な数のコードのどこに注目して、どのような手順で効率良く進めて行くかを一番学びたいです。私が考えるに、マルウェア解析は要点を絞ると観察すべき場所が少なくなるのではないかと思います。そのためにはまず、その「要点」を知らなくてはなりません。講師の方も「効率良く」と強調されているので、要点がどこかに存在するはずです。また、そこでツールなどを用いるのであればその使い方も学びたいです。手動で読み解けていくことも大切な技術ですが、ツールを使って効率的に進められることがあるのであればそのテクニックや使い方や連携方法なども学びたいと考えています。他にも、実際のマルウェアを解析する点で躓きやすい点も学びたいと思っています。マルウェアは難読化されたり、パックされたりしてリバースエンジニアリングの対策を講じているはずです。それを見越し、アンパックや難読化されているコードに対する読み方、考え方なども知りたいです。加えて、マルウェアの典型的な挙動や動作なども知りたいと考えています。様々なマルウェアが存在するとはいえ、ほとんどは特定のマルウェアの派生形だと聞いたことがあります。その元となる動作を知り、様々なマルウェアが行っている一般的な動作を知ることで、解析できるマルウェアの幅を広げたいです。これらの経験を積むことで、今後一人でも解析を進めて行けるための基礎地盤としたいと思います。

 

■2-A スマートフォン向けゲームのセキュリティ

 私も含めて殆どの人が所有している為、学んだことを応用させやすいと思ったのがポイントです。技術が普及し、小学生でもスマホを持ち歩くようになりました。それだけターゲットが増えたことも意味します。しかし、エンジニアならともかく、小学生などの知識がない人に技術的対策を教えるのは無理があります。知識や技術はないけど、ゲームをプレイするユーザーは多いという状況は私が考えるに最悪の状態だと思います。付け込まれる可能性が高い以上、そこに注目した対策を知りたいのです。この講義には通信解析がキーワードとして挙げられています。膨大な数のパケットの中でどのようにしてその通信を突き止め解析するのかが予想が付きません。専用のアナライザや、サーバー側に何か埋め込むのか、など詳細な手順を伺いたく思います。そして、ツール群で通信内容をある程度絞っても、関係ない通信パケットは大量に存在するはずです。解析をする際に、講師の方が脳内でどんな通信をフィルタリングしているのか、どこの通信に注目しているのか、どういった内容の通信が危険だと考えているかも伺いたく思います。また、通常のLANの環境下だけでなく、スマートフォンという通信端末も通信内容を解析できるようになりたいと思っています。ゆくゆくは、様々な通信環境下でも通信を解析できるよう経験を蓄えたいです。加えて、スマホのアプリもリバースエンジニアリングするのが楽しみです。いずれモバイル端末のアプリ解析が主流になると思われます。x86などの環境下で動くプログラムの解析も必要ですが、Javaなどのバーチャルマシン上で動く中間言語リバースエンジニアリングも今後必要になると思われます。そういった点でもこの講義は見逃せないと思います。気になっている点は他にもあります。ゲームのセキュリティとは一体何かと言うことです。今まで脆弱性と言うのは業務システムのようなもので見つかるのが一般的だと考えていました。ゲームでも脆弱性は起こり得るとは思っていましたが、それは「バグ」のことなのか、仮にバグだったとして、バグの中でどうやってセキュリティを脅かすような事態に発展させられるのかが気になるところです。

 

■3-C 脆弱性検出実践(ファジング技術と脆弱性報告)

 いずれ何らかのソフトウェアを開発することになるでしょうが、完璧にセキュリティを意識して開発するのは困難です。ですが、受けやすい攻撃パターンなどを逆手に取り、それに関する脆弱性を重点的に埋めていくという手法に魅力を感じています。と言うのも、私は今のセキュリティ技術者がなるべく不必要な知的労働を避けて本来の重きを置かなければならない業務に集中できれば良いと考えています。もし私が企業の中で技術者に対して仕事を与える立場にあるならば、セキュリティ技術者がパフォーマンスを割いて一つ一つ脆弱性を調査していくのは、その人のやるべきことではないと思います。全体からすれば、もっと複雑で解析が困難なものに仕事を割り当てたいと考えます。ファジング技術は機械的に攻撃することで大まかな脆弱性を洗い出すことができるので、私もその技術を習得したく思います。数多く開発されるソフトウェアに追いつくためには、ファジング技術は必須の技術だと考えます。また、脆弱性報告の仕方を実践できるとあり、私もセキュリティ界に少しでも脆弱性報告で貢献したいと思います。また、脆弱性の情報はJVNや各種メーリングリストで公開されています。その様な情報があるにもかかわらず、私はそれを見ても断片的にしか内容を理解することができません。折角良い情報が流れているのにそれを吸収できないのはもったいないです。だからこそ、この講義を活かして、JVNや各種メーリングリストから配信される脆弱性情報を読み取れるようになり、日々更新される情報や更なる脆弱性への知識を深められるようになりたいです。またこの講義ではIoT機器に対するファジングを行うとありました。通常のアプリケーションに対するファジングであれば恐らく一人でも勉強は難しくないと考えます。ですが、IoT機器では実機を揃えたりファジングするにも労力とコストを要します。IoT機器の何をファジングすればいいのかなど、学生でいるうちには中々経験できないことがこの講義には詰まっていると思われます。これは、IoT機器もファジングしなければならない時代が近いと捉えることもできます。この講義を受けて、様々な製品でもファジングできるような技術を習得したいと思います。

 

■4-A クラウドセキュリティ基礎

 クラウドという仮想化技術をサーバ設計や構築などの管理側から関われるというのが私にとって重要なポイントです。今までクラウドのサービスを受けることしかできず、開発に関わる機会は全くありませんでした。ですが、この講義ではそれが学べるうえ、その上セキュリティを意識することができるのが大きいメリットです。私は大学に入学するまでインターネット環境が無く、Webという分野に触れることができず、理論的な部分しか学べませんでした。周りよりもインターネットに関わる知識が乏しいため、積極的にサービスを使ってはいますが、それでもまだ利用者側の視点でしか物事を取られません。この講義ではインターネット関連技術を構築側の視点で学ぶことができ、加えてクラウドについても学べるので、数多くの知識を吸収することができると考えます。また、今後クラウドありきのシステムが一般的になるでしょうが、クラウド上のサービスに脆弱性があった場合、そこを突かれてしまうと他のサービスやクラウドそのものが脅威にさらされるというのを学んだことがあります。クラウドにサービスを集約していると、クラウドを利用している自身だけでなく、他人にも迷惑をかけることに繋がりかねません。クラウドのセキュリティを確保することは、クラウドユーザをひとまとめにセキュリティを確保することができるというメリットになると考えられます(情報資源などを一つの場所に集約することが良いこととは限りませんが、効率とセキュリティの両方の面をバランスよくとっているものだと考えます)。いずれクラウドにも関わるかもしれないので、クラウドとそのセキュリティについて学ぶのは重要であると考えます。また、クラウドといえど動作しているのはあくまでサーバ上です。サーバについて本格的に学ぶにしても、予め動作している大学の研究室などのものを借りたりするか、特別なことが無い限り難しいと思います。ですがこの講義ではサーバについて設計から学ぶことができるとあります。この講義で得られる汎用性のある知識や技術を習得し、それらを活かして総合的にサーバ管理ができるようになりたく思います。また、これからも登場する新しい技術のセキュリティを学ぶための入り口としたいと考えています。

 

■5-B USBメモリからブートしてみよう

 OSのブートが様々な媒体やネットワークからできることは知っていましたが、そもそもOSが無い状態でも起動できるということを初めて知りました。ですが、OSはハードウェアをコントロールした上でアプリケーションを動作させているはずなので、どういったことをすればカラフルな画面が映し出せるのかとても知りたいです。恐らく、アセンブラを使ってハードウェアを操作する具体的なやり方が学べるはずです。アセンブラ言語を機械語に変換するというのは、アセンブラ言語と機械語の対応を学び、且つCPUの構造の理解にも一役買うのではないかと考えます。また、リバースエンジニアリングではアセンブラ言語の動作を頭に染み込ませておく必要があるので、アセンブラ言語を構築するというのは一番効率の良い学習法でもあると思います。そして何より、BIOS機械語などよりハードウェアに近い技術が学べるのはこの上ない機会です。私が考えるに、特定の環境が揃っていないと何もできないエンジニアではこの先生き残っていけないと思います。ある程度、自前で何かを作り、自分の技術力のみで与えられた業務を遂行できるような人材でなければならないと考えます。その点からして、OSの無い環境や、BIOSを自由に操れることは重要だと考えます。この講義ではUSBメモリでブートするというのがとても汎用性のある技術のように感じられます。USBデバイスは殆どのPCに搭載されており、この講義が終わった後に自分でUSBメモリのプログラムを書き変え、自分なりにアレンジすることでよりOSとBIOSに触れ、理解を深めることができると考えます。また、自分たちでOSが無くとも動くプログラムを作成するということは、それ自体がOSのような役割を果たしているのだと思います。つまり、自作OSを作る練習になると思われます。自作OSは兼ねてから作りたいと考えていたので、ハードウェア資源の管理方法を学ぶ良い機会になると同時に、低レイヤーと高レイヤーをつなぐための仕組みや関連、デバイスドライバについての理解なども深めることができると考えます。現在、私はインサイドWindowsという本を読んでいますが、ハードウェアとソフトウェアの両方の知識があるとより理解しやすいのだと感じました。私は、この本を読む際の理解の手助けになるような知識をこの講義で得たいと思っています。

 

■6-D リバースエンジニアリングを自動化せよ

 自動化と言う技術にはいつも惚れ惚れするほど惹かれる言葉ですが、そもそもセキュリティエンジニアが解析しているマルウェアやアプリケーションをそう簡単に自動化することは困難なはずです。しかし、人間のやる作業の中でも形式的にやっていることや同じことを繰り返していることも多くあるはずです。その点では自動化は不可能ではないと思いますが、この講義ではそれだけにとどまらず、脆弱性発見にも応用すると書かれています。つまり、解析や脆弱性の発見を自動化することができるということは、それだけ解析時に注目すべきポイントが存在しているということです。少なくとも、講師の方は頭の中でルーチン化された作業を確立しているはずなのです。私は、講師の方の頭の中で自動化している部分が一体どんなものなのか、パターン化されている脆弱性にはどんなものがあるのか、そして自動化する際に用いるツールやプログラムは一体どんなものなのかを知りたいです。他にも、先進的なソフトウェア解析技術と言うものの中に、普段私たちが知りえないような技術が含まれているのかと思うと、興味の域を超えてワクワクするものがあります。自動化の技術はソフトウェアやマルウェア解析に留まらず、他の分野の自動化にも応用が効くと考えています。これからたくさんのマルウェアの解析をしていくでしょうが、恐らく何度も似たパターンのマルウェアに遭遇するはずです。それらの解析を自動化し、実行動作が違っている部分だけに集中して、様々なマルウェアについての知識を効率よく吸収できるようなツールを自作できるよう役立てていきたいと考えています。また、VirusTotalのようなマルウェアの情報があるサイトでまとめられている概要報告の情報も素早くつかむことができると考えています。とにかく、この講義には講師の方の「マルウェア解析経験」が凝縮され抽出されていると思われます。そのようなとても質の高い情報を得られる講義はそう巡り合えるものではないはずです。私は、1-Dの講義と合わせて勉強することで、マルウェア解析のスタートアップと加速を推し進められると思います。そして、今もなお活躍しているマルウェア解析技術者と肩を並べられるような解析ができる技術力を備えるよう強力な成長を遂げていきたいと考えています。

 

 

■7-B 組込みリアルタイムOSとIoTシステム演習

 リアルタイムOSという、制約の厳しいOSを学ぶ際、理論を分かっていても現実の更なる制約を学ばなければ、本当に組込みリアルタイムOSを学んだことにはならないと考えます。ですが、そのようなシチュエーションは自分で想定できるものではなく、設計・製作するのにも膨大な時間がかかると思われます。この講義では、それを実機で学ぶことができるというのが大きな魅力に感じられます。理論的な部分だけでは得られない、実践的な内容だからこそ得られるものがあり、そして質も量も良い知識と技術が得られると考えます。実機とは一体どんなもののIoTなのか、実例を知れるチャンスでもあります。それだけではなく、組込みリアルタイムOSと通信ミドルウェアの連携について学べると考えています。コンピュータの重要な機能である通信を、リアルタイムOSがどのようにして調整を図りながらデータを送受信させているのかが知りたいです。この講義の良い所は、実機の練習でありながら、ソフトウェアを中心に知ることができるという点です。私はハードウェアについての知識が未熟で、どちらかと言えばソフトウェア寄りです。そんな私にとってソフトウェアの面から学ぶことができるというのが大きなメリットです。また、私は通信ミドルウェアの動作がどのように行われているかが気になります。WireSharkのようなアナライザを使ってパケットを解析するのは良いのですが、それはあくまで受け取った通信の内容のみで、その通信自体を構成している通信ミドルウェアの動作がどうなっているのかまでは知ることができません。ただデータとして表示されている内容を解析して満足するのではなく、どういった動作をして初めて通信が成り立っているのかを知りたく思います。他にも、組込みリアルタイムOSはOSです。基本的な考えはどのOSにも共通して言えるはずです。つまり、全体としてOSの理解も深めることができると考えます。この講義で私はコンピュータアーキテクチャコンピュータサイエンス全体に関することについて学べると思っています。そして、コンピュータそのものを作ることができるための布石を置き、更なるコンピュータアーキテクチャ・サイエンスの理解に繋げていきます。

 

 この他にも、様々な講義を学びたいと思っています。楽しいバイナリの歩き方という書籍の著者である愛甲健二さんの講義は気になるところです。ヒューステリック技術が大体どのようなものかは理解できるのですが、具体的にはどういったプロセスを経て検知を行っているのかが気になります。そして、集中講義の「なぜマルウェア解析は自動化できないのか」という講義も興味があります。6-Dの講義と相対するような内容なので(最終的にはどちらも「可能の限界」に至りますが)、二つの講義の主張を突き合わせてみたら面白いことが生まれるのかもしれません。

 

 この時間割で私が目的としていることは、総合的な知識をまんべんなく取り入れることです。なるべく特定の分野に偏らないものにしました。それは、今後幅広い視野と可能性を見失わないようにするためです。どの講義も受けてみたいですし、欲を言うなら全部の講義を通してたくさんのことを学習したいです。今の私に必要と考えているのは、今後の活動のために必要な知識の地盤固めです。これをしっかりして、更なる応用につなげていきたいと考えています。

 全体を通して私が学びたいのは、理論だけでは得られない知識と、生の環境と実践を通した体に染み込む技術です。

 

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

 私はセキュリティ・キャンプで、とにかく分野に縛られず色々なことをやってみたいです。まずはリバースエンジニアリングマルウェア解析についです。私は物事の根底にある事象に興味があります。情報機器以外で言えば原子や分子、メタ認知などと言ったことです。コンピュータでは、ソフトウェアの一番の原子である機械語レベルについて学びたいのです。機械語の詳細な手順や動作だけであれば市販の書籍やデベロッパーズマニュアルなどを読めば済みますが、それを「利用していること」については書籍だけでは限界があります。つまり、(機械語に限らず)仕様の弱点を見つけるための技術や知識などが必要であり、私はそれをとても知りたいです。脆弱性というのも、仕様の中で製作者が予想もしない事だと私は考えます。そういったことを知るためには、実際にリバースエンジニアリングマルウェア解析をしてみるというのが一番です。そして物事の根底と言うのは色々な部分に応用が効かせやすいものです。高レイヤーで動くアプリケーションも、最終的には低レイヤーの機械語に落とし込めます。どんな些細な動作も低レイヤーの視点から見ることでしっかりとその動作を捉えることができます。その動作を捉えるためにも、リバースエンジニアリングマルウェア解析はとても良い「関門」なのです。何かのプログラムには、何かの目的や存在意義があり、それを突き止めるにはその製作者がどのレイヤーからの視点にいても対応できる必要があります。一番下のレイヤーからの技術や知識を得ることで、製作者の意図を知ることができます。他にも、以下に続くハードウェア全般のことに繋がりますが、低レイヤーを知ることは、コンピュータを制することに近いと考えています。だからこそ、リバースエンジニアリングマルウェア解析などを行い低レイヤーを熟知するための糧としたいのです。

 次に、ハードウェア全般についてです。ソフトウェアはハードウェアありきで動いているので、ソフトウェアを知るにはハードウェアも知らなければならないと思います。私の物理に関する知識は乏しいですが、そうでなくとも最低限情報機器がどうやって動いているのかと言ったところまでは身につけておきたいのです。いずれ、IoTの時代が最盛期になった時、家電などの従来の組込みシステムに限らず、そもそも電気で動いていないものも情報機器が搭載される時代が来るはずです。たとえば、インターネットに繋がった椅子や机などが開発されてもおかしくないはずです。そういった時、ソフトウェアの面でしか開発に携われないとしたら、それはとても歯がゆい思いをするはずです。

「私はソフトウェア専門なので…」という言葉を言い訳にしたくないのです。そんな思いをしないよう、予めハードウェアの部分にも触れておき、電子機器や様々な媒体がどのような仕組みで動いているのか、そしてその技術を用いてどんなものでも開発できるようにならなければならないと考えています。更に、IoTは様々なモノへのサイバー攻撃も助長するはずです。例えばですが、真夏の熱帯夜の中、IoTでインターネットに繋がったエアコンが外部から攻撃を受け、操作を乗っ取られたとします。もし悪意ある者が殺意を持ってしてエアコンの設定温度を暖房あるいは高温に設定した場合、正規の利用者は暖房により脱水症状などの身体的損傷を受けかねません。また、仮に人間に害がなかったとしても、エアコンの内部では熱によって精密部品などが損傷あるいは破壊されるかもしれません。こういったことにはソフトウェアの部分からも対策を立てる必要はあるでしょうが、それだけにとどまらずハードウェアからの対策を立てることも重要です。ハードウェアの知識があるだけでも、セキュリティ上の対策の幅が広がるはずです。つまり、私達の生活を豊かにするありとあらゆるものが、私達に牙をむく武器にならないような事前の対策を打てるよう、ハードウェアというものを知らなければならないのです。また、最近ではソフトウェアではなくハードウェアに感染するマルウェアが存在するようです。私の知っているのはUSBデバイスのハードウェア部分に感染し、全てのUSB間の通信内容を知られてしまい、一度感染すると専用の装置を使わない限り削除は難しいという恐ろしい動作をするマルウェアです。どこの国の陰謀とか、そういうところも気になりますが、我々一般人には手の届かないマルウェアという存在に非常に驚きました。私がハードウェアに関する知識も必要だと考え始めたのは、このマルウェアの存在がきっかけです。ソフトウェアの方面だけを勉強していても太刀打ちができないと感じたからです。しかし、ただ勉強するだけなら誰にでもできますが、勉強と言うのはあくまで理論的な部分が多く、実践では理論通りにうまくいかないことがあります。そういったことも含め、実際に触れて理解し、体に染み込ませるといった意味でも、ハードウェアに関する講義などを受けてハードウェア全体の知識と技術を身につけたいのです。

 

 もちろん、低レイヤーに限らず高レイヤーのことについても学びたいと思っています。高レイヤーは利用者に一番近い部分です。WebアプリケーションやSQLなどはとても便利ですが、利便性とセキュリティの強度が両立できないように、私は便利=危険という見方で捉えています。開発環境や新たな技術が生まれやすいこともあり、続々と良いWebアプリケーションなどが開発されていますが、時代がスピード開発を求めていることもあってか、脆弱性がより多くなりがちです。だからこそそこを狙う者も多くいるはずです。ネットワークを介するだけで比較的攻撃がしやすいこともあり、よくニュースで企業のWebサイトなどが改ざんされるなどの被害に遭うことを目にします。ではこの高レイヤーな部分を勉強しなければならないと思うのは当然ですが、種類が多く、どれかのWebアプリケーションなどに絞って知識を蓄えるというのは非効率的です。だからこそ、

Webアプリケーションに共通する骨格部分の知識を学ぶことが重要だと考えます。Webアプリケーション全てを5日で学ぶのは不可能だとしても、それぞれに共通している部分を学ぶのは困難ではないはずです。私は高レイヤーについての知識が低レイヤーに比べて乏しいので、この範囲の知識をすぐさま補わなくてはという使命感も感じています。スマートフォン向けのアプリが日々開発されているため、それに合わせて脆弱性も様々なものが現れているはずです。PC上で動くアプリケーションにも同じことは言えます。ですが、共通する技術があるように、共通する(似たような)脆弱性もあるはずです。そういったことを学び、たとえ多種多様な脆弱性がこの先現れたとしても、それに対応できるように知識や技術を身につけておきたいのです。また、共通した知識は共通していない知識を吸収するための呼び水になるため、学習効率を少しでも上げられるようにしたいです。

 

 低レイヤーや高レイヤーについて学びたいとしましたが、私は中レイヤーのことも学ぶ必要があると考えています。低レイヤーと高レイヤーの中間に位置するレイヤーを中レイヤーと呼ぶのかわかりませんが、ここではそう呼ぶことにします。その中レイヤーがネットワークの分野なのか、コンピュータアーキテクチャの分野なのかは問いません。とにかくこの中レイヤーについても熟知している必要があると思われます。ほとんどの入門書では中レイヤーに関する事はあまり取り上げられていません。上と下のレイヤーをつなぐ部分はそれだけ複雑な機構を備えていることが多く、たいていの場合は極端に上のレイヤー(あるいは下のレイヤー)からしか学ばないからです。プログラム全般について例を挙げると、各種プログラミング言語(高レイヤー)や機械語(低レイヤー)については様々な解説書や勉強ができますが、コンパイラ構文解析などと言った部分に関する情報は比較的少なめです。非常に高度で学術的な内容であっても、そこを攻撃されてしまう可能性はゼロではありません。仮に攻撃された場合、対策もそう簡単ではないはずです。そこを専門とする人材もそう多くないと考えられます。今回私が共通問題3-1で様々な分野の講義の受講を希望しているのは、高レイヤー、低レイヤー両方から学習を進め、中レイヤーの勉強をするための地盤を築きたいからでもあります。

 

 

 技術的な面から外れますが、私はグループワークというものにも興味を持っています。講義の中もグループ単位で行うものはあるらしいのですが、そもそもセキュリティについて学ぶ上でグループワークと言うものがどういう風に機能するのかがとても気になります。私は、セキュリティの仕事(もしくは勉強)は一人で自分と向き合いながらもくもくと進めて行くイメージがあります。誰かに教えてもらうにしても、最終的にパソコンと向き合っているのは自分一人です。だからこそ、セキュリティ・キャンプでグループワークを行うというのは、一体どんなことをするのか気になります。仮にセキュリティを学ぶ上でグループワークでしかできない事、もしくは一人でもできるがグループワークにすることもできる事など、そういうことがあればぜひ学びたいです。私は今、学校内でセキュリティに関するプロジェクトや自身で開いている勉強会に参加しているので、私がセキュリティ・キャンプで学んだグループワークを積極的に活かし、プロジェクトや勉強会の成長に役立たせたいと考えています。もしかしたらセキュリティとはあまり関係なく、友好を深めるという目的のものかもしれませんが、それでも楽しみです。むしろ友好を深める目的でもいいと思っています。様々な考えを持った人に出会えるのは自分にとって良い刺激になる上、いわば競い合うライバルのようなものができます。私は負けず嫌いなので、競い合う相手ができた方がより勉強に打ち込むことができます。競い合うどころか、私の実力不足で既に差が開きすぎて勝負にならない事もあるでしょうが、それでも負けたくないので、そこで色々な人と仲良くなりたいです。もちろん競い合うだけでなく、将来的に積極的に情報交換ができるコミュニティなどにも参加したいです。折角インターネットでつながっているのですから、実際に会うのはその場限りであったとしても、良い人脈を形成できたらいいと考えています。自分一人ではできない事でも、誰かと一緒にできることがあるのであれば、そのためにも良い人に巡り合ってみたいと考えています。

 また、一人ひとり受けられる講義に限界があったとしても、会場で知り合った友人と協力して、それぞれが受けた講義について情報交換したいとも考えています。受講した内容を他人に教えてはいけないルールがあるのでしたらそれは当然やめますが、できる事であれば情報交換をして、ただ講義を受けるだけよりも実りのある時間にしたいと考えています。

 

 私に限ったことではないですが、学校を卒業すればいずれ就職するので、サイバーセキュリティに関する仕事にはどのようなものがあるかも気になります。私が知っている限り、サイバーセキュリティに関する企業と言うのは有名どころの企業しか知りません。SymantecTrend Microなどと言った大企業が、ウィルスをひたすら解析してそれらに対するシグネチャや対策プログラムなどを作っている様子しか思い浮かびません。恐らく他にもサイバーセキュリティに関する仕事と言うのは存在するのでしょうが、その性質上公にできないものやそもそも周知されていないことも多くあるのでしょう。もしかしたら、技術面に関する事ばかりではないのかもしれません。私は、将来セキュリティに携わる仕事に就きたいと考えていますが、このまま先述したイメージだけを持っていながら就職するのでは危険だと考えています。凝り固まった考えばかりではなく、新たな知見を広げられるようにして、将来の変化に対応できる、「技術者」ではなく「人材」になりたいと考えています。そして何より、世の中にある色んな職業を知らずに一生を過ごすのは損でしかないと考えています。より多くの出来事に触れるチャンスは、やはりより多くの出来事を知ることが第一歩です。そういった意味でも、サイバーセキュリティに関する仕事の紹介は外せないところです。仕事の紹介だけでなく、サイバー犯罪による被害と言うのも気になります。先日NHKのテレビでセキュリティに関する話題が取り上げられていました。そこではスタックスネットというマルウェアに関する話題がありましたが、どうやらそれはかなり昔のことだというのです。テレビの情報が最新の情報に感じてしまったのは否めませんが、それでもただでさえセキュリティに関する情報と言うのはテレビでもインターネットでも仕入れにくいというのに、情報が古いとなってはあまり意味がないような気がします。所謂歴史を学ぶのは大切なことではありますが、私のような一般人にはセキュリティの最新情報というのはなかなか手に入れ難い機会です。サイバー犯罪による被害はもともと知られにくいというのもありますが、それでも最新(あるいはそれに近い)情報であると期待しています。新しい情報だけを学ぶことが良いこととは言いませんが、それでも最新の情報は私にとってとても貴重な情報です。是非お話を伺い、最先端の現場でどのようなことが起きているのか知りたいです。

 

 自分の実力を図るためにも、CTFへの参加は欠かせません。セキュリティの技術や知識を競技の形で比べられるのは良いアイディアだと思います。その問題には答えがあるとはいえ、自分で何が脆弱性なのか、何がいけないのかを考えて、調べて行動できるという機会があるのは自分の思考力や知識を深められる点でCTFは優れていると思います。私はCTFの問題をそれほど解くことはできないのですが、CTFには様々なジャンルの問題があるので、私の知らない分野の知識を広げられるというのが好きです。セキュリティ・キャンプのCTFだけに留まらず、インターネット上にある様々なCTFやSECCON、いずれはDEFCONなどに参加し、様々な問題と周りの人たちなどの環境に触れてみたいです。そして新しい問題に挑戦し続けることで、「知らなかったこと」を知っていこうと思います。知らなかったという体験こそが私自身を成長させられる栄養素だと考えています。もちろん、セキュリティに関する大会だけでなく、プログラミングコンテストなど他の大会などにも参加し、大会等に参加して得られる新たな発見を追及していく皮切りにしていきたいと考えています。

 

ここまで、私は様々なことについて学びたいとしました。特別興味のあるものや一時的に特定の分野を勉強することはありますが、それでも私は特定の分野に特化することを避けて、様々な分野に目を向けていきたいと考えています。それは、特定の分野に特化した人材では、その特定の分野でしか物事を見なくなるからです。セキュリティは、誰もが予想しなかったことで虚を突いたもの勝ちだと考えています。その予想しない事を可能な限り予想できるためには、特定の分野に偏らない考えが必要だと思います。だからこそ、低レイヤーや高レイヤーなどに限らず色々な分野に目を向けて勉強することが大切だと思います。きっと周りの人は「そんなのは現実的ではない」と言うかもしれませんが、やってみなければ分かりませんし、人間の記憶できる容量は生きている時間そのもののはずです。それが可能かどうかは証明されないでしょうが、不可能も証明されないはずです。加えて、私は誰に対してもどんなことに対しても負けたくありません。私の身近にいる友人だろうと同じプロジェクトや学科の先輩だろうと、そして社会人の大人の方々だろうと誰だろうと負けたくありません。その性分も私の様々な分野を勉強したいという気持ちを後押ししています。そしてセキュリティと言う視点からも凝り固まらないようにしたいです。セキュリティは大切な要素ですが、完璧なセキュリティが存在するわけでもありません。だからこそ、セキュリティに固執するのは良くないと思っています。何事も適度なバランスが必要なのです。開発を優先してセキュリティの質を落とすことも許容するような考えも必要だと考えています。最善の行動がとれるような選択肢を広げられるよう、広い知識や技術があることも大切だと考えます。

 そして私はセキュリティ・キャンプで得られたことを他の人に教えてあげたいです。どのようなことを学んだとか、どういった雰囲気だったとか、セキュリティ・キャンプに参加した経験を丸ごと広めていきたいです。私はブログや開発誌のようなものを持っておらず、Twitterのアカウントはあっても呟くこともあまりありませんでした。しかし、以前、大学のプロジェクトの一環でセキュリティに関する講師をお呼びしてお話を伺った時、「ブログなどを通じて自分の得たことを他の人にも知ってもらえるよう情報を発信することが重要だ」とおっしゃっていました。この時私は、この情報発信は素晴らしいことだと気づかされました。まず一つ目に自分のためになることです。情報を発信するということは、自分の知識体系を整理することにもつながり、より明確な形にすることができます。二つ目に、他の人のためになるということです。自分が躓いたことを経験として語ったり記したりすることで、他の人がそれを糧にして勉強をしたり先に進むことができます。その他の人がさらに情報発信をすれば、それはもう立派なコミュニティになると考えたのです。今後、ブログなどを作成し、情報発信などを進めて行きたいと考えています。セキュリティ・キャンプは希望者全員が参加できるようなものではない、貴重な経験です。情報発信をするためにも、(セキュリティ・キャンプの参加に限りませんが)セキュリティ・キャンプの参加は重要なものだと考えています。また、ブログに限らず、私の身の回りにある勉強会やプロジェクトの中でも情報発信を行い、(一段落前などの私の考えが正しいとは言いませんが)少なくともこんな考えがあるんだよと言うことも含めて、ローカル、グローバルを問わず情報を発信していきたいと考えています。

 

ここまでをまとめて、私はセキュリティキャンプで様々なことを体験・学習し、広い知識や経験・考えなどを身につけ、私自身の成長はもちろん、それらを発信することで社会全体に良い影響を与えられるような行動を続けていきたいと考えています。

 

選択問題1

以下は変数hogeとfugaのメモリアドレスを表示するプログラムと、その実行結果です。実行結果のhogeとfugaのメモリアドレスを見て、思うことを説明してください。(ソースコード省略)

 見たところ普通にポインタの位置を示しているように見えました。ですが、気になるところがいくつかありました。アドレスの値が少し違和感を覚えたことです。

 hoge address、fuga addressはどちらも0x7fXXXXXXXXXXと、メモリのちょうど半分より少し低位アドレスにあると思います。このアドレスは、Windowsでいうユーザー用メモリ空間にあるのではないかと思われます。やたらとOSなどが使う0x800000000000以降のアドレスに近いと思いました。また、fuga addressの値をよく見ると、0x7fca11404c70という値になっており、これが0x7f ca11 404c70という風に分けて見えます。つまり、0x7f call(コール、呼び出しの意)、404c70という文字の並びに見えます。404c70という値がOllyDbgなどのデバッガでプログラムの中身を見た時によく見るアドレスなので、このアドレスが404c70のアドレスのコードを実行するためのちょっとした暗号のようなものではないかと思われます。私の考えでは、これは仮想アドレス空間のアドレスで、プログラムのエントリポイントに近い感じがします。

 また、fugaのmallocの割り当てられた範囲が1byteしかないのも気になりました。intへのポインタだとしたら、普通はsizeof演算子を用いてsizeof(int)と指定するはずではないかと考えました。他にも、このシステムは48bitのメモリ空間をもつのではないかと考えます。

 これはたまたまかもしれませんが、問題文のhoge addressもfuga addressもどちらも下1桁が0という区切りのいい数字になっていると思いました。そして、それが偶然なのか問題の仕様なのかを調べるために、試しに自分の環境下(Windows 8.1, x64, Visual C Compiler)で調べてみたところ、アドレスの値は必ずも下1桁が0になるとは限りませんでした。さらに、メモリの位置関係はhoge addressの方が低位、fuga addressの方が高位に必ずなっていることがわかりました。加えて、fuga addressの下一桁が8になっていました。ですが、これは問題文の実行結果と違っています。

 調べた時に気になったのが、同じソースコードのはずなのに、実行結果の方でアドレスに0xのプリフィックスが付いていないところでした。そこで、VMware上にKali-Linuxを立ち上げ、そこでgccを使ってコンパイルし、実行したところ、アドレスの値に0xのプリフィックスが付加されるようになりました。なので、問題のプログラムが実行されている環境はgccが搭載されているのだと考えます。また、その時に調べたアドレスを見ると、私の環境下ではhoge addressが必ず0xbfで始まり、下一桁が4で終わっていました。さらに、fuga addressはWindows上で実行したときと同じく下一桁が8になっていました。加えて、hoge addressが高位のアドレスに、fuga addressが低位のアドレスになっていました。hoge addressの上2桁目がfになっているところと、hoge addressとfuga addressの位置関係は問題文と一致することが分かりました。これはLinuxWindowsの違いから生じることではないかと考えます。

 

選択問題5

PCなどに搭載されているOSは「汎用OS」と呼びますが、それに対して、家電やAV機器などの「組込みシステム」に搭載されているOSは「組込みOS」と呼ばれます。
組込みOSと汎用OSの違い、「OSが無い」や「ベアメタル」という環境、そもそもOSとは何なのか?など、あなた自身はどう考えているのかを、あなた自身の言葉で自由に説明してください。(「正しい答え」を聞いているわけではありません。あなた自身の考えを教えて下さい)

 Windowsなどの汎用OSは、一般的にハードウェア資源をアプリケーション側から隠し、それらを効率良く利用することができるよう管理すると言われていますが、私は少し違う気がします。動作の面であればそれで間違いないと思いますが、現状ではWindowsなどのOSに合わせた変化がハードウェアに要求されているのだと思います。なぜなら、Windowsは世界的標準のOSであり、シェアの大半を占めています。しかし、それが災いして、ハードウェアベンダが新たなデバイスを製品化する際、「Windows用にデバイスドライバを作らなくては」と自然と連想させてしまいます。たくさんの利用者に使ってもらうようシェアの大きいOSに合わせたドライバ開発をするのは当然のことです。Windowsに限ったことではありませんが、私は、汎用OSの存在自体がハードウェアベンダをコントロールしているような気がします。つまり、汎用OSがコントロールするのはハードウェアに加えてハードウェアベンダもコントロールしていると考えます。仕様が徐々に統一されていき、ある程度環境が変わっても動作が可能になるのは開発面にとってはメリットですが、セキュリティにとってはデメリットのことが多く含まれます。現に、Windowsを狙ったマルウェア開発やハッキング(クラッキング)は後を絶ちませんし、他の汎用OSに比べてマルウェアの動作するOSの割合が多いのも事実です。これからIoTの発展により様々なモノに対して情報機器が用いられる未来、ある程度仕様の違うものが必要になると考えられます。

 また、汎用OSは便利ですが、強力過ぎる存在であるとも考えます。汎用OSの特徴は何でもできる事で、様々なアプリケーションやハードウェアを扱うことができます。それ自体は良いことですが、それだけ管理しているものが多いということにもなります。仮に、Windowsが乗っ取られてしまった場合、乗っ取られたWindows上で管理されているものも全て操られてしまう可能性があります。強力なOSであるが故に、セキュリティも厳重にはなっていますが、そこを突破されたときの被害が大きすぎるのです。一度乗っ取られてしまうと、その強力さを活かした踏み台にし、他のホストに攻撃を加えていく可能性もあります。便利と危険は表裏一体となっており、あまり強力過ぎるもいけないのではと考えます。

 さらに、汎用OSはユーザに優しすぎると考えます。というのも、汎用OSが協力で何でもできる上、徐々にユーザにとって使いやすいものに進化しているからです。昔のコマンドラインで操作するのが主流だった時代に比べて、汎用OSがユーザに求めている前提の知識が少なくなっています。視覚的に、マウスをクリックするだけで目的を達成できるのはそれだけ汎用OSが強力になり進歩した証ですが、反面、ユーザの敷居を低くしたことでほぼ知識がないユーザも扱うことができるようになりました。それは、そのユーザがセキュリティに関する問題に直面したとき、対処が難しくなることを意味します。知識もないのに、ファイアーフォールが無効化されているだの、オーバーフローが起きているだの、そんなことを言われても一般人にはよくわかりません。Windowsが「安全です」と謳っている事が危険だと感じるのです。セキュリティの世界に絶対安全と言う概念が存在しない事を、一般ユーザがもっと深く認知すべきなのに、昔からよく聞く名前の汎用OSの存在が根拠のない安心感を呼び起こしているような気がしてなりません。最近はマルウェアの活動も巧妙化しており、ステルス化する一方、一般人にとってはマルウェアに感染していることが気づきにくくなっています。マルウェアが感染していると分かればよいのですが、ユーザが汎用OSの中で起きていることを気にしなくてよくなった分、マルウェアやその他危険なソフトなどが動いていることも「気にしなく」なりました。つまり、扱うユーザの知識の無さが大きな脆弱性となってしまっているのです。私は、汎用OSを扱うのであれば、それに対しての知識を身につけておくことが必要であり、扱うものを「扱える」だけの知識を有しているべきだと考えます。

 ただし、汎用OSは学ぶ意欲のある者にとっては良い「教材」にもなります。ハードウェア資源を管理する方法や、効率的に処理をするための工夫、もちろんセキュリティについても、汎用OSは素晴らしい知識の結晶です。勉強するのは難しいにしても、そこから得られる知識は汎用的なものから応用的なものまで様々です。そういったことに興味を持ってもらえる可能性があるユーザの幅を広げるという点では、汎用OSのシェアは強みになると考えられます。

 

 ここまでは汎用OSの良い点と悪い点を挙げましたが、組込みOSにも同様に良い点と悪い点があると考えます。組込みOSはある特定の製品に対して組み込まれるため、その製品に特化した処理や性能、製品の特性を考慮した設計を備えていなければなりません。中には命に関わるような製品にも組み込まれるので、それぞれに合わせた開発をしなければならなくなるのは目に見えています。開発の効率を上げるためにある程度モジュール化するでしょうが、それでも完璧に一緒な組込みOSは同一製品を除いてごく稀なはずです。このような組込みOSの特徴は、セキュリティにとってメリットがあるはずです。開発後の動作テストやセキュリティ上の問題が無いかなどのテストをする際はその性質上問題発見が難しくなりがちですが、仕様が違うため悪意を持った人たちもそれに攻撃を行うことは容易ではないと思われます。仕様書などのデータは公開されないか、あるいは限られた範囲でしか周知されないはずなので、ソーシャルエンジニアリングを通したとしてもその情報を手に入れられるのは難しいはずです。また、Windowsなどの汎用OSのように広く普及する目的で作られていないので、解析するための環境やデータを揃えにくいはずです。こういった特性が、セキュリティを脅かすような攻撃を受けにくいと考えられます。つまり、それぞれバラバラな「仕様」こそがセキュリティを維持する対策になると考えます。初めて導入したOSを外部からの攻撃から身を守る場合、一番良い方法なのがネットワークに接続しないのと同じように、セキュリティで最も強固なのは「知られていない事」だと私は考えます。ここまで組込みOSは攻撃を受けにくいなどのことを述べましたが、仮にスピアー型の攻撃を受け、脆弱性が露呈した場合には汎用OSよりも対策が遅れるのが事実です。それは組込みOSを作る企業が必ずしも大企業とは限らず、中小企業でも開発する可能性があり、その企業が脆弱性に対して対策を迅速に打つことができるとは言えないからです。脆弱性を発見しやすくするために、あるいは開発期間の短縮やコスト削減を狙ってモジュール化するのは悪くありませんが、全てをモジュール化するのではなく、適度なモジュール化と適度な差別化を図る必要があると考えます。

 また、組込みOSは一般のユーザにより良くも悪くも情報技術のレベルを発展させると思われます。今、Raspberry PiArduinoなどのミニコンピュータが流行っています。特にRaspberry Piでは5ドルで買えるモデルも現れています。それらを扱うための手順やプログラムが記された書籍なども大量に流通している今、教育分野として取り入れているところも少なくありません。電子工作をしたり、組込みOS上でプログラムを作ったりと、コンピュータに触れる年齢がどんどん低下していき、コンピュータサイエンスに触れる機会も多くなるでしょう。そうなると、趣味や生活レベルでコンピュータが浸透していきます。結果、一般のユーザが自分で好きなようにカスタマイズができるという点を活かして、様々な想像力に溢れたものを生み出すのではないかと考えられます。アイディアは誰もが持つ素晴らしいものですので、年齢や立場に縛られることなく情報技術の発展につながるでしょう。そのコンピュータサイエンスの知識をセキュリティに活かすこともできます。より早い段階でセキュリティに関心を持ってもらえるのではないかと思います。

 当然、その反対にハッキングやクラッキングなどを楽しんで倫理的に良くない事をする行為を助長するかも知れません。インターネット上での心無い書き込みがあるように、コンピュータに攻撃することに対して罪悪感が生まれてこない可能性があります。教育の現場で組込みOSなどを用いたコンピュータを利用するのは悪いことではありませんが、そこで得られた知識が容易に実行されやすいからこそ、その対策を十分にした上で、倫理面での教育をしっかりする必要があると考えます。

 

 今後、汎用OSと組込みOSの違いは徐々になくなっていくと私は考えます。完全に同じものになることはなく、ある程度搭載する製品別に特化したOSになると思われます。Raspberry Piなどのミニコンピュータに搭載できるOSがWindowsLinuxであったりと、搭載するハードウェア本体の性能が向上していることもあり、IoTに用いられるOSも必ずしも組込みOSとは限らなくなってくると思います。また、組込みOS自体も強力なものになり、汎用OSのレベルに近づいてきていることも二つのOS間の違いをなくしつつあるものだと思われます。

 

選択問題6

IDとパスワードを入力してユーザの認証を行うWebアプリがあります。あなたがこのアプリに対してセキュリティテストを行う場合、まず、どのようなテストをしますか?

なぜそのテストを選択したのか、その背景や技術的根拠と共に記載してください。アプリの内部で使われている技術やシステム構成に、前提を置いても構いません。

 私が行うテストは、IDやパスワードのログイン試行を行っているのが人間かコンピュータかを判断することです。

その理由は、機械学習人工知能などの技術が一般的になってきているからです。最近はAlpha Goなど人工知能機械学習などの話題がとても多く取りざたされています。それを考慮し、パスワードをクラックするために機械学習人工知能などの技術が用いられてもおかしくないと思いました。つまり、パスワードクラックの自動化です。私は、このWebアプリケーションの中に前提としてCAPTCHAのような人間であることを確かめる機構を追加することを前提とします(人間であることを確かめる機構であればCAPTCHAに限らないとします)。

 レインボーテーブルや辞書攻撃、古典的な推測攻撃ブルートフォースなど、パスワードに対する攻撃手法は様々なものがあります。ですが、直接人間の手でパスワードクラックをするのはあまりないのではないかと思われます。何故なら、たくさんあるアカウントに対して一つずつ攻撃して得られるものよりも、一度に多くのアカウントに対して機械的に攻撃して得られるものの方の価値が大きいはずです。

それに、世の中の人がパスワードを作る際、ある一定の規則に従って作っている人や、そもそもパスワードを覚えるのが面倒だからと全部同じパスワードにしたりと、本当の意味でのちゃんとしたパスワードを作る人は少ないと思います。それはパスワードを求められることが多くなったからでもありますし、パスワードを覚えなくてもいいよというシステムが多くなったこともあり、人間が「パスワード管理の大切さ」を失いつつあるのが現状だからです。初期パスワードのまま変更しない人もいるでしょう。そんな中、パスワードのパターンにもある一定の法則や規則的なものが見いだせてくるはずです。それらを機械学習させ、人工知能が予測することで、ある一定のパスワードクラックの成果は見いだせるのではないかと考えます。

私がよくニュースで聞くのは、設定したパスワードはどんなものですかという問いに対して「password」ですということを聞きます。それでは意味がないと思います。

他にも、デジタル機器の普及やインターネットをよく使う世代が増えたこと、機器の性能面の強化などによって、かなりの数のユーザが特定、あるいは少数のシステムに登録することで、攻撃者側も攻撃拠点を絞りやすくなっています。攻撃拠点は絞りやすいのに対して、攻撃できる的の数は豊富です。それもまた機械的な攻撃を助長するのではないかと考えます。

 仮にパスワードが人工知能によって推測され、ある程度の見当が付けられている場合、アカウントを守る手段はロックアウト程度しかありません。パスワードがパスワードとして機能しないのなら、IDを入力するだけで良くなってしまいます。なので、CAPTCHAのような人間か否かを区別する仕組みが必要なのです。もちろん、CAPTCHAの画像を正しく認識し、その中に書かれている文字列を判別するような人工知能も研究されているはずです。ですが私が言いたいのは、何もCAPTCHAを強化しろというのではなく、常にその時の新しい技術を用いて、人工知能が学んだことの無い、あるいは学ぶのが難しい認証の仕組みを追加しなくてはならないということです。

当然、正規のユーザにとってはCAPTCHAのような認証機構は利便性の低下を招くだけです。認証機構によっては、正規のユーザすらも容易にログインできなくなる場合もあるので、人工知能には難しい、かつ人間にはある程度容易にできる認証機構が必要だと考えます。

 

 Webアプリケーションでの脆弱性は攻撃されやすいものですし、脆弱性の種類にも様々なものがあるでしょう。そういった脆弱性はパッチを適用したり、脆弱性を利用されない機構にすれば多少の攻撃を防げるはずです。少なくとも、脆弱性が発覚したとしてもそれを直すことができます。ですが、直せない脆弱性があります。それは私達人間が人間であると証明できない事です。人工知能が人間と同等に近づくにつれ、データのやりとりだけでは区別が難しくなっています。だからこそ、私はログインを試みている相手が人間か人工知能かを判断するような機構が正しく動作しているか、人工知能で認証を突破することが困難であるかどうかを確認することが第一に必要だと考えます。

 

選択問題7

あなたが管理するネットワークに悪意ある第三者が存在しない事を証明する方法を思いつく限り列挙してください。なお、条件として物理的にアクセスされる可能性を想定してください。

 まず、固定されたデスクトップPCのみのネットワーク内で調査をする場合、電源の使用料について調べます。正規のユーザが用いるPCの電源消費量をPCの仕様から算出し、その総計よりも多くないかを確認します。可能であれば、調査するネットワークが敷設された敷地及び建物内に不審な人物が立ち入ったかどうかを入退室管理記録等から調べます。

 物理的な調査ができない場合などは、ネットワーク自体の調査を行います。ミラーポートやタップを挟み込み、通信内容をモニタリングします。まず、使用しているIPアドレス空間を調べます。固定IPアドレス空間内であれば割り当てられているIPアドレスを使用していないホストがいないか調べます。動的IPアドレス空間内であればDHCPの使用履歴から、リースした先のMACアドレスを所有する端末を検索します。MACアドレスでも、正規のユーザが使用しているMACアドレスが固定であるならば、それ以外のMACアドレスで接続されていないか確認します。また、MACアドレスを偽装していないかを確認するために、重複しているMACアドレスの存在を確認します。加えて、APRキャッシュポイズニングの可能性を考慮し、不審なARP応答が無いかブリッジやルータのログを確認します。

 悪意ある第三者のホストを調べられない時は、ネットワークの通信内容を解析します。同一IPアドレスからのアクセス数が異常ではないかを、通常時のアクセス数から比較します。また、同一IPアドレスに対してポートスキャンが行われていないかを確認します。また、同一ポートに対するTCPコネクションの要求が多すぎないかも確認します。ここまでで、同一ネットワーク内の構成を調べようと様々なIPアドレス(存在しないアドレス空間も含む)やポートにアクセスしようとする通信が無いか確認します。DNSキャッシュポイズニングを試みたり、DNSを取得しようとしている通信など、内部のネットワークに存在するだけで特段認証もなく得られるような情報を収集している通信がないかも確認します。通信方向にも注視します。ネットワーク内にIDSやIPS、プロキシサーバなどがあれば、そのログから確認します。怪しいURLまたはIPアドレスにアクセスし、マルウェアなどをダウンロードしていないか、あるいは外部に何かしらの情報(恐らくネットワーク内で得られた情報)を送信していないかなどを確認します。ここで独自のプロトコルなどを用いているかも確認します。また、特定のサーバなどにログインを試みていないかなども確認します。IDSやIPSなどで使用しているポート(サービス)に制限がある場合、そのポートにアクセスしようとした通信が無いかも調べます。

 

ーーーーーーー以上ーーーーーーー

ここまで読んでくださった方、ありがとうございます!

それとも、一気に流し読みしましたか?いや、流し読みしたくなる気持ちも分かります。だって僕ならこんなの読みたくないです。

その読みたくない文章を講師の方々に送りつけました…すみません。ですが、これで気持ちだけは伝わったのか、合格を頂くことができました!

長い文章を読んだ上に合格まで下さり、本当にありがとうございます!

 

今後の方針としては他の参加者の皆さんの迷惑にならないよう、CTFや事前学習を頑張っていきます!

 

結果報告などは、今後ブログにUPしていく予定です。とにかく頑張るしかないみたいです!

 

(キャンプの人、レベル高すぎて泣ける(´;ω;`))

流行遅れのRaspberry Piセットアップ

 今更ながらRaspberry Piをセットアップした 

経緯

みんながRaspberry Piでサーバ立てたとか言ってるから、羨ましすぎてつい。

電子工作するのも興味があったし、今後の視野を広げていくのに良い機会だと思いました。

あとは、学校の授業で役立つかな、って程度で。

準備

 初心者以前なので何をやったらいいのか分からなかったし、既にセットアップしたりサーバ立てたりしている熟練者の皆さんのやってることが分からなかったので、一から必要なものを集めるのはあきらめた。

 SwitchScienceのRaspberry Pi 2 B スターターキットを購入。ついでにAmazonであわせ買い対象のUSBマウスとUSBキーボードも購入。もうこの時点で満足している。

 あと、電子部品を触るときは手脂に気をつけないといけないのを大学の紹介動画で見たことがあるので…ビニール手袋を着用しながらセットアップすることに。授業の合間だったから、忙しくてゆっくりはできなかった\(^o^)/

行動

 ひとまずRaspberry Pi本体をケースにしまうことに。そこから色々とくっつけたりするのですが…

 これらが用意したパーツ。用意したっていうか、セットで揃えただけ。

 

f:id:HappyNote3966:20160611015029j:plain

右上に映ってるRaspberry Pi本体とケースを合体させようと試みるが…ん?

 なかなかうまくはまらない。何がいけないのだろうと微調整を繰り返しながら色々とやってみたが、しっかりとはまらない。ケースって、ちゃんと専用に作られてるはずなのに、どうしてうまくいかないんだと泣きそうになる。みんなどうやってやったんだ…

 よく見たら、ケースの中にバリみたいなのがあった。これが邪魔しているのか?と思って遠慮なくハサミで切断。

 これでうまくいくはずだ!と意気込んでやってみたものの、うまくいかない。泣きそう。

 アプローチを変えるしかなかった。とにかく、このフタみたいなのに注目してみよう。うん?ラズパイを差し込めるところがあるじゃないか。フタに差し込むのか?

 やってみたらうまく行った。多分バリとか関係なかったんだと思う。説明書に詳しく書いてなかったから、なんでもいいんだろうと思って適当にやったら失敗した。どんなことであれ、初めてのことは色々と考えながらやったほうがいいみたいだ。

 

 ちなみに、ここまでで50分経過している。泣きそう()

 

f:id:HappyNote3966:20160611015040j:plain

 ようやくここまできた…しかし、時間は押している。何としても起動までこぎつけなくては。ビニール手袋の中は手汗でいっぱい。気持ち悪かった。

 ビニール手袋を捨てて高速にコネクタを差し込みまくる!USBマウス、USBキーボード、HDMI、そしてACアダプター!これで起動するぞー!f:id:HappyNote3966:20160611015046j:plain

 あらやだステキ!動いているわ!これが私の待ち望んでいたものなのよ!

 

 次行きますよ()

 

f:id:HappyNote3966:20160611015055j:plain

 起動したらおなじみのロゴが出現。とりあえず、起動までなんとかなった。

 携帯を確認すると時間が少し余ってる。よし、ネットワーク接続まで済ませてしまおう。

 ここでもまた時間を取る。スターターキットの中にはWi-Fiドングルがあった(ドングルってなぁに?)

 それを付けても反応しなかった。いや、lsusbコマンドを使えばいいことが分かって、Wi-Fiドングルの存在は確認できたんだ。だけどそこから先に進めない。設定をするにも難しそうだ。

 

 面倒になったのでLANケーブルを挿した( ;∀;)

 そしてgoogle出現!ようやくこれで最低限の準備は整った!

 

発見

  • lsusbコマンドで接続されているusbデバイスの一覧を表示できる
  • ラズパイの中にMinecraftが!
  • LANケーブル挿した方が早かった 

結果

  • ひとまず起動してインターネットには接続できる状態に
  • キーボードのレイアウト変更をしていない(日本語)
  • 言語設定も日本語になっていない。google.co.jpへのアクセスで文字化け。

 

まとめ

  • セットアップ自体はそこまで難しくない。
  • USBデバイスをかなり使うので、lsusbやUSBデバイス関連のコマンドを使わないとかっこよくセットアップできない。

改善・展望

  • 手先不器用。困った、練習しないと。
  • 言語設定を変更して日本語も使えるようにする。
  • 無線アクセスも可能にする。
  • 今後はCTFサーバやWebサイトとして運用していくことを視野に勉強していく。

一言

 秋葉原の電気街に行って、Raspberry Piを買おうとしたのだが、勉強不足でモデルの名前を正確に覚えておらず、

 「Raspberry Pi 2 Model B+ありますか」

 って聞いてしまった。Raspberry Pi 2 Model Bが正しい名前らしい。

 店先で恥ずかしい思いをした。もっと勉強しなくては。