security camp 2017参加記(自伝)

こんにちは。はなかずです。

8/14 ~ 8/18にかけて、serurity camp 2017に参加してきました。

www.ipa.go.jp

 

講義の内容・解説については他の参加者がupしてるっぽいし、upしてくれるよね(というか、まだ解説書けるほど講義内容を十分に理解できていない。今後上げていくつもりではある。復習しなきゃ...)

 

ということで、僕はseccamp2017に参加したことで得た知見について、別の方面からアプローチしていこうかなーと思う。

 

seccamp2017で得たものはとても膨大。まだ自分の中でも整理ができていないので、とりあえず時系列で自分自身・環境の変化について書きながら、自分の中でまとめてみる。自分で後々見返すために、無駄なこと(多分、読者にとっては大半が無駄)も書いていくと思う。

かなりダラダラと書いていくので結果だけ知りたい人は考察に飛んでください。

 

 seccamp2017参加前

seccamp参加前、とりあえずコンピュータには興味があった。ただ、自分が本当にやりたいところってどこだろう、と常に思っていた。

 

1年の後期から、Webの会社でアルバイトをさせてもらえることになった。

サーバサイド、フロント、デザインとWeb全般についてやらせてもらえた。

サーバ構築の方法やテストだったりフレームワークの考え方、きれいなプログラムの書き方など、色々と勉強することができた。

でも、Webやるのは楽しいんだけど、なんか違うなぁ、もっと面白いことないかなぁと常に感じていた。

 

大学の授業はまだ学部2年生ということもあり、基礎科目が多くて楽しくなかった(基礎科目が重要なことはわかっているから真面目()にやったけど)

 

プライベートでは、思い出しても何をしていたっけ?というのがまず頭に浮かぶくらい、いろんなことを浅くやって興味が薄れては離れてを繰り返していた。

 

たまに勉強会を開催(DeepLearningだったり数学だったり)して、知らないおじさんたちにいろいろと教えてもらったりもした。対して浅くはないんだけど、深くもできなかった。微妙な感じ。

 

こんな感じで特に何かを極めるわけでもなく、目標なしにダラダラと勉をしていた。

 

でも、1年の終わりごろにCTFに興味を持った。ここでアセンブラだったり、カーネルだったりの低レイヤー部分を触りだした。低レイヤーはずっとやっていても飽きなかった。これこそが、自分が進むべき道だ!と思い、2年に入ってから本格的に低レイヤーの勉強をし始めた。

 

ただ、低レイヤーってやっぱり難しい(なんとなくの理解ではどこかで壁にぶつかるからかっちりした理解が必要)し、資料が少なかったり(英語の資料はたくさんあるけど英語読めない...)する。困ったときに頼りになるものがないのは辛い。気軽に何かを聞ける友達が欲しいなぁと思っていた。

こんな時にふと、確かセキュリティキャンプなるものがあったなぁと思いだした。

seccamp自体の存在は高校生の時から知っていた。でも対して興味は持っていなかった。Twitterを眺めていると、とても強そうな方が過去にseccampに参加していたのを散見。そして、そうだ!ここで強い友達を作ろう!ついでに自分も強くなろう!と思った。一応、これがseccamp2017応募への動機。単純で不純。

 

また、2年生になってからはIT系サークルにも所属することになって、そこでいくつか勉強会を開いたりした。1年生向けのC言語勉強会だったり、セキュリティ技術勉強会だったり。セキュリティ技術勉強会は僕が得た知識をまとめるために主催してみた。勉強会を主催することは、知識を定着させるためには持ってこいなんだけど、何か新しいものを得ることは少ないなぁ。

 

こんな感じで、応募課題が公開されるまでの間は過ごしていた。

 

応募しようと決心してから

4月末から応募が始まった。僕は5月中盤くらいから応募課題に取り組み始めた。

https://www.ipa.go.jp/files/000059682.pdf

 

