swampの忘備録

エンジニアが、情報系のイベント行ったときとかプログラミングなどの情報工学について忘備録として書くつもりです。

セキュリティキャンプ2019の応募用紙を晒してみる

こんにちは。テスト週間にも関わらず、久々にブログを書いているswampです。

この度、セキュリティキャンプ2019 バラエティトラックに参加させていただけるになりました!

www.ipa.go.jp


去年と同じくとても応募課題に取り掛かるのがギリギリになってしまい、推敲などしていないので、無理だろうなと思っていました。
そんな中、自分の番号を見たときは、嬉しくて体が震えました。

応募課題自体には、5日前ぐらいから取り掛かり始めましたが、中々上手く進めることができませんでした。
結局、締め切り当日の授業中に3つぐらいの課題をやってしまうという暴挙に出てしまいました。
間に合わないかと思いましたが、なんとか間に合わせることができました。

さて、他の方の応募課題の回答内容を見ていると、僕なんかがなぜ通ったのか分からないですが、自責の念を込めて回答内容を公開しようと思います。

来年以降に応募する方の参考になれば幸いです。

問1

本問題はシナリオベースの問題です。※登場する組織、プロトコルはすべて架空です。

とあるビルの空調メーカーは自社の制御プロトコルは以下の点から安全であると主張しています。

a.空調のプロトコルは独自であり、公開されていないため、攻撃されることはない。
b.万が一、空調がハッキングされても一時的に寒くなったり、熱くなったりするだけで命にかかわるものではない。
c.仮にエアコンが暴走しても、コンセントを抜けば停止することが可能である。

あなたはプロトコルを調査することにしました。
その結果、たしかに独自ではあったが、暗号化も認証も利用していないことがわかりました。

システム構成
[操作用PC] <--- NW(LAN) ---> [空調制御装置] <--- 独自物理線 ---> [エアコン/室外機]
 ↑ここからの送信されたパケットを取得
※NW=ネットワーク

問1(a)

以下のバイト列は2019年4月5日に「操作用PC」でキャプチャした通信内容(L7データ)です。
操作した内容とパケットを見比べて、解析を行い、わかったことを述べてください。
ヒント:IEEE 754、リトルエンディアン、CRCUNIX時間
例)いずれのパケットにも共通する箇所である最初の3バイトはASCIIに直すと「BEG」となっており、「BEGIN」の最初の文字と思われる。
恐らく、パケットの先頭であるということを示していると思われる。

【通信データ】
(1)エアコンの設定温度を28.0度に設定した際のリクエストパケット
42 45 47 08 0A A7 5C 08 00 00 04 00 01 00 00 E0 41 45 4E 44 20 50 A8 F3
(2)エアコンの設定温度を19.5度に設定した際のリクエストパケット
42 45 47 3A 0A A7 5C 08 00 00 04 00 01 00 00 9C 41 45 4E 44 DA 66 22 70
(3)風の強さを5段階の一番強くした際のリクエストパケット
42 45 47 C2 0C A7 5C 05 00 00 04 00 03 05 45 4E 44 06 C7 07 12

回答

1.各パケットの最初の3バイト
例にもある通り、いずれのパケットにも共通する箇所である最初の3バイト「42 45 47」を、ASCIIから文字列に変換すると「BEG」となった。これは「BEGIN」の最初3文字であると考えられる。よって、この「42 45 47」は、パケットの先頭を意味していると考えられる。

