# Zトラック テーマ一覧
- Z3. 新屋・藤浪ゼミ「ReDoSの検出プログラムの作成とOSSへの適用」
- Z4. 城倉ゼミ「独自セキュリティ機構を追加可能なモジューラブルなソフトウェアルータの開発」
- Z5. 忠鉢ゼミ「Rustで作るLinux向けアンチウィルスソフトウェア」
- Z6. 押場・中川ゼミ「CPUレベルでの脆弱性防御機構の自作」
`※Z1, Z2は今年度未実施のため欠番`
# Zトラック応募について
- Zトラックの中であれば、複数のゼミに応募しても構いません。その場合、応募したいゼミすべての応募課題を提出してください。複数のゼミに応募する際は、ゼミの優先志望順位を書いてください。
- 他のトラック(A, B, C, D, L, X, Y)との併願はできません。
----
# Z3.「ReDoS検出プログラムの作成とOSSへの適用」応募課題
正規表現とlinterに関する次の大問1・大問2についてそれぞれ答えなさい.
## 大問1(正規表現)
小問(a)
正規表現 /^b*(ab*ab*)*$/ にマッチする文字列を3つ挙げなさい.また、この正規表現にマッチする文字列はどのような文字列か説明しなさい.
なお Python では
> import re
> r = re.compile(“^b*(ab*ab*)*$”)
とすることで正規表現/^b*(ab*ab*)*$/に対応する正規表現オブジェクトrが生成でき、
> r.match(“aaabbbabba”)
とすることで文字列”aaabbbabba”がrにマッチするかどうか判定できます.
### 小問(b)
正規表現 /^(a?){50}a{50}$/ にマッチする文字列はどのような文字列か説明しなさい.
### 小問(c)
Python (3.7.7)で
```
> import re
> r = re.compile(“^(a?){50}a{50}$”)
> r.match(“a”*100)
とすると即座に正規表現マッチングが終了しますが
> r.match(“a”*50)
```
とすると延々と正規表現マッチングが終了しません.
実際にPythonで上記現象を確かめてみて、なぜそのようなことが起こるのか厳密でなくて良いので説明してください.
(ヒント:https://swtch.com/~rsc/regexp/regexp1.html)
## 大問2(linter)
### 小問(a)
次のHTMLは、クエリ文字列として渡された2つの数値を足した結果を表示するものです。
例えば ?a=1&b=2 というクエリ文字列をつけて、このHTMLをブラウザで開くと 3 と表示されます。
————————————
```
```
しかし、このHTMLに含まれるスクリプトには脆弱性があり、セキュリティ上の問題を引き起こす可能性があります。
スクリプトのどの部分が問題なのか、理由も含めて答えてください。
( ヒント: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval )
### 小問(b)
前の問のような脆弱性が生じたのは、とある関数を使用しているためです。
また、この関数が実際のプログラムで必要になることはほとんど無いため、この関数が使用されているスクリプトには、潜在的にセキュリティ上の問題があると考えられます。
よって「この関数が呼び出されている」ということを静的に(プログラムを実行することなく)検出できれば有用なはずです。
どのようにすればこれを実現できるか、を考えて答えてください。
----
# Z4. 城倉ゼミ「独自セキュリティ機構を追加可能なモジューラブルなソフトウェアルータの開発」応募課題
## 原文、画像、添付ファイルなどは[こちら](https://gist.github.com/slankdev/a47dccbc9eda0e5d37c1cb95bc4f6200)
以下の問題は**完答することが通過条件ではありません**.いかに応募者のみなさんが
技術に興味があるか, 手を動かしているか. (もしくは手を動かしてくれそうか)を
判断する基準で見させていただきます. また演習課題は難易度を高く設定しているため
**基本的に完答できないくらい**を目安に作問しています. みなさんがどれだけ
この問題に挑戦し, 熱意を持って手を動かしてくれるかを測っています.
以下から自由に課題を選択して答えてください.全てをまんべんなく解いてもよく,
もちろん一つだけをものすごく深掘りして取り組むのでも構いません.
しかし基本的に調査課題は取り組んでいただきたいです.
## Z4.1.調査課題: ネットワークやパケットに関するプログラミングの経験や動機
ネットワークや, パケットに関するプログラミングの経験がある場合(入門中も可),
どのようなものを作ったのか(作っているか, 作りたいか) 説明してください.
また, 本ゼミのテーマである「モジューラブルなソフトウェアルータの開発」
に関わる作りたいソフトウェアやそれに対するロマン,必要性等を説明してください.
## Z4.2.調査課題: ルーティングプロトコルとSDN
インターネット上ではたくさんの計算インスタンスがネットワークに接続しています.
ここでの計算インスタンスとはVMや物理サーバ, コンテナ等を示します.
これらはIPを利用して相互に接続されていますが, 特定のインスタンスに対する経路
を全て静的に設定するのではなく, いくつかの動的ルーティングプロトコルやSDN
コントローラを利用して経路設定をソフトウェアによって行なっています.
ルーティングプロトコルやSDNコントローラについて調べてあなたの知識を説明
してください. どのようなルーティングプロトコルやSDNコントローラがあるのか.
それぞれどのような特徴があるのか, メリット/デメリット等の考察があるとさらに
良いと思います.
## Z4.3. 調査課題: パケット転送技術 (DPDK/XDP/etc...)
講義概要にも記述されている通り, Linux等でパケット転送を行うには
いくつか手段があります. DPDKやXDP等を利用するケースや, AP-PACKET等を
利用するケースなど様々ですが, それらにどのような違いがあるかを説明してください.
性能や機能等の何かに集中して, 利点欠点等を考察できていると良いです.
またもしどれか一つでも使ったことがあればその所感や難しさがあれば
説明してください.
## Z.4.4. 調査課題: 希望調査
本ゼミを受講するにあたり, 特に興味ある分野等があれば記述してください.
ざっくばらんにあなたの興味範囲とかを書いてもらえるとありがたいです!
選考を通過したあとには, 具体的に何をやっていくかを再度議論するので
その時の材料になります. 以下に簡単な例を示します.
- この技術で高い能力を身に付けたい. とか
- この技術を講師(城倉/slankdev)にみっちり教えて欲しい. とか
ちなみに僕はパケット転送プログラミング. ネットワーク仮想化.
BGP等のルーティングプロトコルの実装, SRv6等の新しいフォワーディング方式等が
特に好きで仕事でも取り扱っています.
## Z.4.5. 演習課題: Virtual Network Playground
LinuxにはNetwork Namespace (netns)というネットワークスタックを仮想的に
複数生成する機能があります.コンテナ型の仮想化技術の多くはそれぞれの
コンテナに対して一つのnetnsを作成し, それらをVethで接続してコンテナを
外部ネットワークに接続させています.
ここでは三つのnetnsを作成し, 添付の図のように接続して ns1からns3に対して通信を
行うような仮想ネットワークを構築し, その方法を説明してください.
利用するアドレス対に関しては図中のものを利用してください.
{図:別添ファイル`vnet_topology.png`}
環境構築に利用するOSはLinuxであればおそらくなんでも構いませんが,
Network Namespaceの機能に制限がかかっている可能性があるため,
Ubuntu18.04か,Centos 7を推奨とします.
もし余裕があればSRv6やTC等を利用して, 独自のパケット制御をするような環境を
構築し, その方法を説明してください. SRv6を利用する場合はkernel 4.18以上を
利用することが推奨です.
## Z4.6. 演習課題: パケット解析プログラミング
添付の `icmp_data.pcap` というpcapファイルにはある画像が隠されています.
これらのパケットには, 基本的なICMPのパケットが記録されているように見えますが,
実はICMPヘッダの後ろのデータ部分を全て繋げるとある画像が復元できます.
実際にコードを書いてその画像を復元してください.
プログラムの実装は原則どの言語を利用しても構いませんが,
C/C++, Golang, Rust等のシステムソフトウェア開発に利用される言語がおすすめです.
画像ファイルを復元することがタスク的にはゴールですが, 以下のような
マイルストーンがあると思います.
1. pcapをwireshark等のprotocol analyzerで開いてデータを確認する.
2. pcapから一つ一つのパケットを好きなプログラミング言語で読み取る.
3. パケットのヘッダを解析し, どのような通信かをプログラムで解析する.
4. ICMPパケットのデータ部分をそれぞれ連結し, 画像を復元する.
もし余裕があれば,特定の「フレームワークを利用することを禁止する」等の
特別ルールを加えてこの課題を突破してみてください.
例えば「libpcapは使ってはいけない」等です.
(Special Thanks, 策問者: Takaaki Hoyo)
----
# Z5. 「Rustで作るLinux向けアンチウィルスソフトウェア」
課題1,2は必須です。課題3は設計ドキュメントだけ、実装が途中 でもOKです。
なお、募集期限のうちは、ソースコードを公開リポジトリに置かないようにしてください。
## 課題1
- [ClamAVのclamonaccのソースコード](https://github.com/Cisco-Talos/clamav-devel/tree/dev/0.103/clamonacc)を読んで、その機能、必要性を説明してください。またfanotifyがない古いカーネルでは、カーネルモジュール(clamuko)が必要でしたが、必要だった理由を考察してください。
## 課題2
- Rustとyaraのbindingsを使い、UPXを検知するスキャナプログラムを作成してください。
- 引数でスキャン対象のファイルとyaraのルールファイルを指定して実行するようなものを作成してください。
- 加えて、ディレクトリをスキャンできるようにし、/usrをスキャンして計算時間を計測してください。
## 課題3
- 課題2のスキャナを拡張し、アンチウィルスサービス(デーモン化)をRustで実装してください。
- 並列スキャンができるように設計してください。
- アンチウィルスサービスのIFは自由です。
- スキャン処理だけでリソースが枯渇しないような処理の制限を設定できるようにしてください。
----
# Z6.「CPUレベルでの脆弱性防御機構の自作」課題
## Z6. 共通課題
- ご自身でスクラッチで開発し、他人にアピールできるプログラムを1つ取り上げ、そのソースコードを提出してください(提出はGitHubなどのgitホスティングサービスにアップロードし、そのURLを掲載するなどしてください。開発言語は特に問いません。)。また、そのプログラムの動作の説明・実装に際して工夫した点・これから改善していきたい点について記述してください。
- 以下の質問に答えてください。(注: 説明に際してはコードの具体例を示すなど、ご自身で理解していることが相手に伝わる詳細な記述をしてください。)
- スタックベースのバッファオーバーフロー脆弱性のあるプログラムに対し、脆弱性をつき任意コード実行させるまでの過程を説明してください。
- メモリ破壊系の脆弱性攻撃への緩和策として、現代のOS・コンパイラが備える対策を1つ挙げ、それについて説明してください。説明に際しては、その緩和策によりなぜ攻撃が困難になるのかを記述するようにしてください。
- メモリ破壊系の脆弱性攻撃への緩和策として、現代のOS・コンパイラが備える対策を1つ挙げ、それをバイパスし攻撃の実行を可能とする手法について、その詳細を記述してください。
- 以下に示すC言語のソースコードをコンパイルし作成した実行ファイルについて考えます(環境として Ubuntu 18.04 (amd64)、コンパイラはgccで、コンパイルオプションは-O1)。main関数でfunc関数を呼び出し、呼び出し元に返ってくるまでの過程をアセンブリ言語のレベルでできる限り詳しく説明してください。
```c
#include
#include
__attribute__((noinline))
double func(int* a, double b, int c, int* d) {
double ret;
ret = *a + b + c + d[0];
return ret;
}
int main() {
int a, c;
double b;
int* d;
a = 3;
c = 2;
b = 20.0;
d = (int*) malloc(100 * sizeof(int));
d[0] = 5;
double e = func(&a, b, c, d); // <- ここで func 関数を call し処理を実行し戻ってくるまでの過程を説明すること
printf("%f\n", e);
free(d);
return 0;
}
```
## Z6. 選択課題
- 今回キャンプの課題として、以下の2つの条件を満たしたCPUのソフトウェアエミュレーターを作成していただきます。
1. ベアメタルアプリケーションの実行が可能
2. ISAとしてRISC-Vを採用
このエミュレーターを作成するにあたってのあなたの実装の方針について説明してください。
- CPUレベルでメモリ破壊系の脆弱性攻撃から防御するための機構について、あなたのアイデアを説明してください。アイデアについて説明する際には、攻撃として何を想定するのか、どのようなロジックによりなぜその攻撃から防御出来るのかについても合わせて記述してください。(注: 学術論文を参考にしても構いませんが、参考にした場合は必ず出典を明記するようにしてください。)