Senchaのブログ

あまり更新しません

セキュリティ・キャンプ全国大会2016 選択問題

 次、選択問題について書きます。あまり知識がないので考えれば書ける問題をできる限り多く取り組みました。結果的に3、6、7、8、9の計5つ解きました。

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

 プログラムを動かす上でCPUはHDDやSSDなどの補助記憶装置から(は)実行できません。しかし、OS自体もHDDやSSDの補助記憶装置に書き込まれているため、どのように起動するのかについて疑問を持ちました。データを処理するのがCPUであるため、メモリからデータを渡されないとOSは起動できません。OSをメモリにロードするためにはメモリにあらかじめ存在してなくてはならないと考え、矛盾が生じてしまうと思いました。

 以下にパソコンがどのようにしてOSを起動するかについてのストーリーと、補助記憶装置上のプログラムがどのように実行されるかについてのストーリーを示します。

 まずはパソコンが起動する流れです。

1:パソコンに電源を入れるとまず始めにROM(Read Only Memory)に記録されている第1次ブートローダであるBIOS(Basic Input Output System)が直接起動します。

2:BIOS自信はOSを起動するのに十分な機能がないため、OSを読み込むのに使用するプログラムである第2次ブートローダを読み込みます。WindowsではBOOTMGR、LinuxではSYSLINUXです。

3:第2次ブートローダはハードディスクからOSを起動するのに必要なプログラムを次々とRAM(Random Access Memory)にロードするように命令を出し、一定段階ロードすると残りはOS自身がロードを行い起動します。

 以上の動作によってOSが起動し、パソコンが使用できるようになります。メモリ上に存在しないOSが起動するのは、第1次ブートローダであるBIOSと第2次ブートローダのおかげだということを知り、矛盾しないことが分かりました。

 次は補助記憶装置上のプログラムがどのように実行されるかについてです。私たちは普段プログラムの実行を簡単に行ってしまい、その裏でどういった動作が行われているかについてあまり考えることはありません。HDDやSSDなどの補助記憶装置上のプログラムをどのようにしてCPUがプログラムを実行しているかについては以下の通りです。ここでは「Hello, World」と表示するプログラム「a.out」を実行したとします。

1:実行ファイルを「./a.out」といった形式で入力し、実行するとI/O命令が出され、割り込み要求が発生します。割り込み要求を受け取ったCPUは割り込み要求を処理します。その処理方法はOSに任されます。

2:OSから命令が出され補助記憶装置上にある「a.out」の機械語を丸々RAMにコピーします。

3:RAMにコピーされたプログラムの指示に従い、CPUが動作します。その動作は以下の通りです。

3.1:CPUがRAMから命令を取り出します。命令を取り出すアドレスはCPUのプログラムカウンタに書かれています。

3.2:取り出された命令はCPU内の命令デコーダにより、命令内容を解析します。

 3.3:解析された命令は論理演算装置によって演算が実行されます。

 3.4:演算結果は各種のレジスタに格納されます。

 3.5:プログラムカウンタの値を再設定します。

 3.6:以上の動作をプログラム終了まで繰り返します。

4:メモリマップドI/Oによって出力結果である「Hello, World」が画面に表示 されます。