2.各パケットの4バイト目から7バイト目
各パケットの4バイト目から7バイトのデータ、すなわちデータ(1)では「08 0A A7 5C」、(2)では「3A 0A A7 5C」、(3)では「C2 0C A7 5C」については、UNIX時間を示していると考えられる。
2.1 UNIX時間と使用目的
UNIX時間とは、コンピュータシステム上で表現される時刻表現の1種である。すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数を示している。[1] このUNIX時間は、何年何月何日何時何分などの単位ごとに時間を表現せずに、32bitの2進数(全て正の整数)で時刻を表現している。もし、単位ごとに区切って表現していたならば、今よりパケットの数が増えるため通信量が多くなるという欠点が考えられる。また、世界中どこでもUNIX時間は、UTCを基準とした1つの正の整数である。日本が19時でロンドンが11時でもUNIX時間で表現すれば1つの数字である。この空調が日本だけでなく海外でも使用するならば、プロトコルの変更を伴わずに利用できると考えられる。もし、単位ごとに区切って表現していたならば、それぞれの時刻は異なるので、日本の時刻にあったプロトコル、イギリスの時刻にあったプロトコルを別途書かなければならず、非効率的である。また、想定していない攻撃が起こってもプログラムの保守範囲も広くなるのでセキュリティ対策が追い付ないと考えられる。よって単位ごとに時刻を表現して送信するよりも適しているため使用されていると考えられる。
2.2 パケット内でのUNIX時間
このパケットは、設問より2019年4月5日に通信されたことが分かっている。それを日本時間と仮定するならば、2019年4月5日0時0分0秒をUNIX時間(16進数)で表すと、「5CA61BF0」である。2019年4月5日23時59分59秒をUNIX時間(16進数)で表すと、「5CA76D6F」である。よって2019年4月5日のUNIX時間は、「5CA61BF0」から「5CA76D6F」の範囲であると考えられる。データ(1)では、「08 0A A7 5C」では、そのまま文頭から読むとUNIX時間は、1974年04月11日21時38分52秒であり、この部分はUNIX時間を示していないように見えるが、これを反対から読むと「5C A7 0A 08」である。これは上述した4月5日のUNIX時間の範囲である。実際にUNIX時間に変換すると、2019年04月05日16時55分52秒となった。データ(2)については、「3A 0A A7 5C」を反対から読んで「5C A7 0A 3A」をUNIX時間に直すと2019年04月05日16時56分42秒となった。データ(3)については、「C2 0C A7 5C」を反対から読んで「5C A7 0C C2」をUNIX時間に直すと、2019年04月05日17時07分30秒となった。
2.3 リトルエンディアン
 2.2節では、パケットを「反対から読む」と表現したが、この表現は正確ではない。データ(1)、(2)、(3)のパケットはリトルエンディアンで書かれているという表現が正しい。リトルエンディアンとは、最下位ビットが属するバイトを低位のアドレスへ格納していくバイト順序(バイトオーダ)の方式である。キャプチャすると、「順序が逆になって出てくる」という特徴がある。[2] 例えば「12345678」(16進数)をリトルエンディアンで表現すると考える。リトルエンディアンで表現するときは、1バイト(8ビット)単位で考えるため、最下位バイトは78となる。よって「78563412」と表現するのが正しい。データ(1)について、本来のUNIX時間を16進数で示すと「5C A7 0A 08」であった。これを今説明したリトルエンディアンで表現すると、「08 0A A7 5C」となり通信データパケットに一致している。よってリトルエンディアンで表現されていたことが確認できる。データ(2)、(3)についても同様である。通常のプログラム作成においては、このようなバイトオーダを気にする必要はないが、今回のようにバイト順序が異なるコンピュータ(プロセッサ)間でデータをやり取りするネットワークプログラムでは非常に重要な考え方である。[3] 具体的には、操作用PCはLANを通してネットワーク通信を行い空調制御装置に接続している。操作用PCと空調制御装置は別のコンピュータでありアーキテクチャも異なる。それらの通信においてはバイト順序を意識しなければならない。

3.各パケットの8バイト目から11バイト目
 この部分の詳細はこのパケットからは断定できない。しかし、何らかの制御情報であると推定される。「08 00 00 04」の場合はエアコンの設定温度の変更を行うことを示し、「05 00 00 04」の場合は風の強さの制御を行うことを示していると考える

4.各パケットの12、13バイト目
 各パケットの12、13バイト目は、どのような操作を行うかを指定していると考えられる。エアコンの設定温度を変更であれば、「00 01」、風の強さの制御であれば「00 03」を示している。