一人では心細かったので、周りに色々と話していたら、同学年の人が3人ほど一緒に応募することになった。先輩も応募すると聞いて、心強かった。また、S大には過去にseccampを卒業した方が二人程いるらしく、それぞれから話を聞いたりした(一人は後輩のすごい人、もう一人は院生のすごい人。)この人たちにはほんとに感謝してます。ありがとう!

 

集中コースに応募するのはさすがに怖かったので、最初から選択コースへの参加を決めていた。

 

共通課題はとにかく、今まで自分がしてきたことについて、書き殴った。

幸い、中身があるかどうかはともかく、活動はいろいろとしてきたので、書くことには困らなかった。特に難なく終わった。

 

選択課題について。こちらが問題だった。低レイヤーに関する技術・知識が未熟すぎて、選択課題に着手し始めたときは技術的な課題(パケット解析したりprintf考察したりexploit考察するやつ)が一つも解けない状態だった。だけど、ただ文章を書きなぐる記述問題だけをやっても、大した評価は得られないのではないか?と思ったので頑張って技術系の課題に取り組むことにした。

 

とりあえず、A-1, A-4, A-5に取り組み始めた。

A-1はパケット解析の問題。ネットでWireSharkの使い方についてググったりして、一通りの使い方を覚えた。ネットワークについては基礎的な知識しかなかったが、パケットのある程度の意味は理解できた。後輩(過去にseccampに参加した超強い人)に助けてもらいつつ、それっぽく解くことができた。

 

A-4はprintfとforkを解析する問題。これは以下の書籍を頼りにさせてもらい、いろいろと書くことができた。

ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ

Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際

 

A-5は与えられた脆弱性を利用したexploitを書きroot権限を奪取するという問題。これは色々とググりながらやって、CVEの判別までできたが、何をしているのかがいまいち理解できなかった。だから、提出はあきらめて、A-8に取り組んで低レイヤーが楽しいですみたいなことを書きなぐった。

 

最終的に締切1日前くらいに課題の提出を完了することができた。

課題をやるだけで、かなり色々なことを知ることができたし、課題をやっている間はモチベーションも維持することができた。

 

ただ、課題が終わってからはプライベートで良くないことがあったりでやる気が皆無になってしまい、だらけてしまった。ゲームしたりアニメ観たりで一日が終わっていった。

 

ただまあ、何もしていないのはやばいなぁと思ったので何かはしていた。でも何をしていたか具体的に思い出せないので何も身についていないのかもしれない。

 

5月半ばからはアプリ開発Monaca)のバイトをやり始めた。

毎日3時間程度、こちらの方は結構勉強になった。低レイヤーじゃないけど。

 

そんなこんなで合格発表の6月中盤までハリなく過ごしていた。

合格してから

6/15に合格のメールが届いた。とても嬉しかった。周りの人はというと、先輩は当然のように合格していたけど、後の3人は落ちていた。

 

合格してからは、少しモチベーションが上がり、ネットワークの本だったり、CTFの本だったりを読んだりしていた。ここで得た知識をセキュリティ技術勉強会で披露したりもしていた。それも束の間、中間レポートが出たり、離散数学、数理論理、情報理論論理回路、4つの必修科目の期末テストがやばいという情報をキャッチ。なかなか自分の勉強に集中することができなかった。かん

 

7月初めには、講義選択のアンケートの提出があった 。どの講義も取りたかったが、低レイヤーに興味があったので、わけがわからなさそうな授業でもとりあえず低レイヤーな授業を取っていった。結果は下のような感じになった。

  • DOS攻撃FPGAを作ろう

  • 組込みLinuxクロス開発スタートアップ 
  • PF_PACKETで仮想IP環境を自作してパケットの理解を深めよう 
  • サイバー犯罪捜査の現場 
  • The Anatomy of Malware 
  • LSMから見た Linux カーネルのセキュリティ 
  • ファジング実習 

低レイヤー系の授業を取れたので割と満足していた。でも当初はDトラックの授業がもう少し取りたかったと思っていたが、今考えるとこれでも手一杯だったな...

 

