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

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

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

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

はじめに

さっそく前半

nonkuru.hateblo.jp

の続きを書いていきたいと思います。

私は選択問題では1、3、5、6を選択しました。

選択問題

選択問題1

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

gistbf1ef730ba714e8fe8f736397cd64410

以下ソースコードと実行結果を見て思ったことを箇条書きで示します。
・メモリアドレスのビット数から推測すると12桁×4bit=48ビットシステムである
・またアドレス空間は248=127TB
・このアドレス空間の大きさを格納できれば良いので、ポインタ型の大きさは48bit/8bit=6byte
・この関数のマシン命令はテキストセグメントに確保される
・main関数内のint型(4byte)の配列hogeはスタックセグメント内に確保される
hoge[10]は0x7fff539799f0から40byte分確保される
mallocは動的確保なのでヒープセグメント内に確保され、fugaはヒープセグメントに存在する
・この
fugaのアドレスは0x7fca11404c70であり、サイズは6バイトである
・そのアドレスをスタックセグメント内に確保されたポインタ変数fugaに入れる
・データセグメントを伸ばしたり縮めたりすることで、メモリを割り当てたり、解放したりする
mallocはbrkシステムコールを使う
・brkはデータセグメントの大きさをアドレスで指定する→新しいアドレスが古いアドレスよりも大きければデータセグメントは伸び、小さければ縮む
・スタックがスタックセグメントの底を越えて伸びてきたら、通常はハードウェアフォールトが生じ、OSがスタックセグメントを1ページ分だけのばす
・プログラムが実行をはじめるとき、スタックは空ではない→このプログラムが呼ばれた時にシェルに与えられていたコマンド行と、環境変数が入っている
・main関数の引数で4byte+6byte=10byteの変数を確保しているから引数と環境変数が確保される領域(スタック領域より高いアドレスに10byte分確保される)
・0x7fff539799f0から44byte先の0x7fff539799f0+0x2c=0x7fff53979a1c
・以上のことを考慮すると、(スワップ領域)+(スタック領域)=(0x7fff53979a1c)-(0x7fff539799f0)=0x3542574dac=約213GB

選択問題3

RAMは主記憶装置、HDDやSSDなどは補助記憶装置と呼ばれます。一般にCPUは主記憶装置上のプログラムしか実行できません。ではなぜ、私たちは普段から補助記憶装置に書き込んだプログラムを実行できているのでしょうか?パソコンの電源を入れてからのストーリーを考えてみてください。

以下に電源ボタン押下時からのストーリーを箇条書きで示します。
1.電源ボタン押下
2.電圧と電流が一定レベルに到達しているか確認するセルフテストを実行
3.この結果が満足されれば電源はタイマーチップ・マイクロプロセッサに対し”Power Good”というシグナルを送る
 ・電源のセルフテストにかかわらず電力はコンピュータ内に行き渡る。そこでCPUは起動処理を開始しようとするが電源のセルフテストが終了していない間はCPUを制御するためのタイマーチップはCPUにリセットシグナルを送り続ける
4.タイマーチップが”Power Good”シグナルを受け取るとCPUに対するリセットシグナルをを停止しCPUの制御を解放し起動処理に移る
5.マザーボード上のROMに記憶されたBIOSが起動
6.POST(Power On Self Test)の実行
 ・ビデオテスト・BIOS同定・メモリテストから構成されている
 ・“Cold-Start”か”Warm-Start”かをチェック:これを判別するためにBIOSスタートアップルーチンはメモリの0x00000472にある2byteの値をチェックする。この値が0x1234であれば”Warm-Start"それ以外なら”Cold-Start"
 ・"Cold-Start"(電源OFFの状態からの起動)ならPOSTの全てのテストを実行、"Warm-Start”(起動していたOSを再起動)ならメモリテストは省略
 ・ビデオテスト:ビデオアダプタを初期化し、ビデオカードとビデオメモリをテスト
 ・BIOS同定:BIOSのバーション・製作者・日付を表示
 ・メモリテスト:メモリチップをテストし搭載されているメモリの合計を表示
 ・POST中のエラーは”Fatal"(致命的)か”non-Fatal"(非致命的)に分類
 ・“non-Fatal”:スクリーン上にエラーメッセージが表示されシステムのブートプロセスは継続、“Fatal”:ブートプロセスを停止。”Beep Code”に基づくビープ音でエラー   の発生を報告