5.設定温度の表現
 データ(1)、データ(2)では28.0℃や19.5℃といった設定温度の表現を行っている。 データ(1)、データ(2)では14バイト目から17バイト目の4バイトがそれにあたる。まずデータ(1)では「00 00 E0 41」である。このパケットもリトルエンディアンで書かれていると予想されるので、実際のデータとしては「41 E0 00 00」であると考えられる。これは、IEEE754という、多くのプロセッサなどのハードウェア、またソフトウェアに実装されている浮動小数点数の計算で最も広く採用されている標準規格で記述されている。[4] 10進数の28.0をIEEE754の単精度浮動小数点形式というコンピュータ内部での小数点の表現形式で表した結果を16進で示すと、「41 E0 00 00」になりパット内のデータと一致していることが分かる。データ(2)でも同様に19.5をIEEE754の単精度浮動小数点形式で表した結果は、「41 9C 00 00」であり、これは、「41 9C 00 00」をリトルエンディアンで表現した、データ(2)のパケット「00 00 9C 41」と一致している。よって、設定温度は、パケットの14バイト目から17バイト目にIEEE754の単精度浮動小数点形式のリトルエンディアンで記述されていることが分かる。

6. 風の強さの表現
 データ(3)の14バイト目では、風の強さが5段階で一番強い、すなわち「5」という状態を「05」で示していると考えられる。

7.END命令
 いずれのパケットにも共通する箇所である「45 4E 44」(データ(1)、(2)では、18バイト目から20バイト目、データ(3)では15バイト目から17バイト目)を、ASCIIから文字列に変換すると「END」となった。よって、この「45 4E 44」は、パケットの命令の終了を意味していると考えられる。

8.各パケットの最後の4バイト
 最後の4バイトは、ヒントにある通りであれば、CRC符号なのだろうが、どのような使い方をされているのか特定できなかった。

参考文献
[1] 「UNIX時間」『フリー百科事典 ウィキペディア日本語版』(最終閲覧日:2019年5月22日) https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93
[2] 「バイトオーダ - ビッグエンディアン/リトルエディアン」『ERTL組込みリアルタイムシステム研究室』2003年11月20日更新(最終閲覧日:2019年5月23日)http://www.ertl.jp/~takayuki/readings/info/no05.html
[3] 大滝みや子、岡島裕史『平成28年度[春期][秋季]応用情報技術者合格教本』株式会社技術評論社,2016年,p.134
[4] 「IEEE 754」『フリー百科事典 ウィキペディア日本語版』(最終閲覧日:2019年5月27日)https://ja.wikipedia.org/wiki/IEEE_754

問1(b)

問a.の回答をもとにエアコンの設定温度を30.0度に設定するためのパケットを生成してください。
答えが導き出せなかった場合はわからなかったことを記入してください。

回答

2019年5月27日の11時40分0秒に「操作用PC」でキャプチャした通信内容(L7データ)のパケットであると仮定する。パケットは問aの解析結果から、以下のように生成できると考えられる。

42 45 47 00 4E EB 5C 08 00 00 04 00 01 00 00 F0 41 45 4E 44 ?? ?? ?? ??

BEGIN UNIX時間 制御コード 温度(IEEE754単精度表示) END CRC符号 の順で記載している。
??の部分は、CRC符号の部分であると考えられるが、与えられたパケットからどのようにCRC符号を生成しているのか分からなかったため、書くことができなかった。

問1(c)

とある空調メーカーの主張で誤りと感じた部分を指摘してください。

回答

1. 独自の空調プロトコル
「a.空調のプロトコルは独自であり、公開されていないため、攻撃されることはない」と主張しているが、根本的に間違っている。まず空調のプロトコルが独自であることは必ずしも安全ではない。確かにプロトコルが独自であれば、外部から見れば、それがどのように動いているか分からない。それはどこを攻撃すればよいのかを不明にしているという見方もできるかもしれない。しかし、一つ脆弱性が見つかれば、その脆弱性からシステムを攻撃できる。プロトコルが独自であるということは、それを作った人、会社しか修正するのはできないということだ。ということはその脆弱性を修正できる人数は少ないので、脆弱性により大きな攻撃が起こったときは修正に時間がかかり、脆弱性の影響が大きな範囲に広がる可能性があるまた、動きがブラックボックス化しているということは、修正も非常に困難になる。もしも、その独自プロトコルを作った人が会社を辞めていたり、仕様書を紛失していたりすれば、そのプロトコルアーキテクチャが不明になり、ソースコードのみから脆弱性を探すことになり、時間がかかるし、どこが原因か分からなくなるということになるかもしれない。よって独自プロトコルを使用することは危険であると考えられる。次に、公開されていないから攻撃されることはないというのも間違いである。公開されていなくても暗号化されていないので設問1で解析を行えたように、パケットの中身からアーキテクチャを予想することもできる。よってそれを利用して攻撃することは容易に可能であるといえる。また、公開されていなければ、それを修正できる人も少ないということであり、脆弱性の影響範囲を広げることになる。「独自のプロトコルで公開しない」のではなく、「ある程度安全が保障され標準化されているプロトコルで公開されているもの」を使うべきだと考える。