講義が決まってからは、seccamp2017の事前課題が出始める。それと同時に期末テストの深刻さを段々と理解していく。また、アルバイトも佳境に入る。量子情報の輪講では線形代数の範囲がやっと終わり、量子力学の範囲へ進行していったのだが、全く理解できな。理解できないことを発表しないといけなかった(とても辛い)。seccamp、期末テスト、アルバイト、先端情報学実習のテトラレンマ(トリレンマは使ったことあったけど、これは初めて使った)状態になる。かなりしんどかった...

 

結局そのおかげで、7月は事前課題、自分の勉強をすることができなかった。

しかし、合格率34%の必修科目をクリアすることもでき、無事フル単に成功。

 

8月に入ってからは若干焦りつつ、事前課題を進めだす。

 

ここから段々とseccampの話ばかりになっていく。テストが終わってからは、頭の中はseccamp一色って感じだった(あ、でも普通に遊んだりしてた、だめだ)

 

テストが終わってからはとりあえず、事前課題をやっていた。B1、B3、E4、D5、D6、A7と事前課題があった。一番きつかったのはやっぱりD6かなぁ。D6はLSMから見たLinuxカーネルのセキュリティという授業。Cでユーザ・カーネル空間での様々な挙動を確認したりという感じの課題が出た。正直、最初は何をすればいいのかわからず、大体他の人が提出した課題を参考にしていた。最後らへんは割と自分で解くことができたけど。みんな、あれを一人で解いているのか、すごいなぁと関心していた思い出。

 

あと、E4が地味にきつかった。コメントの量が半端じゃなくて、直前にひぃひぃ言いながら読んでた。でも、内容がすごく面白くて、余計なことまで調べたりして、いろんな知識がついた。個人的に一番身になった事前課題だと思っている。

 

他の課題はどうだろう、大体同じくらいのきつさって感じかなぁ...ただ、どれも事前に渡されたサンプルが渡されて何か作業をする、みたいな感じで、適当にやって終わらせていた。もう少し、事前から余裕をもって自主的にやっておけばよかったと後悔している...

 

と、こんな感じで"適当"に事前課題をやっていたらいつの間にかキャンプ前日、東京へ向かった。前日に開催されていた飲み会(僕は19歳だから飲んでないけど)に参加した。飲み会ではディープな話が展開されていたんだけど、所々知らない単語が飛んだりしてて、僕は話を追うので精いっぱいだった。でもすごくいい刺激になって、前日からモチベーションが高まった。セルフ前泊をして2時ごろ就寝。

 

seccamp2017へ参加

初日はオリエンテーションだったり、共通講義だったりグループワークがあった。 

名刺交換などの後、校長先生のお話があって、共通講義という流れだった。共通講義の内容はどれも面白かった。一番印象深かったのはグローバルなサイバーセキュリティの仕事についての講義。セキュリティのお仕事にはそういう働きかたも存在するのか!とびっくりした(小並感)

 

キャンプ卒業生のお話も面白かった。憧れの目で話を聞いていた。noahにはとても興味を持ったので、とりあえずソースを落としてきたけどまだ読み始めていない(読めそうにない。読めるように頑張ろう)いつか、僕もあそこに立てるようになりたいなぁ(遠い目)

 

最後はグループワークで、地味に楽しかった。個性豊か(めっちゃ喋る人、すごく静かな人、ストレートにものを言う人、小学生etc...)な人が集まっていて、これをまとめるのは大変そうだなぁと思ったりした。ギクシャクしながらも、なんとかその日のグループワークを終えることができた。

 

そんなこんなでその日のプログラムは終了。

B1の事前課題の確認をして、2時半ごろに就寝。

 

2日目、起床がとてもつらかった。この日は3つ、専門講義があった。

 

一つ目のFPGAの講義は、作業メインの講義だった。論理合成を繰り返してpingして遊んでた。あと、ソースリーディングもした。まあまあ理解の助けになった。でも、FPGAについての理解は事前課題・講義を通してもあまり進まなかった。今、自分で何かを作れと言われても、組み合わせ回路でLEDスイッチ的なのを作るのが精いっぱいというレベル。seccamp後もFPGAやろうと思ってたのに、Arty取られたのはものすごく辛かった。seccampで一番辛かった出来事だと思う。

 