以上が補助記憶装置上のプログラムが実行されるストーリーです。

 しかし、分からないことが1つありました。出力結果を表示するのには処理を追っていくとシステムコールが命令されます。私はシステムコールが上記の手順のうちどのタイミングで命令されるのかが分かりませんでした。

 私は普段どのようにOSが起動しているのか特に考えずパソコンの電源を入れ操作します。そしてどのようにして動いているのかもよく知らないまま補助記憶装置上のプログラムを実行していました。この課題を通していかに自分が低レイヤーの働きについて蔑ろにしていたかを痛感しました。それと同時にOSの起動がどのように行われ、プログラムがどのように行われてるかについて興味を持ち、詳しい処理内容がどのようになっているかについて知りたいと思いました。

 またOSがどのように起動しているかについて理解し、興味が出たと同時にどのようにしてシャットダウンしているのかについて疑問を持ちました。ですので、以下にどのようにしてOSがシャットダウンするのかについてのストーリーも示します。

 1:マウスを操作しシャットダウンボタンを押すと割り込み命令が発生します。

 2:OSがシャットダウン処理を開始します。

 3:初めにアプリケーションが終了されます。

 4:次にバックグラウンドで動作するプロセスが終了します。

 5:その次に各種マネージャーを終了します。このとき構成マネージャーはレジストリをディスクに保存し、メモリマネージャーはキャッシュに保存されているデータが正しく反映されているかチェックします。

 6:最後に全てが終了すると処理を終了し、電源をオフにしてシャットダウンが完了します。

 以上がシャットダウンまでの流れです。大まかなシャットダウンプロセスは分かったのですが細かいメモリやOSの処理までは分かりませんでした。起動プロセスやプログラムの実行までの流れだけでなく、シャットダウンの詳しい動作についても知りたいと思いました。

 アプリケーションなどを開発するときに低レイヤーの働きを知っていることはバグ取りや応用にも繋がると思うのでもっと深く勉強し、高レイヤーだけでなく低レイヤーの働きも理解しているエンジニアになりたいです。

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

 Webアプリケーションに対して私はまず初めに以下の7つの項目の脆弱性をつくことによってセキュリティテストを行いたいと考えます。しかし、これだけを行っていれば安全というわけではないことに注意しなくてはなりません。

1:SQLインジェクション

2:OSコマンドインジェクション

3:ディレクトリトラサーバル

4:セッション管理の不備

5:クロスサイトスクリプティング

6:クリックジャンキング

7:バッファオーバーフロー

 なぜ上記の7つのセキュリティテストを選択したかというと、私はIDとパスワードを入力する形式のWebアプリケーションにおいていずれも重要であり、当たり前に対策できているべき脆弱性であると考えたからです。また当たり前に対処できている基本中の基本であるからこそ忘れがちになっていると考えられます。これらの脆弱性は一つでもあるとWebアプリケーション上にある個人情報や運営機密などを盗まれ悪用されてしまう恐れがあります。またこれらの基本的な脆弱性対策が一つでも欠けていると、セキュリティに疎い開発者だと思われもっと高度な攻撃や別の目的を持った攻撃も受ける羽目になるかもしれません。個人情報の漏洩だけでなくWebアプリケーションサービスの停止などにも繋がってしまう恐れもあります。

 ここで1つSQLインジェクションの例をあげます。SQLインジェクション攻撃は非常に簡単に行うことができます。実際に私がCTFでSQLインジェクション脆弱性をつく問題に取り組むとき、SQLインジェクションという言葉さえ知りませんでした。しかしインターネットで調べるとSQLインジェクションという攻撃方法があることをすぐ見つけることができました。そして、その方法もすぐに分かり簡単に攻撃することができました。

 IDとパスワードを入力するWebアプリケーションだとユーザの管理はデータベースで行っていると考えられます。このとき適切な処理を施していないと不正なSQL文が実行され悪意のあるリクエストによりデータベース上の個人情報が流出してしまう可能性があります。

以下に示すSQL文を用いたログイン判定には脆弱性があります。

SELECT * FROM user WHERE uid='$uid' AND pwd='$pwd'

