はじめに
こんにちは。基礎技術研究室の中川です。
私は昨年の4月入社でしたので、入社して1年が経ってしまいました。
FFRIでは、4月から3ヶ月ほどの新人研修を行った後、OJTに移行するという体制をとっています。少し記事として出す時期が遅くなってしまいましたが、この記事では昨年度の弊社の新人研修で行ったトレーニングの内容、今年度新人研修について簡単に紹介したいと思います。
対象読者としては、「FFRIへの入社に興味があり、入社後にどういったサポート・トレーニングが受けられるのか、その詳細を知りたい」という現在就職活動中の方を想定しています。
募集要項の要件「必須条件」に「※セキュリティに関しての事前知識は必要ありません。」と書いているものの、実際のところセキュリティの事前知識なしで本当に大丈夫なのか不安という方は、具体的にどういったサポートを受けられるのか、この記事を通じて把握できると思います。
2018年度新人研修の内容の紹介
PCセットアップ・開発インフラチュートリアル
入社初日と2日目は入社式とビジネスマインド研修を受講し、社会人としてのビジネスマナーや社内制度について学びました。
ビジネスマインド研修終了後は、各人に割り当てられる研修用デスクトップPCのセットアップを行いました。ディスプレイは各人に2台割り当てられるため、デュアルディスプレイで開発を行うことができます。
ちなみに、研修終了後に部署に配属されますが、配属後はまた別途開発用のノートPCが支給されます。参考までに、製品開発部で支給されるノートPCのスペックを以下に示します。
- CPU:
Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
- メモリ: 32GB
- SSD(NVMe): 1TB
- HDD: 2TB
- グラボ:
NVIDIA Quadro M1200
研修用デスクトップPCのセットアップ作業では、開発に必要な各種ツールのインストールを先輩エンジニアの指示に従って行いました。PCセットアップ時に入れた代表的なツールとしては以下のようなものがありました。
その他、各人でお好みのテキストエディタ・バイナリエディタ・業務効率化のツールをインストールしました。こうしたツールの導入について基本的に制約はありません。各人で好きなツールをインストールすることが可能です。
また、デフォルトでVisual Studio Professional、VMWare Workstationがインストールされており、ライセンスキーの入力もこのタイミングで合わせて行いました。
ツールのインストール後、開発インフラのチュートリアルを受講しました。FFRIではバージョン管理システムとしてgit、ホスティングにはGitHub Enterprise、プロジェクト管理にはRedmineを利用しています。これらツールの利用方法について簡単な例を通じて学びました。
プログラミング課題
PCセットアップ終了後、プログラミング課題に取り組みました。C/C++でのWindowsのシステムプログラミングに関する問題が5題出題されました。一週間弱でこれら5題の問題にとりくみました。
新人は各々で5題の問題に取り組み、1つの問題を解き終わり終わり次第、GitHub Enterpriseのリポジトリへプッシュ、先輩エンジニアのレビューを受けるという形で進めて行きました。
問題の内容についてはここでは取り上げませんが、Windowsプログラミング未経験者でも、適宜情報を収集しながら解ける内容となっています。
私自身、Windowsシステムプログラミングの経験がなく、Visual Studioを使ったプログラミングの経験もそこそこという感じでしたが、時間内に問題を解き終えることができました。この課題への取り組みを通じ、Win32 APIを使ったプログラミング、GitHubを使ってのコードレビューの流れ、gitを使ったバージョン管理について実際に手を動かしながら学ぶことができました。
サイバーセキュリティ基礎・マルウェア解析
プログラミング課題の後はサイバーセキュリティ・マルウェア解析に関する基礎知識に関しての講義を受けました。
サイバーセキュリティ関する基礎知識としては、 - 情報セキュリティの三要素 - 代表的なサイバー攻撃 - 攻撃の発見・検知と防御 - ペネトレーションテスト
などについて先輩エンジニアによるセミナー形式で学習しました。実際にNmap・OpenVASなどのツールを使い、実際に体験しながらの知識を身に着けました。
マルウェア解析に関しては、表層・動的・静的解析について、ツールを使いながら習得していきました。
動的解析の講義では API Monitorやデバッガーを用いての解析手法を学びました。適宜演習問題を解きながら進めるため実践的なテクニックを身につける事ができました。
静的解析の講義では、x86/x64 アセンブリに関しての基礎知識から始まり、最終的にディスアセンブラを用いてのマルウェアの解析までを行いました。(ちなみに、x86/x64 アセンブリについて事前知識なくとも理解できるような内容となっているので安心です。)
この研修で身につけた知識は部門別研修の「エンジン開発業務研修」「テクニカルサポート業務研修」などに直結する内容で、研修全体を通じ非常に重要な内容となっています。
開発基礎研修
社内でソフトウェア開発を行うのに必要な知識をこの研修では学びました。 具体的には次のように、製品開発の一連の流れについて経験しました。
- 要求仕様書を元にして機能仕様書を作成
- 機能仕様書を元に開発
- 開発したコードを先輩エンジニアにレビュー依頼
- レビュー内容を元に修正し、再度レビュー依頼 (プルリクエストが承認されるまで繰り返し)
2018年度はSQLiteを用いた簡易的なデータベースサーバーとクライアントの要求仕様書が渡され、それを元に機能仕様書の作成を行い、C/C++で実装しました。
機能仕様書の作成には制限時間が設けられ、制限時間経過後に新人同士で機能仕様書を交換し、レビューし合うという方式を取りました。新人同士で機能仕様書のレビューをし合うというのはなかなか良い経験で、相手に過不足なく簡潔に説明する文書作成の大変さを身にしみて感じることができました。
また、先輩エンジニアによるコードレビューがなかなか厳しいもので、製品コードに求められる品質レベルの高さを実感しました。(私は一つのプルリクエストに対して5--6回ほど修正を命じられ、涙目になりながら修正に取り組みました。) このコードレビューを通じ、脆弱性を作り込まない、エラー処理を忘れず書く、メモリ解放忘れが起きないように作り込むことなどを身につけることができ、現在、研究開発業務でコードを書く際にも生かせています。
部門別研修
サイバーセキュリティ、ソフトウェア開発に関する基礎知識を身に着けた後は、部門別の研修へと移りました。部門別研修についてはすべてを紹介し、それぞれについて詳細を説明するとかなり長くなってしまうため、いくつかピックアップして簡単に記述していきます。
製品開発業務研修
この研修では実際の製品のバグチケットを一つ担当し、そのバグを修正する作業を行いました。この研修を通じ、製品のビルド方法・インストール方法・使用方法についても習得しました。
エンジン開発業務研修
この研修では以下の2つに取り組みました。
マルウェア検知ロジックの作成
マルウェアを解析し、その解析結果を元にして検知ロジックを考案し実装するところまでを行いました。
今年はランサムウェアが対象となりました。動的解析・静的解析を用いた挙動の分析、実害が発生しないタイミングで止めるには具体的にどの段階で検知するべきかを検討し、実装しました。また、解析対象となった検体のみならず亜種の検体に対しても有効なロジックとなっているのかまで確認し、検討ロジックの汎用性の検証まで行いました。
マルウェアを検知できるようにするだけでなく、正常なファイルを誤ってマルウェアと検知しないことも求められました。今回の研修では100の正常なファイルが用意され、実装したロジックで誤検知を1件も出さないということが要求されました。
この過検出を出さないロジックになっているのかの確認には少し手こずりました。100もの実行ファイルを手動で一つずつ実行していくのは現実的ではないため、検証過程を高速化するために、新人各人で様々な工夫を凝らしていました。(ちなみにですが、私はPowerShellを使い、100の実行ファイルを各々10秒だけ実行し、止めるというやり方を採用しました。)
メモリダンプの解析
WindowsのクラッシュダンプファイルをWinDbgを使って解析し、クラッシュ原因を突き止める方法について学びました。
扱いに関する情報の少ないWinDbgですが、先輩エンジニアからWinDbgのノウハウを教えていただき、実際に弊社の製品において遭遇したクラッシュ原因を、メモリダンプから推定していく作業を行っていきました。
品質保証業務研修
この研修では渡された機能仕様書を元に、テスト仕様書を作成、仕様書に基づきテストの実施を行いました。実際に弊社製品の品質保証業務に取り組み、品質保証業務の一連の流れを経験しました。
新人2人でペアになり、それぞれでテストケースを作成、テストケースを新人同士で交換して各々でテストを実施する形式を取りました。開発基礎研修のときと同様、相互で作成したものを交換し、レビューし合う形式を取ることで、相手に伝わりやすいテストケースを書くために必要なことを学ぶことができました。
テクニカルサポート業務研修
過検出判定の業務に関する研修に取り組みました。FFRI yaraiが実際に検出した過去の検体について、その検出結果が正しいか判定する業務を行いました。マルウェア解析で身につけた主に動的解析の知見を元にして、素早く検出結果を判定するための技術を身に着けました。その他、サポート案件において必要される、企業におけるITシステム・ネットワークの基礎に関する講義を社内で受講しました。
基礎技術研究室業務研修
FFRI Dataset 2018の紹介記事でも少しだけ触れましたが、研修ではMWS Cup 2018でも出題された動的解析ログを読み解く問題と、FFRI Dataset 2018を用いたマルウェア検知器の作成の2つに取り組みました。MWSにおいて出題された問題とその出題意図についてはMWS Cup 2018 課題 3 ふりかえりの記事を参照ください。
マルウェア検知器の作成に関しては、研修期間中スコアサーバーが稼働しており、新人同士で作成したモデルの性能を競い合いました。スコア計算式がFalse Positive Rate (FPR)が高いと大きく減点されるもので(FPRが2%以上だとTPRが良くてもスコアがプラスにならない。TPRが100%、FPRが0%で、スコアの最大値が100。)、FPRを低減することに注力する必要がありました。私が最初の時点で提出したモデルはFPRが非常に高く、スコアがマイナスになってしまいました。
FPRの低減はアンチウイルス製品において非常に重要です。実際、アンチウイルス製品の検知性能を示すテストVB100では、認定基準としてFPR 0.01%であることが定められています。このことを考慮すると、スコア計算式のFPR 2%以上であれば、得点がプラスにならないというのは妥当と言えます。この研修においてFFRI Dataset 2018を使ったマルウェア検知器作成を通じ、製品に積まれる検知器に求められるTPRとFPRの値の厳しさを身にしみて感じることができました。
ちなみに、この研修での検討結果がもととなり、SCISでの研究成果が生まれています。
研修後のOJT、支援制度など
研修が終わったあと各部署に配属され、OJTに移行します。OJTでは、新人に1人メンターが付き、トレーニングの状況を月1回のOJTフォローアップミーティングで確認する形を取ります。
このミーティングには弊社代表取締役社長も参加し、OJTに関することのみならず、働き始めて感じている悩みに関してざっくばらんに相談することができます。このようなトップと面談する機会が頻繁に与えられるのは規模の比較的小さいFFRIならではと思います。
その他、書籍購入用に毎月予算が組まれており、予算内であれば自由に書籍の購入申請を出すことができます。また、社外勉強会へも上長への相談の上、自由に参加することが可能です。
2018年度の新人研修を振り返って
多少抜けている部分がありますが、大雑把には上記のようなトレーニングを4月から7月半ばまでの3ヶ月弱ほど受講しました。
私自身サイバーセキュリティの知識はほとんどなく、C/C++での開発経験のみで入社した身ではありましたが、全てのトレーニングをこなすことができています。
入社時点でサイバーセキュリティに関する知識を有されている方ももちろんいますが、そういった方ばかりではありません。募集要項にある通り「C/C++プログラミングができる方、コンピュータサイエンスの基礎を習得されている方」であれば問題なくこなせる内容であったと感じています。
2019年度について
2019年度の新人研修は、2018年度から大きく変更し、いくつか削除・追加する項目があります。ここでは2018年度の研修から追加するコンテンツについて紹介します。
機械学習研修
近年、機械学習の研究発展は目覚ましいものがあり、その適用される分野は年々広まっています。弊社製品FFRI yaraiにも機械学習エンジンがあり、比較的早い段階でマルウェアの検知において機械学習の適用を進めて来ました。
FFRIでは、主にマルウェアの検知ロジックの検討を行っているエンジニアが機械学習に関する技術習得をしてきましたが、今年度より新人エンジニア全員が機械学習に関する素養を身につけるべきと判断し、独自のコンテンツを用意し素養を身に着けてもらうことにしました。
機械学習研修では、データクリーニング、Exploratory Data Analysis (EDA)などのモデリングを行う前段階の作業から、学習モデルを構築する作業までを通して行ってもらうことを予定しています。また、用意したテストデータについて、Kaggleのようにコンテスト形式で性能を競ってもらう予定です。
Windows解析研修
マルウェアの解析を行う上で、Windowsに対する深い理解は不可欠です。FFRIではこれまで、システムプログラミングの研修などを通じ、こうしたWindowsに対する理解を深めてもらうようにしていましたが、更に強化するためにこの度Windows解析研修というコンテンツを追加することにしました。
具体的にはWindowsを題材としたリバースエンジニアリングに関する問題を5題ほど出題し、Windowsに関する知識を実体験を通じて学べるようにしています。UndocumentedなWindows APIの挙動を解析する問題、スタートアップアプリケーションを解析する手法を考案する問題、などを出題し、新人の皆さんに解いてもらう予定です。
おわりに
2018年新人研修と2019年度の変更点について紹介しました。入社後に受けることができるトレーニング内容に不安があった方にこの記事が役に立てば幸いです。
FFRIではサイバーセキュリティに関する研究開発を希望するエンジニアを募集しています。採用に関することはこちらを御覧ください。