目的

今回のZ2は「Rust製Linux向けアンチウィルス実装ゼミ」でした。

アンチウィルスの実装をゴールとして、いくつかのアイデアから選択して実装してもらう。という物です。

開発ゼミなので講義形式のものではなく、実装する中で注意すべき点や「どこに気をつけて実装すべきか」「アンチウィルスとして何を優先すべきか」などのアドバイスを行いました。

また、Rustプログラミング全般についてのアドバイスも常に行っていました。

講師2人に受講生2人、さらにチューター1人という体制だったので、実質マンツーマン.5でした。いいペアプロ。

アイデアとして

等、いくつか事前に提示した結果、二人ともsandboxの実装を選択してくれました。自分もちょうどやりたいと思っていたアイデアなので嬉しかったです。

が、今回は受講生ではなく講師というポジションなので、あくまで実装するのは受講生。ということを忘れずに挑みました。

準備

事前に使えそうなライブラリやKernelの機構を探します。

Sandboxの基本となる隔離を行う技術はコンテナはVMなどの仮想化技術が既にあり、枯れているので自分で実装する必要はなく、むしろその中で実行したプロセスのイベントを取得する方法を考えていました。

まぁそういう事やるなら今時eBPFを使わない手は無いでしょう。

SysmonのLinux版があったのでこれを使ってみる事にしました。

開催

lxcを使ってVMを建てて、その中でSysmonForLinuxを使ってログを取得する方針で実装を行いました。

自分が実装したマルウェアっぽい挙動をするプログラムをsandbox内で実行してもらい、そこから取得したログを元に振る舞い検知を行えるところまで実装は進みました。すごい。

問題

一通り実装した後で問題が発生しました。

sandboxの中で実行したプロセスのログはちゃんと取得できていたものの、SysmonForLinuxの提供しているデータだと微妙に目的の要件を満たしていないのです。

悲しい(?)事にSysmonForLinuxはWindows版のSysmonに合わせたフォーマットになっており、XMLがめちゃくちゃパースしづらい上、振る舞い検知を正確に行うためには取得できるデータの種類が微妙に足りませんでした。

事前に調べていなかった事を反省しています。

個人的にはsysmonを使うより自分でそこから作っていくべきだったのかなと思っています。ayaとかあるし。

感想

受講生として参加したのは2020年で、縁あって今年は講師として参加させていただきました。

2020年はオンラインだったので、オフラインで5日間みっちり開発を行うのは全く違った楽しさがありました。

受講生の2人もチューターも非常に優秀で、あまり講師として活躍できたかはわかりませんが、非常に良い経験ができたので、また機会があればやってみたいと思っています。

課題はわかったので自分でも実装したいですね。

おわりに

この記事はn01e0 Advent Calendar 2023の13日目の記事です。

明日はあるかわかりません

また、IPFactory OB Advent Calendar 2023の13日目の記事も兼ねています。