この場合「' OR 1=1--」という文がパスワードに与えられたとき、不正ログインを可能としてしまいます。この対策としてはエスケープ処理を施すことで対処することができます。他の対策としては、プレースホルダを実装する、渡されるパラメータにSQL文を指定しないなどの方法もあります。

 ここでは不正ログインだけでしたが、情報を盗み出すようなSQL文が実行されれば多くの個人情報が流出します。ここで流出したデータが悪質な業者に売買され、不正に使用しようされてしまうようなことがあれば、被害はさらに拡大してしまいます。

 ですがこのような対策をせずともSQLインジェクションや、クロスサイトスクリプティングは使用しているWebアプリケーションプラットフォームがApache StrutsRuby On Railsであれば元々作りこまないように設計されており、セキュリティ対策が施されています。このように開発者がソースコードを書く際に気を配らなくても対策を行えます。

 しかし上記で挙げた脆弱性の他にもCSRFやHTTPヘッダインジェクション、メールヘッダインジェクションなど様々な脆弱性が存在します。開発者自身が知らない脆弱性も潜んでいるかもしれません。セキュアなWebアプリケーションを提供したいなら脆弱性を発見してくれるツールやバグハンターのような専門の方に任せて探してもらうという手段もあると思います。重大な脆弱性がなくとも小さな脆弱性から大きな問題に繋がってしまう可能性もあります。インターネット上で提供する以上100%安全なアプリケーションは存在しないと思います。個人情報を扱う以上開発者は常にセキュリティについて気を配るべきだと考えます。

 以上がWebアプリケーションに対して7つのセキュリティ対策を行う理由です。しかしこれらのセキュリティ対策だけではセキュアなアプリケーションとはいえず、他の脆弱性も存在すると思います。

 残念ながら私はWebアプリケーションを本格的に作成したことがなく、脆弱性自体は知っていても対策の方法が分からないことや、知らない脆弱性自体も多くありました。いずれは私もWebアプリケーションを作成しインターネット上で提供してみたいと考えています。そのときに脆弱性が存在するようなアプリケーションを提供することがないよう、セキュリティ・キャンプで脆弱性の評価・対策を学びセキュアなアプリケーションを提供したいです。

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

 悪意のある第三者が存在することを証明することは不可能だと思ったので悪意のある第三者が存在しうるであろう部分の可能性を考えます。そこを潰していくことによって悪意のある第3者が限りなく存在できない環境にしていきます。

 まずはPCに直接繋げられている場合を考えます。このような場合にはCPU時間や、アクティブで動いているメモリを確認し安定した状態をある程度定めておきます。その範囲を超える異常な動作が見られれば第三者が存在する可能性が出てきます。PCのユーザ数を確認し、自分の知らないIPアドレスMACアドレスがあった場合には悪意のある第三者が存在するかもしれません。また、見覚えのないコマンドログやエラーログ、アクセスログなどが残っていれば侵入された可能性が浮上します。他にも、元あったデータと比べてデータを抜き取られていないか、壊されていないかを確認します。データが無くなっていたり壊れていたりしたら悪意のある第三者が存在する可能性が出てきます。

 ルータにシリアルケーブルなどで直接接続されている場合にはルーティングテーブルが書き換えられていないか、インタフェースに見覚えのないIPアドレスなどが振られていないかを確認し、見覚えのないものが見つかったら悪意のある第三者が存在している可能性があります。

 サーバも同様にポートや、ユーザ数、ログ、機器の温度を確認し、悪意のある第三者が存在している場合は異常を発見できます。

 特殊な例だとは思いますが「セキュリティミニキャンプ in 香川」で光ファイバケーブルからの盗聴について講義を受けました。そこでは専用線クロージャーの上でカプラを繋ぎスプリッタで光を50:50に分割し一つを正常な方向へ、もう一つは盗聴側へ回しコンバータでイーサネットから盗聴することができるというものでした。私が「光ファイバケーブルから盗聴を行われていた場合にPCから確認できるのか」と講師に質問したところ「基本的には無理である。しかし、デシベルの状態を常に見ていて光ファイバケーブルが切られたとき僅かにデシベルが下がるので、そこで異常を検知できればわかる」と返答をもらいました。このようにして常に見張っていれば光ファイバから盗聴されているかそうでないかを考えられます。

 また悪意のある第三者が存在できるであろう電子機器も幾つか考えられます。しかし以下に示すのは自分ではどのように接続されていて、どのように悪意のある第三者が存在しているのかが分かりませんでした。

 ネットワークに繋がったプリンタなどの電子機器も十分悪意のある第三者が接続可能であると考えられます。近年電子機器がネットワークに接続されることが多くなってきました。冷蔵庫もネットワークに繋がるようになり冷蔵庫から悪意のある第三者が侵入してきてしまう可能性も考えられます。電話線に繋いで盗聴される、電源から盗聴される、電磁波から盗聴されるといった可能性も考えられます。

 この問題を解くに当たって様々な方法を考えました。しかし、完璧にネットワークに悪意のある第三者が存在しないことを証明不可能だということが分かりました。そこで存在する可能性がある部分を潰していくことで存在しない可能性を高めていきました。高いレイヤでの証明ならまだしも、光ファイバからの盗聴のように低いレイヤまで考えると検知、発見する方法が限られてきてしまいます。さらに自分の知識では分からないものもあり、いかにこの問題が難しいかを実感しました。自分の少ない知識でもこれだけの項目を上げることができました。セキュリティを行うことがいかに大切か、どこまでのレベルでセキュリティを上げていき、どういった項目までセキュリティ対策をしなくてはならないのかということについて深く考えさせられました。あらゆる角度からどのような攻撃がくるかということを考えネットワークを構築していくことが大切だと感じました。

 この証明がどれくらいできるのか、どういったレベルまでセキュリティを施しても侵入が可能なのか、などをセキュリティキャンプに行って学び、自分がネットワークを構築するときにセキュアな構築ができるようになりたいです。