7.これが終わるとCMOS設定情報の読み込む
 ・CMOSの設定情報にはマシンにインストールされているディスクの種類・起動時にパスワードが必要か否か・PCの起動にはどのデバイスが必要か等がある
 ・BIOSスタートアップルーチンのために重要な事はCMOSがOSのために検証されるべきドライブの順番を指示することでBIOSが割り込みベクタとその処理を用意している
8.割り込みベクタからデバイスの読み込み処理を呼び出して最初のセクタ(MBR:Master Boot Recode)がメモリに読み込まれ実行される。
 ・このセクタには、512byteのプログラムが入っている。
 ・このプログラムは通常IDESCSIディスクであるブートデバイスからブートローダ(IPL:Initial Program Loder)をロードする。
 ・ブートローダには入っている最後のデータが0x55AAならば、メモリの低いアドレス部分をカーネル用に空けるために、まず自分自身をメモリの高いアドレス(0x7c00)にコピーする
9.コピーが完了すると、ブートローダはブートデバイスのルートディレクトリを読み出す
10.次にカーネルを読み出し、そこへジャンプする
11.カーネルカーネルスタックの設定、CPUの型を認識、搭載されているRAMのサイズを計算、割り込みを禁止し、MMU(Memory Management Unit)を使用可能にし、最後にカーネルの主要部を実行する
 ・これ以降メッセージバッファの割り当て、カーネルデータ構造の割り当て、デバイスの探査、デバイスドライバの配置など各種初期化を行う
12.それが終わるとOSの指示により補助記憶装置からプログラムが主記憶装置にロードされる
13.ユーザがシェル上で実行ファイルを実行させると、shellプロセスの子プロセスがfork-exec命令により生成されshellプロセスとは独立したメモリ空間に配置される
14.メモリに格納されたプログラムの指示に従いCPUが動作する
 ・CPUが主記憶装置から命令を取り出す
 ・命令を取り出すアドレスは、CPUのプログラムレジスタに書かれている
 ・取り出した命令は、CPU内の命令デコーダーにより、命令の内容を解析される
 ・解析された命令は、論理演算装置(ALU:arithmetic logic unit)により、演算が実行される
 ・演算結果は、各種のレジスタに格納される
 ・プログラムレジスタの値を再設定する
 ・以上の動作をプログラム終了まで繰り返される

選択問題5

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

 OSの本質はカーネルにあると思います。なぜなら、最低限カーネルさえあればハードウェアを計算機として動作させることができるからです。逆にカーネルがなければハードウェアはただのシリコンやプラスチック、金属の塊に過ぎません。しかしカーネルが全てを支配しているとは言えないと思います。これは私がOSを作っていて感じた事ですが、OS開発の初期の段階はCPUやフラッシュメモリなどの仕様に従いレジスタに設定していかなければなりません。それは、仕様の異なる自分勝手なハードウェアに付き合わせられなければいけないということであると思います。この仕様が面倒だから変えようなんてことはできません。さらに、世間には様々なOSが存在しますがボード上に特定のハードウェアがあるかないかによってもその設定は変わってきます。例えば組み込みOSが入れられるようなボードには大抵メモリ管理を任されるMMUがありません。このようにOSはCPUやその他ハードウェアに従うしかありません。OSとハードウェアが持ちつ持たれつの関係を保っていてこそ動作が実現できていると思います。  では、なぜそのような大切なカーネルひいてはOSが初めからROMに記憶されていないのかですが、それは誰にも将来を見通せないからだと考えます。もし将来がわかる人がいればおそらく完全なOSが作れると思います。必要になる機能を全て実装しておけば良いからです。しかし現実にそんなことはできません。だから後から改変できるようにROMではなく補助記憶装置に書き込んでおくのだと思います。それがソフトウェアの最大のメリットであり、ソフトウェアがソフト(柔軟)たる所以だと考えます。また"プログラムは手段に過ぎない”という言葉をネットで見かけたり、人から聞いたりすることがたまにあります。なんとなくそういうものかなと私も思っていました。しかし自分でOSを作り始めて、初めてその言葉が腑に落ちたと感じました。OS作成では、OSのコードを書いてそれをコンパイルして中間ファイルをたくさん生成して結合して最終的にバイナリファイルが完成します。それによってようやくコンピュータというハードウェアが動きだします。このようにハードウェアを動かすことで人の代わりに計算させることが本来の目的であり、プログラムを書くことが目的ではありません。改めて言葉にしてみると当たり前と感じますが、OS制作を通じてハードウェア制御を学ぶことでなんとなくわかっていたことが身にしみて感じた自分にとってとても大切な瞬間でした。