2. 空調がハッキングされた場合
「b.万が一空調がハッキングされても一時的に寒くなったり暑くなったりするだけで、命に係わるものではない」とあるが、これも間違っている。例えば、夏に高温で暖房をつけるようなハッキングをした場合、熱中症で室内の人が倒れるかもしれない。特に高齢者であれば温度変化に気づかないこともある。また、あまりにも高温の温度を指定した場合、火事になる危険性もある。また、ヒートショック死の危険もあると考えられる。意図的に温度を急激に上げたり、さげたりをすれば、温度変化が大きくなり、体に負担を与え、死に至ることがある。

問1(d)

同システムがハッキング可能であった場合、考えうる最悪のシナリオを書いてください。
例)ビル全体の冷房をガンガン入れて、電気代を高額にする。

回答

 想定している最悪のシナリオは、問cでも述べた通り、人が死亡することではあるが、既に述べたので、ここでは他のシナリオ(2番目に最悪なシナリオ)について解説する。
 ハッキングが可能になれば、エアコンを自由自在に操作することができる。もしも、この空調に人の動きを感知して空調を変えるといったようなシステムがついていたならば、このシステムをハッキングすることによって様々なシナリオを想定できる。
まず電気会社が悪用できる。人の気配を感知することができるので、部屋に人がいない時に、空調を意図的に動かし、莫大な電気代に儲けることができる。部屋に人がいないときを狙うので、誰にも気づかれない。空調がついていたならば、部屋に入ってきたら気づくだろうと思うかもしれない。しかし例えば夜間なら人がいなくなる時間、そして早朝人が来る時間は分かっているのでその間に外気温などを考慮して温度を調節すれば気づかれることはないはずだ。また、毎日ではなく数か月に1回などにしておけば、誰かが空調を切り忘れたとしか思わないだろう。
また空調メーカーも悪用できる。意図的に空調を動かし続ければ、それだけ空調の寿命が短くなるということになる。例えば通常の使い方をすれば、10年以上壊れることがないのに、5年で壊れるように、気づかれずに空調を動かすことも可能であると考える。そうすれば空調メーカーに対して新たな注文、修理依頼が発生し、儲けることができる。本当は、10年以上壊れることはないのに、そのような攻撃をすることを前提にして発売し、カタログにも5年程度で壊れると記載すれば、誰も気づくことはない。そして、それは、空調を意図的に壊す攻撃が見つかった時にも悪用し、稼ぐことができるだろう。

問2

いままで作ったもの(ソフトウェア、装置、システム、組織、など何でも)で自慢したいものがあれば教えてください.その中で、何かあなたのプログラミングのスキルを推し量るエピソードがあれば書いてください.

回答