選択問題8:以下のダンプはあるプログラムのobjdumpの結果である。このプログラムが行っていることを調べ、その結果を記述してください。完全には分からなくても構いませんので、理解できたところまでの情報や調査の過程で使ったツール、感じたこと等について記述してください。

 この結果を手動で解析したところ、標準入力から文字列を受け付け、「c@Np2O16」だったら正常に終了を、そうでない文字列が入力されたら異常終了をするプログラムだと分かりました。ダンプ結果の動作は以下の通りです。

 まずpushq命令によって値を次々にスタック上に積まれるので一つ一つ紙に書いて積んでいきました。

 途中にある「movabs $0x63391a67251b1536, %rax」は%raxに第一オペランドの値を絶対値で格納しています。ここでmov命令ではなくmovabs命令を使ったのはmov命令だと値が入りきらないからだと考えました。

 スタックを積み終わると「retq」という命令がありますが、これはスタックポインタが指している値に返るという命令です。なのでこの場合には「retq 0x400102」の番地へ飛びます。ダンプの結果を見るとretq命令が多く、様々な番地へ飛ぶプログラムだということが考えられます。

 0x400102へ飛ぶとpop命令によって%raxに0x0を格納します。 pop命令はスタックポインタが指す値をレジスタに格納するという命令です。

 「retq 0x400106」へ飛ぶとpop命令により%rdiレジスタに0x0を格納します。

 「retq 0x40011c」より「mov %rsp,%rsi」の番地に飛びスタックポインタが指す値、0x40011cを%rsiレジスタに格納。またretqしていき、pop命令により%r10に0x0を、%rdxに0x8を格納しました。

 次に「retq 0x400119」により「syscall」が呼ばれます。この時、システムコール番号である%raxには0が格納されているのでシステムコールテーブルより「read」が呼ばれることが分かります。第1引数%rdi = 0、第2引数%rsi = 0x40011c、第3引数%rdx = 8より標準入力からテキスト領域である0x40011cに8byte分の文字が入力を受け付ることが分ります。

 「retq 0x400108」のpop命令により%rbpに0xffffffffffffffe0が入リます。「0xffffffffffffffe0」は一見とても大きい値に見えますが、隣の機械語の命令を見ると値の割に機械語の命令の数がとても少ないことが分かります。調べてみるとこれは2の補数表現によってマイナスの値であることがわかりました。

 retqされpop命令が呼ばれ%rcxに7を格納。「retq 0x400114」に飛ぶとxorb命令、「xorb $0x55,(%rsi,%rcx,1)」呼ばれます。この命令は$0x55%rsi + 7 * 1という意味であり、%rsiの値、つまり標準入力から受け付けた文字列を7byte、0x55で排他的論理和をしています。

 「retq 0x400129」により「dec %rcx」が呼ばれ%rcxは7 ー 1より6となりました。次は「jne 0x40012c」という命令がきており、jneは直前の演算の結果が0ならばjmpしない、0以外ならjmpするという命令なので今回は0x40012c番地に飛びます。

 jne命令でjmpし「pop %r10」が呼ばれ、この時のスタックの値0x400102が入ります。