二つ目の講義はソースからビルドして、ラズパイに最低限のシェル環境を作ろうという講義。これも作業がメインだったが、知らないコマンドとか、作業を自分のペースで順に追っていくことができたので結構勉強にはなったと思う。ただ、講義時間内に最後までたどり着くことができなかったのが少し悔しい。眠ってるラズパイを引っ張りだしてきてもう一度挑戦してみよう。

 

三つ目の講義はパケットで遊ぶ授業。Cでネットワークのプログラムを書いたのは初めてだった。講義中は事前に作ったプログラムを動かしたりして遊んでいた。少しソースの解説があったりした。この講義のおかげで、ネットワーク方面への興味が掻き立てられた。自分でツールだったりを作ろうと思った。

 

こんな感じで2日目は終了。何をしていたのか、この日も1時半にやっと就寝。

 

3日目は、2つの講義とBoFと企業プレゼンがあった。

 

四つ目の講義はサイバー犯罪捜査の体験をした。これはアトラクションみたいな感じで、interstingだったしEntertainingだった。E4の事前課題は少し残っていたが、Autopsyを使った解析もすることができた。SSHでのログインの痕跡がうまく見つけられなかったが、解析している!という体験をすることができた。すごく良かったです(小並感)

 

五つ目の講義はマルウェア解析の授業。IDAでマルウェアを解析した。アセンブラがあまり読めなかったが、なんとなく講義中の話は理解できた。この講義も色々と身になるものがあったなと思う。マルウェアへの興味を新たに持つことができた。マルウェア解析していきたい。IDAみたいなツール作ってみたい。

 

BoFはすごい人たちの話を聞いた。彼らとは生きている世界がまるで違った。世界中に知り合いがいて、DEFCONの優勝チームと知り合いだったり...みたいな。講義中、ふと周りの人の顔を見渡したら、みんなぽかーーんとしていた。自分はあれほどの世界に到達できるのだろうか、とすごい不安になった。頑張らなければいけないと強く感じた。

 

企業プレゼンでは...えっと、起きていたんだけど、話の内容があまり頭に残っていない...メモもしてなかったし、だめだ。プレゼンがすごくうまくて、話しのテンポだったりを変えるのは大事だなぁと考えていたのは覚えている。

 

最後のグループワークは、当日の目標までスムーズに進むことができた。

 

こんな感じで3日目は終了。この日は2時くらいに就寝した気がする。

 

4日目は講義二つと企業プレゼン、グループワークがあった。

 

六つ目の講義はLSMとフリーのアンチウィルスソフトを用いてオンアクセススキャンを実装する授業。半分程度しか理解できなかった。講義中は解答のソースコードを移していた。自分の無力さに恥ずかしくなったり悔しくなったりした。夏休み中に、この講義内容がすべて理解できるくらいの知識をつけたい。頑張ろう。

 

七つ目の講義はファジング実習。前半はpeachで遊んだりお話を聞いたりした。後半はAmerican Fuzzy Lopで遊んだ。いろいろとできて、動かすのがとても楽しかった。

ファジングツール作りたいなぁと思った。

 

7つの専門講義がすべて終わり、企業プレゼンに入る。この日の企業プレゼンはDockerのお話だった。Dockerは興味はあったが、なかなか調べることができずにいた。Dockerのセキュリティ上の問題だったりも聞けた。30分だけだったが、参考になるものが多くあった。Docker使ってみよう。

 

最後のグループワークは妥協しながらも結構いい感じに進んだ(?)。23時前に全員での話し合いは終わり、無事グループワーク終了。

 

また、四日目の最後にプレゼントコーナー的なのがあった。プレゼントは若者から選んでいく形式だった。僕は19歳(平均年齢以下)だったので、割といいものがもらえた。書籍を二つ選んだ。たまってる本を消化して、夏休み中には読み始めたい。

 

5日目に講義がないので夜更かししてもいいやと思い、3時くらいまでB3の資料を頼りにパケットをキャプチャするプログラムを書いたりしていた(まだできてない)