選択問題6

IDとパスワードを入力したユーザの認証を行うWebアプリがあります。あなたがこのアプリに対してセキュリティテストを行う場合、まず、どのようなテストをしますか?なぜそのテストを選択したのか、その背景や技術的根拠と共に記載してください。アプリの内部で使われている技術やシステム構成に、前提を置いても構いません。

まず私は、このWebアプリケーションは自分で作成し自分でセキュリティテストを行う前提とします。自分で行うので高額なベンダーには発注せず、もちろん高額な脆弱性診断ツールは使えないのでツールは全てフリーのものを使用するものとします。また、最近は診断法の参考として一般に公開されているIPAの「ウェブ健康診断仕様」(https://www.ipa.go.jp/files/000017319.pdf)のような脆弱性診断仕様を使用し検証します。ただし、このような脆弱性診断はあくまで簡易検査であり、自前の診断のみで脆弱性を全て排除できないと思っておくことが最大の対策であると考えます。その上で、まず初めにセキュリテイテストを行うとすれば認証システムに対してはウェブ健康診断仕様の16ページから17ページに書かれている6項目についてテストをしていきます。この6項目をテストしていくことでWebアプリケーションにおいて考えうる代表的な脆弱性については対策が可能であると考える。まず、1つ目の「パスワードの最大文字数が8文字以上確保されているか」と2つ目の「パスワードの文字種が数字のみ、英字のみに限定されていないか」、6つ目の「意図的に10回パスワードを間違える」は文字数と文字種と試行回数について言及されており、総当たり攻撃や辞書攻撃に対する対策だと考えられます。3つ目の「パスワードが入力時に伏字になっているか」4つ目の「パスワード間違いの際のメッセージは適切か」は表示に言及しており、ID・パスワード方式の認証はパスワードの文字列を正規の利用者本人しか知らないという前提で作られいるので、誤ってその情報を画面上に表示してしまい近くの人が覗き見ていた場合その前提が崩れてしまいかねません。このようなショルダーハックの類の対策だと考えられます。5つ目の「ログアウト機能はあるか、適切に実装されているか」は、認証後のセッションIDの管理に不備があると考えられます。例えばセッションIDの固定化やセッションIDをクッキーに設定していた場合にセキュア属性が設定されていないなどです。これら以外に考えられることとしては、このような認証方式には大抵データベースが使用されているので、SQLインジェクション対策やもし情報が流出してしまった場合の対策としてパスワードに暗号化が施してあるか等が考えられます。

まとめ

あらためて自分で見てよくこんなクオリティで提出できたなと思います。選択問題のメモリについては勉強中だったので正直よくわかりませんでしたが、他の方の応募用紙を見て、そうだったのか!!!という発見があってとても勉強になりました。他の問題についてもいろんな人の応募用紙を見ると違った視点がありとてもおもしろいです。
レベルの高いこのキャンプに行けること願うばかりです。以上私のセキュキャン全国の応募用紙でした。(受かってればいいな〜〜〜〜)

追記

なんとセキュリティ・キャンプ全国大会2016に通過しました!!!!!!もうこんな内容で合格すると思ってなかったのでめっちゃうれしいです!セキュキャンに向けて、そして終わってからもがしがしがんばるぞ!参加者各位よろしくお願いします!!!