セキュリティキャンプ2020全国大会に参加できることになった
応募を決めた理由
セキュキャンは一度しか参加できないので,割と慎重になっていたが,今回のキャンプに参加しても来年以降も参加できるとの事なので,参加しないのはもったいないと思った.
選択
Z-V Rustで作るLinux向けアンチウィルスソフトウェア
選択コースも面白そうなコースが多くて迷ったが,Rustに惹かれた.
Rust,AVの2つの単語で心が踊らない男はいない.
最近は基本的になんでもRustで書くタイプの人間をしているが,本を読むことも無くただひたすらに書いて覚えてきたので,一度人に教わりながらRustを書いてみたかった.
課題
課題を引用する
Z5. 「Rustで作るLinux向けアンチウィルスソフトウェア」
課題1,2は必須です。課題3は設計ドキュメントだけ、実装が途中 でもOKです。 なお、募集期限のうちは、ソースコードを公開リポジトリに置かないようにしてください。
課題1
- ClamAVのclamonaccのソースコードを読んで、その機能、必要性を説明してください。またfanotifyがない古いカーネルでは、カーネルモジュール(clamuko)が必要でしたが、必要だった理由を考察してください。
課題2
- Rustとyaraのbindingsを使い、UPXを検知するスキャナプログラムを作成してください。
- 引数でスキャン対象のファイルとyaraのルールファイルを指定して実行するようなものを作成してください。
- 加えて、ディレクトリをスキャンできるようにし、/usrをスキャンして計算時間を計測してください。
課題3
- 課題2のスキャナを拡張し、アンチウィルスサービス(デーモン化)をRustで実装してください。
- 並列スキャンができるように設計してください。
- アンチウィルスサービスのIFは自由です。
- スキャン処理だけでリソースが枯渇しないような処理の制限を設定できるようにしてください。
課題2
先に取り組んだのは課題2だった. yara crateを使えば実装難易度はgrepくらいのものなので,割とすぐ終わった.
課題1
私には課題を期限ギリギリまでやらない悪い癖がある.
楽しい実装の課題だけやって,「おもしろそうだし他のトラックの課題もやってみよう」などと軽い考えで生活した結果,締切前日の夜中に夜行バスの中でソースコードを読むことになった.
割と読みやすい綺麗なソースコードだったのと,Linuxカーネルを読む経験があったので,解読自体は割と難しいものではなかった.
一方で,ソースコードを読んでプログラムの実装はなんとなく理解しても,その機能や必要性を言語化するのは少し難しかった(結果,かなり粗末な日本語を生成してしまった).
clamukoについては,カーネルモジュールのソースコードを読もうと思って気合を入れて探してみたら,蓋を開けたら中身はほぼ別のモジュール(dazuko)を使ってるだけだった(これはもしかしたら見るバージョンが違っていたのかもしれない).
課題3
1で作ったのはほぼgrepなので,まずは使いやすいようにファイル分けたりした.
並列処理については扱い慣れてないので,別プロジェクトで勉強したりしてる.
感想
後輩がどんどん通ってるのをTwitterで見て,連絡が無いので落ちたんだと思ってた.
やけになって別の事したりしてたけどちょっとしてから封筒が来てた.
通ったのは嬉しいので頑張る.
気になる点
なぜ結果が郵送なのか
いつ結果が決まったのかわからんし,時間差が出るのでつらい
一部の人はID発表より早く届いていたので,その人達のツイートを見て,「来てないって事は落ちたんだな」と思っていた.
よくわからないけど,ID発表→必要書類郵送の順番じゃいけない理由があるんだろうか.
期限が伸びた事がわかりづらい
期限が伸びたのなら,もう少し伝わりやすい方法で伝えてほしかった.
もとの期限の間に提出した人に改めてメールで伝えるとかしてくれるとありがたかった.Twitter見てなかったらヤバかったね.
特に自分のゼミの課題は,募集期間中はソースコードを公開してはいけないというルールがあるので,もし期限が伸びた事に気付かないで公開していたらと思うとこわい.