kdenologue

たまに何か作ります。

セキュリティキャンプ全国大会2017応募用紙晒し

今年の2017/8/14~18に開催されたセキュキャンに行ってきました。
とりあえず、応募用紙を晒しておくので、後の誰かの役に立てればよいかなと。

www.ipa.go.jp

講義そのものの様子とかは、あとで別記事にしておこうと思います。(こっちは下書きが残っていたので)

前提として、僕は電子工作マンで、セキュリティとかアプリケーションとかからは離れた場所にいます。

共通問題

共-1(1).

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

(回答)
■2009~11年 中学生時代
・74ロジックICを利用したゲーム
LEDのマトリクス上で行われるゲーム。論理回路でゲームを作成しており、具体的には自機LEDと敵機LEDの信号をANDに入れると「敵機と自機の当たり判定」ができたり、シフトレジスタの入力に自機LEDとボタン入力 の信号のANDを入れることで「ボタンを押すと自機がいる地点から弾が発射」などの機能をもたせている。マイコンなどでプログラミングを行わずにゲームを作成するという試みで、2009年はゲームの仕様を部活の先輩と相談し、回路を作成してもらい、はんだ付け。2011年は後輩の考えたゲームの仕様を満たすように回路設計。

長いので省略。こんな感じで電子工作について3000文字くらい書いた。あと、ちゃんとHackDayで賞取ったこととかも書いた。これはまあ並べれば量はあるので良いアピールになったと感じる。

共-1(2).

それをどのように作りましたか?
ソフトウェアの場合には、どんな言語で作ったのか、どんなライブラリを使ったのかなども教えてください。追加したい機能や改善の案があれば、それも教えてください。

(回答)
基本的にハードウエア開発、マイコンプログラミングが主体なのでCまたはC++、あるいはArduinoとしてC++の文法に従う。マイコンはPICやAVRについて、8bitや16bitなどの低機能マイコンArduinoやmbedのような統合的ライブラリを介さずに直に開発を行った。2015年以降はもっぱらArduino環境を利用している。ハードウエアとインターネットを連携させるプロダクトについては、ESP-WROOM-02やESP-WROOM-32という無線機能付きマイコンArduino環境から利用する事がほとんどである。

先の作品自慢で力尽きたため、以降の共通問題の回答はめちゃシンプル・・・・。

共-2(1).

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

(回答)
一番最初に当たった壁が(PICマイコン用の)アセンブラである。部活で中学1年生の夏にアセンブラを勉強したが、当時はさっぱり理解できなかった。人生で一番最初に学ぶプログラミング言語としてアセンブラは難易度が高かったと感じる。

共-2(2).

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

(回答)
アセンブラに関しては結局理解せずにC言語の勉強に入った。コピペプログラミングに限界を感じ、自分でPICマイコンのデータシートを読んで内蔵ペリフェラルを動かすようになり、初めて計算機の内部の動作についてのイメージを持つことができた。これをきっかけに、アセンブラ命令は何をしているのかという点について理解が進んだと感じる。

共-2(3).

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

(回答)
アセンブラに関しては、動作自体は単純作業の繰り返しであるため、専門用語を排して概念の説明を行えば理解は可能だと考える。しかし、プログラミングをして何か者を動作させたいのか、計算機について詳しく知りたいのかという点については順序を尊重して、場合によっては最初にアセンブラを無理して理解しようとしなくても良いとも思う。

共-3(1).

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

(回答)
E1~3 BareMetalで遊びつくそう Raspberry Pi
B4 Embedded System Reverse Engineering 101
A6 ハードウェアセキュリティ最前線

自分の興味に最も近いのがハードウェア関係で、純粋にどういう設計になっているのか、ソフトウェアがどうリソースを活用しているのかを知りたいと感じるため。生でCPUを触ったりソフトウエアが動作しているときのハードの様子を解析することは、この欲求を満た自分のスキルセットの基礎を固めるに最適だと考える。

共-3(2).

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