さすがに3時になって、寝ないとやばいと思い、就寝。

 

5日目はグループワークの発表やいろんな人のお話があった。

眠かったのと、発表の緊張でグループワークの発表はほとんど覚えていません。5000兆円ほしいってみんな言ってたのと、A班にすごい熱意ある人がいたのは覚えている。

 

集中コースの発表は楽しかった。特にZコースの人たちの成長ぶりに驚いた。暇ができたらソースを漁ってみる。

 

最後らへんの校長先生のお話的なのは、あまり覚えていない。お話し中、seccampが終わったら何をしようかをずっと考えていた...だめだ。

 

こうして、seccamp2017は終わった(思い出すの大変だった)

seccamp2017参加後

seccamp2017参加後、今はやる気に満ち溢れている。ただ、seccamp2017で得られたものが多すぎて、頭の中がまだ整理できていない。もう少し考えをまとめてから、何か活動を始めたい(多分、しばらくはseccamp2017の復習をしている)

あと、後期授業の予習もしていかなきゃ。

 

 

 考察

 以下の3点から考察をしていく。

  • seccampに参加するためにはどうすればよいのか?
  • seccampに参加するとどうなるのか?
  • seccampに参加する際の注意点

 

seccampに参加するためにはどうすればよいのか?

seccampにただ参加するだけなら、それほど難しくはないと思う(課題は20000字くらい書けば通るのでは?僕は確か15000字くらい書いた)。僕が言っているのは、ただの参加ではなくて、有効的な参加だ。有効的な参加とは、自分にとって参加を有益なものにすることだ。何度も言う通り、seccampで得られるものはとても大きい。大きすぎて、自分の中でそれを処理しきれない人もいると思う(僕がそう)だから、参加前に明確に目標を一つ、決めておくことが大事だと思った(e.g. 友人をたくさん作る、低レイヤーに徹する、自分がしたいことを見つける)そうすることで、seccamp中に道に迷うことはないと思う。僕は友達作りたいし、低レイヤーたくさんやりたいし、興味ある事発掘したいしでseccamp中はあっち行ったりこっち行ったりしていた。僕みたいにならないために、これからのseccamp参加者には目標を決めて参加に臨むことをお勧めしたい。そうすることで、有効的な参加をすることができるだろう。もう一つ、事前課題をやる時間を"必ず"確保すること。また、事前課題以上のことを"必ず"やること。事前課題の理解度が高いほど、講義の理解度も高くなる(当たり前)。だから、seccampに有効的に参加したければ、事前課題をしっかりとやること。事前課題以上のことを進んでやろうとすること。

 

まとめると...

seccampに有効的に参加するためには、目標を一つ決める、事前課題を必ず行い、それ以上のこともやる。

である。

 

seccampに参加するとどうなるのか?

やる気に満ち溢れる。うまくいけば知識・技術がたくさん身に付く(僕はうまくいかなかった)。友達ができる。

 

僕はやる気と友達をgetできた。これだけでもかなり価値のあるものをgetできたと思っている。

 

自分ひとりで色々とできちゃう人は、seccampに参加する意味はあまりないと思う。僕みたいに、やる気にむらがあって、知識技術が中途半端、でも強くなりたい、こんな人は是非、seccampに参加するといいと思う。

 

(強い)友達を作り、普段からその人たちを眺めることはモチベーションアップにつながる。

 

seccampに参加すれば、技術・知識とモチベーションを維持できる環境を手に入れることができる。

 

seccampに参加する際の注意点
  • できるだけたくさん寝る(僕はあまり寝れなくて、講義中うとうとしたりしていた)
  • メモはできるだけ取る(seccampは濃すぎるので、メモを取ってないと重要なことを忘れたりするかも?)
  • 事前課題を必ずseccamp前に終わらせる(睡眠時間の確保にもつながるし、ほんと大事)

 

まだまとめきれていないし、グダグダになってしまったけど、一応公開。

しばらく、加筆修正をしていこうと思う。

 

来年seccamp行く人!頑張れ!!!