GMOペパボサマーインターン2020研究開発コースに参加しました

9/8~10までGMOペパボさんのサマーインターンに参加し,自分は研究開発コースでeBPFのツールを開発してきました.

参加の経緯

研究室の同期の@terassyiにこのインターンを教えてもらい,ちょうど卒研でシステムコールを使ったマルウェア検知の研究を行っていたので,即応募しました.

インターンでやったこと

主題としてはeBPFを使ったツールを開発することでした,私はセキュリティ面でのeBPFの利用として,execve()で実行されるバイナリの解析を行いました.元々ファイルレスマルウェアなどのファイルを持たず解析を受けにくいマルウェアに対して,プログラムの実行時にカーネルで検査を行うというアイディアを持っていたので,eBPFを使えばそれが実現できるのではないかと考えました.

1日目

まずエンジニアとはという講義を受けたのち,公式のチュートリアルをやっていきました.

github.com

多分Lesson10くらいまでやった気がします.

2日目

午前中はチュートリアルをやり,午後から個人テーマを決めてそれに取り組んでいきました.

3日目

ギリギリまで個人テーマをやっていき,最後に発表会.オンラインでなかなか様子が分からなかったけど,他のコースの方々はチームで素晴らしいものを作られてました.

ランチ・懇親会

ランチや懇親会ではコース関係なく,また今年新卒で入社した方々など多くの人と交流できる場を設けてくださいました.お互いをあだ名で呼び合うという文化を始めとして,パートナーの方々がとても仲が良いことが印象に残り,会社の環境・雰囲気を知ることができるとても貴重な時間でした.

成果

元々は実行時にバイナリ全体を解析するようなツールを脳内で描き,バイナリをメモリにロードするカーネル関数をフックしてバイナリの内容を見るというツールを開発しようとしましたが,なぜかそれが実現できませんでした.(ここの原因はいまだに不明...)
そこで今回はプログラムが実行された時にそのプログラムのフォーマットがELFなのか,scriptなのかを判定するツールを作成しました.これはそれまでの試行錯誤の中でわかった,プログラムはどういうフォーマットであってもexecveによって実行され,その中でそれぞれのフォーマットに合わせた処理に分岐していくというカーネルの処理を利用して判定しています.

github.com

f:id:udon-yuya:20200914222646p:plain
実行の様子

CODEはscriptのshebangの内容を表示しています.

まとめ

Linuxカーネルの知識が足りておらず,自分の思った通りのツールを作ることができなかったため,少し悔しさが残るインターンではありましたが,得られたものはそれ以上に多く,本当に参加できて良かったと思います.
今後は各方面の知識をさらに高め,ツールの開発に取り組んでいきたいと思います.

謝辞

最後になりましたが,インターン生のために多くの時間を割いていただいたGMOペパボのパートナーの方々には本当に感謝しています.特に個人的にはYoutube上でしか見たことがなかった@udzuraさんと一緒にカーネルのソースを読めたのが一番エキサイティングなことでした,お世話になりました.ありがとうございました.