(回答)
マイコンを使った制作は行ってきたが、正直よく知らないまま使った点も多い。加えて、大学の講義などでコンピューターサイエンスについて学ぶと、いかに自分の触っていた計算機が原始的なものかを思い知らされる。そこで、自分がいちばん慣れ親しんでいるハードウェアという切り口で、複雑な最先端のコンピューターサイエンスに至るまでの勉強を行いたいと感じる。そのために、今のハードウエアが何をやって、その上でソフトウェアが何をやっているかという仕組みの部分を知る必要があると考えている。セキュリティという観点から言っても、低レイヤーな部分を知ることは、ハードウェアを知ること、ひいては自分の知識の拡充と未来への応用につながると考えている。

選択問題

選-A-1.

添付したファイルに記録された通信を検知しました。この通信が意図するものは何か、攻撃であると判断する場合は何の脆弱性を狙っているか。また、通信フローに欠けている箇所があるがどのような内容が想定されるか、考えられるだけ全て回答してください。なお、通信内容を検証した結果があれば評価に加えます。

(回答)
Wiresharkを使いパケット内容を解析した。
まず通信内容においてHTTP GETのヘッダが通常ではない文字列になっている点について調査すると、2017年3月に確認されたStruts2脆弱性(OGNLインジェクション)を利用したコードではないかと推測できる。
HTTPプロトコルにおいてあるべきレスポンスが含まれるパケットがないため、実行できたかどうか、結果はどうであるかは不明である。通常ならリクエストのあったorders.xhtmの内容が返されるはずであり、脆弱性があればその内容に加えてcat /etc/passwd コマンドの実行結果も含まれるはずである。パケットがあるべき場所は、No.5のあとである。
次に、ポート22に対してACKフラグのみが立っているパケットが4回送信されている。ACKフラグのみがたったパケットは、TCPにおける3way handshakeにおいて接続確立の確認の歳や通信時のウインドウ制御時にに送信されるものである。まず、少なくとも、ポート22とのハンドシェイク時に送信されたと思われるNo.6のパケットの直前に192.167.74.1から送信されるSYNフラグが立ったパケットと、192.168.74.130から送信されるSYNとACKフラグが立ったパケットが存在すべきである。続けてポート22とのやり取りが行われている点から、ポート22との接続は確立されたと推測する。
No.6にて接続されたポート22との通信は、やはり192.168.74.130から送られているパケットが記録されていないが、スライディングウィンドウ制御におけるAckの返答とみられるパケットが送られている点から、192.168.74.1側がデータを受信していると考えられる。
ポート番号が22ということで、先の脆弱性をついた攻撃と合わせて、パスワードを盗みSSHにて接続している、というストーリーが考えられるが、cat /etc/passwd にてパスワードが盗まれたかどうか、実際にSSHにて接続が確立されたかどうかの断定はできないと考える。

及第点くらいかなぁという感じの回答。後半のやりとりがよくわからなかったので、調べた上で「こうなっているんだろうけどよくわからなかった」と書いたのは個人的にちょっと頑張った点だったりする。

選-A-2.

機械学習の弱点は何だと思いますか?

(回答)
機械学習は与えられたデータの特徴を学び、一般化し、未知のデータを分類する、あるいはその分類の効率を上げることである、とする。
この学習過程は人間のパラメータ調整抜きに行われるのが理想であるが、その半面どのような学習をするかが不明である点。具体的には、パラメーターが学習データに適応しすぎて一般化できなくなったとき、誤った分類を行ったとき、正しい分類が行われたときでもなぜそのような結果が得られたかのトレースができないという弱点につながる。
また、遺伝子によってある程度はニューロンの接続が決定されている生物と違い、機械はその分類器をより一般化した形で遺伝させることができない。例えば視覚の情報処理において、脳は縦成分や横成分、顔の検知はある程度遺伝レベルで実装済みである(と聞いたことがある)。後天的に、それらの分類を再度学習して、見たものがどういう特徴を持っているのかという分類を行う。機械学習は、先の例で言えば空間周波数特性などの手段はあるものの、基本的にすべてゼロからの学習である。そのために、時間と入力データが膨大に必要となる点が欠点であろう。

無難というか平凡というか。あまり機械学習とかよくわからず、書く時間もなかったので前半は変なこと言ってるかも。後半はわりと思いつきである。