「retq 0x40010c」により「add %rbp,%rsp」が呼ばれます。%rspに%rbpの値が加算されますが%rbpにはマイナスの値が入っています。0xe0の2の補数表現の値は「0010 0000」となり-40bit、つまり-5byteとなります。%rspはスタックに積まれている先頭の値を指すのでこれが書き変わるということはretq命令で呼ばれた場合に本来とは違う場所に飛ぶことになります。%rspは現在0x40010cを指しており、そこから-5byte分スタックに積まれていた値を遡ると0x40010aであり、retq命令によってこの番地に飛ぶことになります。

 0x40010a番地に飛ぶと「pop %rcx」により0x7がまた格納されるように見えますが、ここの値はすでに保持しておらず何もされません。そのため演算や、retqなどの命令はできますがpop命令は意味をなしません。

 「retq 400114」により「xorb $0x55,(%rsi, %rcx,1)」、%rcxの値は6なので6byte排他的論理和がされます。

 「retq 400126」により「dec %rcx」が命令され6 ー 1 = 5となります。

 先ほどのjne命令は0になったら飛ばなくなるので、この%rcxの値が0になるまでループすることが分かります。「xorb」命令が途中に入るので5,4,3,2,1の順で排他的論理話がされることが分かります。

 %rcxの値が1まで行くと「dec %rcx」により1 ー 1 = 0。「jne 0x400102」が呼ばれますが直前の演算が0になったので飛ばずにループを抜け出します。

 「pop %rax」により%raxには0x40010cが格納されます。

 「retq 0x400114」により「xorb $0x55,(%rsi, %rcx,1)」が命令されます。%rsiには標準入力から入力された8byteのデータが入っていますが、xorbの命令で排他的論理和されていたのは7byte目までです。しかしここで8byte目の値も$0x55で排他的論理和されます。

 「retq 0x400106」により「pop %rdi」には0x0が格納されます。 

 「retq 0x400102」により「pop %rax」には「63391a7251b1536」が入ります。

 「retq 0x400110」により「cmp %rax,(%rsi)」が命令されます。これは「63391a67251b1536」と%rsiの値、つまり標準入力から受け付けたデータを$0x55で各byte排他的論理和した値と比較しています。

 「retq 0x400102」により「pop %rax」には0x3cが格納されます。

 「retq 0x400129」により「jne 0x40012c」が命令されます。この時のjneは直前の演算結果、つまり「cmp %rax,(%rsi)」の結果で飛ぶか飛ばないかを判断します。この時点ではまだ結果がわからないので2パターンの結果を見ていきます。

 まずは飛ぶ場合です。「cmp %rax,(%rsi)」の結果が等しくなかったらjne命令により飛びます。

 0x40012cに飛ぶと「pop %r10」により0x400119が格納されます。

 「retq 0x400106」により「pop %rdi」には1が格納されます。

 「retq 0x400119」により「syscall」が命令されます。この時のシステムコール番号である%raxは$0x3c、10進数に直すと60になりシステムコールテーブルより「exit」が命令されます。第1引数である%rdiの値が1なのでjne命令で飛ぶ場合は「exit(1)」、エラー終了となることがわかりました。

 次は飛ばない場合です。「cmp %rax,(%rsi)」の結果が等し買ったらjne命令がされず飛ばなくなります。

 「retq 0x400119」により「syscall」が呼ばれ飛ばない場合と同様に「exit」が命令されます。第1引数である%rdiは0なので「exit(0)」、正しく終了することが分かりました。

 解析によりこのプログラムは標準入力から8byteデータを受け付け、そのデータを各byteごとにxorし、その結果をスタックにあった値と比較するものと分かりました。

 標準入力から受け付けたデータを文字列と仮定し、「63391a67251b1536」を「0x5555555555555555」で排他的論理和した結果を文字列に直したところ「c@Np2O16」と言う文字列を得ることができました。ただしIntel x86-64のCPUはリトルエンディアンなので「63391a67251b1536」は「36151b25671a3963」にしました。

 このプログラムは簡易的な暗号の構造ではないかと解析を進めていくにつれ思いました。例えば、パスワードを得るためこのプログラムを「string」コマンドのようなもので確認されても暗号処理がされているので一見分かりません。調べてみるとこれはバーナム暗号に近いものなのではないかと思いました。バーナム暗号は十分に長い乱数を鍵として、平文と鍵をXORすることで暗号文を生成する暗号方式です。今回の場合だと、乱数ではなく「0x5555555555555555」といった予め設定されているものと標準入力から受け付けた文字をXORし、元々ある正しい暗号文と比較するといったものです。バーナム暗号と言い切ることはできませんが、非常に近いものを感じました。これがXORだけでなくANDやORを何回も取り、様々なアドレスへ飛んで暗号生成をするような方法だったら解析がより難しかったと思いました。また、このobjdumpの結果を解析したことで低いレイヤから暗号の生成方法に触れられて面白かったです。他の暗号の生成方法も objdumpの結果から読み取ってみたいと思いました。

 今回初めてobjdumpの結果を解析しました。今までアセンブリ言語に触れたことが全くなく0からのスタートでした。最初は全く訳も分からず右往左往してしまいましたが先生や先輩にアセンブリ言語について教えてもらい、本などを使っていくにつれどんどん分かるようになりました。分かるようになるとobjdumpの解析がとても面白くパズルゲームをやっているような感覚で高いモチベーションを維持し続けながら最後まで解くことができました。最後まで解き「c@Np2O16」の文字が得ることができ、暗号処理をするプログラムだと分かったときはとても達成感を得ることができました。

 この問題を解いたおかげで逆アセンブリコードに大変興味が湧き、これからはどんどん色々なプログラムを逆アセンブルし解析したいと思っています。逆アセンブルの解析がとても楽しかったのでセキュリティキャンプではマルウェアを解析する講座や、逆アセンブルコードを扱うような講座を受講します。様々な逆アセンブリコードを読み解き、アセンブリの世界をもっと深く学び様々な知識を身につけたいです。