① ポモドーロタイマーの作成
JavaFXでのGUIプログラミングを授業で学び、自由製作課題でポモドーロタイマーを作成した。今までCUIでしかプログラムを作った経験がなかったが、実際に自分がコンピュータで使われているボタンなどの機能を作成することはとても興奮することであった。コードなどは、GitHubに公開している。(https://github.com/KeisukeSawa/PomodoroTimer) 他の人は、ゲームなどを作っている人が多かったが、私は、実用的に役立つものを作りたいという強い思いで、PCで動作するポモドーロタイマーを作成した。タイマー動作中に画面を真っ黒にして、PCの動作を困難にするといった機能を盛り込んでいる。これは、私自身が勉強中にPCが目の前にあるとついPCを触ってしまうことがあったからだ。自分の不便だということを解決できたソフトウェアの一例だと思う。今後は、自分の利便性だけでなく他の人の利便性も考えて改良を重ねていきたい。自分でコードを組んでソフトウェアを作ることはとても楽しくも難しいことだった。この経験を苦労したことや、やっておけばよかったこと(Githubの活用、分からないことの調べ方など)は現在も生かすことができている。また、これからもこの知識を生かして社会の役に立つものをこれからも作っていきたいと思っている。

② Wiiリモコンを利用したシューティングゲーム
 弊学校の学園祭において、来場した人に楽しんで帰ってもらえるように企画している「メイン企画」において、Wiiリモコンを用いたシューティングゲームの開発を行った。内容は、トロッコに乗り込み、進んでいくような画面を作成し、その中で、Wiiリモコンを操作し、AボタンやBボタンを押すことによって、向かってくる敵を攻撃し、最後にボスであるドラゴンと対決するという内容だ。
 3人で開発を行い、私は、ゲームプレイ中に風を起こす扇風機とUnityとの連携や、WiiリモコンとUnityの連携、得点計算など広範囲のプログラムを1人で担当した。大規模なゲームの開発は初めてだったが、ゲームのコア部分を担当させていただき、ゲームの完成に大きく貢献でき、とてもうれしかった。
 技術的には、Unity、BlenderArduinoなどを用いました。お客さんから見えるUI部分には、Unityを使用し、キャラクターなどには、Blenderを利用した。Unityでは、C#を使用してプログラムを記述した。扇風機との連携には、Arduinoを利用した。UnityとArduinoを連携させ、ゲームがスタートしたら、扇風機を作動させ、敵に当たってしまったら扇風機を止めるというプログラムを書き、扇風機の制御を行った。複数台のWiiリモコンとUnityを連携させることが非常に難しかったが、UnityWiimoteというライブラリを利用し、解決した。
UnityWiimoteは、もともとWiiリモコン1台を想定したライブラリだったが、プログラムを参考に、Wiiリモコン制御部分を解析し、該当部分の変数名を変えて複製することで、複数台制御にも対応できるようにした。詳しくは、次のページに記載している。URL:http://swamptk.hatenablog.com/entry/2018/01/21/192414 
 また、学園祭で、子供を含む不特定多数の人がプレーすることをふまえ、プログラムからも安全対策を行った。プレイヤー全員が準備をして、全員同時にAボタンを押したら、スタートするという仕組みを採用したが、それでは、まだ安全にゲームがスタートできる状態でないのにプレイヤーが誤ってAボタンを押してしまい結果的に思わぬ事故につながってしまう可能性があった。対策として、管理者用リモコンを用意した。係員がプレーをスタートできる状態かどうかを確認したうえで、プレイヤーと係員双方がAボタンを同時に押すことでゲームがスタートするというプログラムを書いた。私は、このような安全対策もアトラクションゲームに必要不可欠と考えており、一種の「セキュリティ」だと考える。細かなところだとは思うが、これからも「安全」や「セキュリティ」に気を付けてソフトウェアを作成したいと考えている。

③ FullerとFirebaseを利用した定期テスト範囲共有アプリ
 某社のインターンシップで、FlutterというiosとAndoroidアプリが1つのコードで開発できるクロスプラットフォーム開発ツールと、リアルタイムデータベースやユーザ認証などが簡単に行えるモバイル開発のためのプラットフォームであるFirebaseを用いて定期テストの範囲を簡単に共有できるアプリの作成を行った。コードなどは以下のGithubに公開している。https://github.com/KeisukeSawa/test-write このインターンシップでは、会社からやることを指定されるのではなく自分が好きなアプリを作ってもよいということだったので今まで作りたかったアプリを作成することにした。このアプリを作ろうと思ったきっかけは、私がクラスの後ろの黒板に3時間ぐらいかけて、テストの範囲を書いていたからだ。それは、手間がかかりどうにかしたいと考えていた。そこで、Webページでのテストの範囲の共有をしたが、これでは作成者である私しか編集ができず、間違いがあったときなどに不便だった。そこで、皆で共有してテストに関する情報の書き込みや編集ができるアプリを作成しようと考えた。機能としては、チャット形式で試験範囲や科目の情報を共有できるようする機能を付けた。誰でもチャットに投稿、編集が可能にしている。そして、全ての科目、試験に対応可能とした。FlutterやFirebaseは、まだ発展途上の技術で日本語情報が少ないため、英語で情報収集することや今まで書いたことがないDartという言語に苦労したが、今までの経験を活かし、インターンシップの4日間という非常に短い期間でアプリの大方の機能を完成させることができた。

④ ARアプリの作成
 弊学校の学園祭において、来場した人に楽しんで帰ってもらえるように企画している「メイン企画」において、用意されている画像にタブレット端末をかざすとコンテンツが浮き出るようなARアプリを作成した。技術的にはUnityとVuforiaというライブラリを使用して作成した。マーカーによって出てくるキャラクターやその動作が変わるというような動作をするようにプログラムを行った。制作期間は1週間という短い期間でかつ、ARアプリの作成経験は一切なかったが、これまでの経験を活かし実現することができた。

問4

今後、人工知能はセキュリティ分野でどのような役割を担うか?あなたの予想と共に、そのメリットとデメリットを記述してください。

回答

今日、PC、スマートフォンタブレットなどの情報端末以外にも、身近な家電などもインターネットに接続されるようになってきた。いわゆるIoTが様々なところで活用されつつある。すなわち、これはありとあらゆる場所でサーバー犯罪が起こる可能性があるということを意味している。これからも「守らなければいけない対象」は増え続ける。よって、人間には限界があると考えられる。今後、人工知能がセキュリティ分野で大きな役割を果たしていくことになると考えられる。

1.人工知能とは
 人工知能とは、様々な定義の仕方があるが、ここでは、「言語の理解や推論、問題解決などの知的行動を人間に代わってコンピュータに行わせる技術である。[1]」という定義を用いることにする。この定義に基づけば、人間の知的な行動を人間に代わって行うことが人工知能の役割になっている。では、人工知能が得意な不得意なことはどのようなことなのだろうか。この定義にある「推論」とは、「知識をもとに,新しい結論を得ること」である。[2] 人工知能は、多くのデータを収集し、それを学習させ、推論することで結論を導いている。この多くのデータを「学習」させること、すなわち人工知能をよりよく使えるものにするためには、多くのデータが必要であるということである。大量のデータから答えを導き出せるものであれば、人工知能が大いに活躍できるはずであり、人工知能の得意な部分である。物事を解析すること、すでにあったことを検知することなどは得意であろう。しかし、逆を言えば人工知能に十分なデータを与えられないことや人工知能が新たな創造をすることは苦手であるといえる。人工知能にはまだ「0から1を生み出す」ことができていないのである。

2.人工知能のセキュリティ分野での役割
 人工知能は1章で述べた通り、大量のデータから答えを導きだせるものであれば、非常に有用な働きをすると考えられる。メールなどによる標的型攻撃、ランサムウェアによる攻撃など現在行われている多くのサイバー攻撃は既知のものが多いため、そのデータを人工知能に学習させることで、人工知能が、「攻撃されている」といったことを自ら「認識」することができる。攻撃を認識した後も、その攻撃に対する適切な対策も学習させておくことで、その攻撃に対し、人工知能が適切な「防御」を行うことができると考える。例えば、標的型攻撃に対して、添付ファイルを検査しウイルスと断定できたなら人工知能がそのメールを破棄し、それが送られたメールアドレスをブロック、IPAなど適切な機関に報告するという一連の対策を自動的に行うことができる。万一、標的型メールを開いてしまった場合でも、人工知能がいち早くそれを認識し、そのコンピュータをネットワークから遮断することもできると考える。このように幅広い範囲でサイバー攻撃に対する「認識」と「防御」を行うことが今後のセキュリティ分野での人工知能の役割の1つになるのではないかと考える。

3.人工知能がセキュリティ分野に及ぼすメリット
 人工知能がセキュリティ分野に及ぼすメリットの1つは、人工知能同士がつながりリアルタイムで連携できるようになるところである。1節で人工知能は、データが与えられていないようなもの、すなわち未知の攻撃には対処しきれないということを記述した。しかし、コンピュータに対して異常をきたす未知の現象を人工知能が検知すれば、それはサイバー攻撃として認知される。現在新たに認知された攻撃をアンチウイルスソフトなどに適用させようとするとセキュリティパッチが必要であり、ある程度の時間がかかる。しかし、人工知能が新たな攻撃を認知すれば、その情報を瞬時にインターネットを通して他の人工知能にも学習させることができる。すなわち常に最新のセキュリティ情報を人工知能は得ることができるのだ。このように人工知能がインターネット上でつながることで、リアルタイムで連携することができるので、でサイバー攻撃に対する被害を最小限にすることができる社会になると考えられる。
 また、そのコンピュータやネットワークがどのような目的(例えば個人での利用目的なのか、会社など組織でのビジネス目的なのか)によって起こり得る脅威も別のものになる。人工知能が利用目的を認識すれば、その利用目的に応じた適切な「対策」を自動的に行えるというメリットがある。現状、セキュリティ人材を確保しておらず、攻撃にも適切に対処しきていない個人所有のコンピュータやネットワーク、ITを専門としない企業(特に人が少なく情報を司る部門がない中小企業など)などで人工知能を導入すれば「認識」「防御」「対策」を全て自動で行えるため、サイバー攻撃に対するセキュリティ対策として有用なものになると考えられる。セキュリティ人材の不足にも人工知能が対応できるというメリットがあるのだ。だだし、次章で述べる通り、100%人工知能を信頼しすぎてはならない。

3.人工知能がセキュリティ分野に及ぼすデメリットと対策
 人工知能をセキュリティ分野で活用するデメリットの1つとして、サイバー攻撃から守るはずの人工知能に対して攻撃が行われる可能性があるという点があげられる。人工知能を現在発覚している手法で攻撃しようとしても、解析が得意である人工知能システムは、「攻撃されている」ことを自ら解析し自ら防御できると考えられる。しかし、人工知能に対する「入力と出力」から人工知能脆弱性を発見される可能性もある。具体的な例を挙げると、まず、人工知能が意図しないであろうデータを「入力」する。意図しないであろうデータとは、例えば、音声データの数箇所の周波数を意図的に高くしたり低くしたりしたデータ、乱雑な文字列にしたデータなどがあげられる。そして、そのデータに対して、人工知能が解析を行った情報を「出力」させることで、その人工知能システムの脆弱性を知ることができる可能性がある。もし、乱雑な文字列の入力でエラーが出たのなら、乱雑なデータを与え続けることでシステムを攻撃することができるということが容易に想像できる。つまり、「入力と出力」によって人工知能の弱点を探し、見つかった弱点を中心に攻撃していくことで人工知能システムへの攻撃ができるのである。
 このデメリットを克服するためには、「人間」の役割が重要なものになると考える。具体的には、具体的には、人工知能の「入力と出力」を定期的に調べるという新たな仕事を作ればよいと考える。その人工知能にどのような「入力」がされてどのように「出力」したのかをログでチェックしたり、テストデータを使って分析することで、未然に人工知能の弱点を発見することができ修正をすることができる。そしてそのデータを蓄積し、新たに人工知能に対し学習させることで新たな攻撃の形の発見にもつながると考えられる。

4.まとめ
 今後、セキュリティ分野で、人工知能は、幅広い範囲でサイバー攻撃に対する「認識」と「防御」そして、その「対策」を行っていくという役割を果たすと考えられる。そして、その人工知能はますます発展を続けていくと思われます。しかし、人工知能を信頼しきって人間が何もしなくなってしまったら人工知能がいざ攻撃されたときに適切な対応ができません。定期的に「人間」がチェックすることがセキュリティを維持することの最も大切なことだと考える。

参考文献
[1] 「人工知能」『ASCII.jpデジタル用語辞典』(最終閲覧日:2019年5月26日)
http://yougo.ascii.jp/caltar/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD
[2] 人工知能学会「人工知能って何?」『What’s AI』(最終閲覧日:2019年5月26日)https://www.ai-gakkai.or.jp/whatsai/

問7

ある個人が自分だけで使用しているPC(OSは適当に決めてください)に保存されている情報、例えば特定の文書ファイルやデータなどにしか記録されていないはずの情報が、インターネット上の掲示板に1ヶ月前から掲載されていることを知りました。この情報がどうやって漏洩したか、PCの状態、さまざまなログやファイル、ルータの通信記録などから推察する手順をできるだけ多くの条件を想定して示してください。

回答

ある個人が自分だけで使用しているPCのOSをWindows10として話を進める。
① Windows10では、MicrosoftアカウントでOne driveというクラウドサービスを自動的に導入している場合がある。すると、自分のエクスプローラーの中の「ドキュメント」や「ピクチャ」といったフォルダに漏洩した特定のファイルやデータがあった場合、自分が意識していないうちにOne driveに共有されていてそのOne driveにアクセスするためのMicrosoftアカウントが盗まれて漏洩した可能性が高い。
② netstatなどを用いてsshTCP/IPのポートが空いていないかを調べる。もし、どこかのポートが開放されていたら、そのポートからコンピュータに侵入された可能性がある。
③ アンチウイルスソフトなどでスキャンし、ウィルスが無いかを調べる。ウィルスがあった場合はそのウィルスが原因である可能性が高いので、それがどんなウィルスなのかを調べる。そして、ウィルスの入手経路を調べる。インターネットの通信履歴で、いつ、どんな経路で入手したのか調べる。また、標的型メール攻撃である可能性もあるので、不審なメールがなかったかを調べる。
④ そのコンピュータが接続しているルータのログを調査する。そのログの中で1か月前からのログを見て、漏洩したファイル名やそのパス、そのファイルの内容などでフィルタリングを行い、いつ漏洩したかやどこのIPアドレスに対して漏洩したのかを特定できる。
⑤ そのコンピュータを公衆Wi-Fiに接続していた経験がある場合はそこで漏洩した可能性が高い。一般的に公衆Wi-Fiは暗号化されておらず、コンピュータの設定によっては公衆Wi-Fiに接続されているコンピュータに表示されることもある。その情報をもとに攻撃された可能性がある

問8

CTFでこういう問題を作ってみたい、というのをなるべく具体的に挙げてください。

回答

仮想記憶に応用できる手法である「Copy on Write」を使った問題を作ってみたい。「Copy on Write」とは、簡単に言えば、アドレス空間のコピーを必要になるまで遅らせる技術である。あるプロセスを実行する際は、物理アドレス空間にマッピングされるが、それが同じプログラムであれば、同じ領域はコピーしても意味がない。しかし、プログラムの内容は同じでも、スタックやヒープの値は異なる場合がある。その際、プログラムのデータは二次記憶装置に1つしかマッピングしてなくてもよいが、スタックやヒープは異なる場合があるので、物理アドレス空間に複数マッピングしなければならない。しかし、今ある2つの同じ内容のプロセスが2つとも動くことは保証できないし、実行のためにforkシステムコールなどで子プロセスを作ってもexeveシステムコールで新しいプログラムを実行してしまいコピーしたアドレス空間の意味がなくなる。よって、それを防止するために同じプログラムのスタックやヒープ領域に書き込みが起こったらはじめて物理アドレス空間をコピーする仕組みを作る。よって、不必要なCopy on Writeを繰り返すことで、物理メモリを参照していき、その中からフラグを回収していくという問題を作ってみたいと考える。



総文字数としては、13000字ぐらいでした。
個人的には、問7や問8はもう少し推敲して詳しく書きたかったと思っています。
今回は、プログラムを一切書かずにパケットの解析もWebに転がっているツールを使ってやってしまいました。
他の方が行っているようにもう少しプログラム書いて解析したかったなと思います。

僕のように、そんなにプログラム書いていなくても、選考を通過することができました。
技術力よりも、筋道がたった論述がされているかであったり、技術に対する熱意などが見られているのかなあと感じました。
(ただし、僕にそれがあるのかは分かりませんが)

何はともかく、参加させていただけると決まったので、この機会を十分生かせるように精進していきたいです。