選-A-8.

いわゆる「セキュリティ技術」の中で、あなたがもっとも興味があるテーマひとつについて、好きなだけ語ってください。

(回答)
最も興味があるのは、物理攻撃の類である。ICのパッケージを開封して細工する、漏れてくる電磁波を解析するサイドチャネル攻撃などである。これらの攻撃方法の魅力としては、基本的に対策が難しいという点だと考えている。たとえソフトウェアに欠陥がなくとも、情報を奪取出来る圧倒的な優位性が個人的に強く惹かれる点である。ソフトウェアの動作を別次元のハードウェア面から解析するという切り口は、いかにもハック的であり、稚拙な言葉を使えばワクワクしてしまう。ハードからソフトまでのあらゆるレイヤの知識を必要とし、あるいは物理や統計などの処理を必要とする点についても、相当に優れた技術を使いこなさなければならないという点で非常に尊敬する手法である。そして、ハードの設計、動作アルゴリズムのレベルでセキュリティを見直さなければならないという問題のクリティカルさが、安全性を基礎の部分から押し上げる事に繋がるのも魅力的である。

これは素直な気持ちを述べた。ハードウェアセキュリティの講義を受けてみたが、講師の方も「もともと数学で暗号を解くみたいなことやってたけどサイドチャネルで破られたので飽きた、今はハードウェアセキュリティについて研究している」みたいなことをおっしゃっていたし、自分の回答としてはよくかけたと感じている。


もともとセキュリティとは分野はあまりかぶっているとは感じなかったので、あえてセキュリティにはこだわらず、全体的に自分の素直なスキルと気持ちを書いてみた、というのが今回の回答である。セキュリティにはやっぱりソフトがどう動いているのか、ハードをどう利用しているのかみたいな問題が絡んでくるので、その点には触れつつ、基板の上からレイヤーを見上げるという立場をとった。ところで、多分8000文字いかないくらいの量だと思いますが、これは少ない方なのでしょうか。技術的な選択問題を解く時間は正直なかったので(時間があったからといって解けたとは限らない)、お茶を濁すというかほんわかとした回答で濁すというか。

全体を通して、セキュリティやるぜ!!!みたいな雰囲気はないが、受かった以上は、自分自身でもある程度努力をしてきていて、これからやることのステップアップとしての機会にしたいということがアピールできたのかなぁと考えている。講師の人が見るらしいが、実績よりもこれからどう成長するか、みたいな部分に重点を置いている等お聞きしたので、そういうこともあるのだろう。

と、ここまではいいのだが、実際にハードウェア系の選択講義を取ってみて感じたのだが、集中コースにして27時間同じテーマで勉強するとか、あるいは全然知らない講義を取るべきだったかもなぁというのが主な反省点で。

セキュキャンというのは多分次の一歩を別の方向、今まで行かなかった方向、あるいは寄り道になる方角に向ける機会だったように感じる。先生の方も「ついてくることは別に前提としてなくて、好奇心をくすぐるのが目標なんです(意訳)」みたいなことを言っていた。それに、「講義受けていて、あぁこれ無理だ、とか、挫折した人手あげちゃって」みたいな問いには参加者の多数が手を上げた。そんなものなのだ。

ゆくゆくやる、みたいな内容を取ってもそれは多分この先人生の何処かでやるだろうし、それはそれでありなのだが、たった5日、講義としては27時間の間に何を学ぶのか?と立ち止まって、そこから得られる経験っていうのはどういうものなのかもう一度よく考えるべきであった。もちろん全然違う分野を受けようと思ったが、わからないまま終わってしまうことに恐怖を感じ安牌を取ってしまった。

というわけで、もし、ここまで読んだ、どんなことをキャンプで学ぼうかと悩んでいる優柔不断な人がいたとしたら、僕は大幅な寄り道や全然違う分野の講義を取ることをおすすめしておきます。事前課題の量が不安?ついていけなかったときが心配?そういう心配はいらない。いらないんですよ。

こうやってウダウダ振り返るのも自分の悪い癖なので、ちゃーーんとこれからも色々やっていきます。いきましょう。