選択問題9:マイナンバーカードの配布システムを構築・運用することになりました。あなたなら何に気をつけてどんなサービスを構築しますか?

マイナンバーカードの仕様は現実通りのICカードとします。※ 注意: マイナンバーでは無くマイナンバーカードです。

 私は配布システムを構築・運営をすることになったら個人情報の安全に気をつけ利用者が使いやすいサービスを提供したいです。しかし、利用者が使いやすくすることと、安全なサービスを提供することを兼ね合わせるのはとても難しいと考えます。

 まずは利用しやすい、と言った観点からです。マイナンバーカードを申請、配布までの手続きをできるだけ簡単化したいと思います。具体的にはマイナンバーカード配布までの時間をなるべく短縮したいと考えます。現状のシステムにおいての配布までの流れは、個人番号カードに情報を記入しそれを郵便で各市町村へ届ける。市町村がマイナンバーカードの配布準備が整い次第ハガキを出しそこに記載されている交付場所で受け取る、と言った形式になっています。

 しかしこれでは時間がかかってしまうので私が運用を行うならば次のようにします。行政はあらかじめ何も情報が記載されていないカードを各市町村へ配布しておきます。そしてマイナンバーカードの希望者が出た場合には窓口で受付します。そこで情報をマイナンバーカードに記録し、その場でカードを渡す。その情報を後から行政に市役所が届けるといった形にし、カード配布までの時間を短縮したいと思います。イメージとしては銀行のカードがすぐに作れ、すぐに使えるシステムといった感じです。

 また、現状のシステムでは各市町村は混雑を考えハガキを送る時期を調整すると書いてあります。しかし、私は混雑が予想できるのはマイナンバーが必要となる機会が多い4月の年度始めなどの区切りの時期だけだと考えます。その他の時期で、多くの人はあまり必要としていません。実際、自分の周りではマイナンバーカードを受け取ろうとしている人は聞いたことがありません。なので年度初めはマイナンバーカード配布の時期は窓口を増設して大人数でも対応できるようにし、それ以外の時期でも必要な人が素早く受け取れるようにしたいです。

 次に安全なサービスといった点です。現在のマイナンバーカードの申請方法は「郵便」「パソコン」「スマートフォン」「街中の証明写真機」といった方法があります。自分がシステムを構築・運用するとしたら「街中の証明写真機」は危険なので無くしたいと考えています。「街中にある証明写真」は駅やコンビニの近くなど至るところにあり非常に便利だと思います。しかし、この利便性の高さが裏目に出ていると考えました。

 理由としては「街中にある」といった点と「自分が管理していなネットワークである」といった点の2点です。

 まず1つ目の「街中にある」といった点からです。街中にある、つまり誰からでも見られてしまう可能性が非常に高くなります。「郵便」「パソコン」「スマートフォン」で申請する多くの場合は家の中、もしくはオフィスでになるでしょう。家の中やオフィスならばある程度信頼の高い人が多くいると思います。しかし、街中においては誰がいつ見ているかも分かりません。証明写真機に盗撮機などが仕掛けられており悪意のある第3者に盗み見られてしまう可能性もあります。

 次は2つ目の「自分が管理していないネットワークである」といった点です。証明写真機から申請が行えるのですから当然ネットワークに繋がっています。自分が管理するパソコン、スマートフォンならまだしも誰がいつ使ったかも分からない証明写真機を使うのはセキュリティ上多くの不安が残ります。高いレイヤで通信が盗み見られていたらまだ監視システムが気づくかもしれませんが低いレイヤで通信が盗聴されていた場合には発見するのが難しいと思います。情報に詳しくない人が悪意のある第3者が存在していることに気付くはずもなく、盗聴されているのに気付かないままマイナンバーカードを申請したら個人情報の流出に繋がってしまいます。

 以上の2つの理由より自分は安全を考え「街中の証明写真機」からの申請は取りやめて運用したいと考えています。

 現在、証明写真機同様パソコンやスマートフォンもネットワークを利用しています。ですのでパソコンやスマートフォンが必ず安全とは限りません。しかし、パソコンやスマートフォンは普及が進み1人1台以上持っているのが当たり前になってきました。従って多くの需要が存在するであろうパソコン・スマートフォンからの申請は避けては通れないものと思います。しかしパソコンとスマートフォンでは手軽に申請できてしまう、というところに課題が残ると思います。ですので申請を行う際に、周りの人に画面を覗かれていないか、変な機器が接続されていないか、パスワードは安全なものを使用しているか、などの注意事項を表示させるようにして利用者の危機管理を促し安全に気を配ります。

 マイナンバーカード配布システムをいざ運用しようとなると確実にネットワークを利用します。マイナンバーは個人情報を多く持っているのでこれらの情報が漏洩してしまったら大きな問題に繋がってしまいます。従って構築するにあたりマイナンバーカードに含まれている情報はなるべく閉じたネットワークに置いて管理・運用したいと考えています。またOS・ハードウェア、ネットワーク、アプリケーション、といった各レベルに厳重なセキュリティ対策を施しセキュリティホールをなるべく無くしたいと考えています。ファイヤーウォールやサンドボックスの設置、ウィルス検知ソフトのなども導入し、セキュアなシステムを構築します。

 しかし論理的なセキュリティだけを気をつけるのではなく、物理的なセキュリティにも気を配らなくてはなりません。サーバ室への入室には制限をかけ入退出の管理をします。それに加え、日常的に職員に対してセキュリティのセミナーなどを開き、危機管理能力を高め万が一に備えるようにさせます。そして、万が一個人情報が流出してしまったときのことを考え対応チームを作りどのような対処をするか予め方法をまとめておき問題が起こった時に迅速に行動し対応できるようにします。

 以上のようなことに気を配りマイナンバーカード配布システムの構築・運用を行なっていきたいです。


 以上が選択問題の解答です。添削が残っているやつまたありましたね(笑)

 問題を解くこと自体はとても楽しかったです。特に選択問題8。

 自分は全部の問題に対し感想とまではいかないですが、これを踏まえた上で何が分かって何が分からなかった。だからセキュリティ・キャンプではこんなことを学びたい、みたいなことを書きました。他のプロの方々と比べると知識量が足りず正解をかけていないかもしれませんが熱意やどういったことを学びたいか、などでカバーしたつもりです。

 自分の応募用紙はこんな感じです。知識、技術、経験が足りてないことは重々承知しているのでセキュリティ・キャンプで、はたまたそれ以前それ以降で多くのことを学ぶつもりです。

 来年受ける人の役に立てれば嬉しいです。

 今からセキュリティ・キャンプとても楽しみです!Twitterとか絡んでね。そりでは〜〜^ ^/

PS.

 選択問題1解いた人の答え見てるとすごいですね。全く分かりませんでした。是非教えてください。

 物申したいことがございましたらTwitterの方へ