以前に書いた「Vulsのコードを読む」シリーズの記事のまとめページです。
Vulsのコードリーディングをしてどうやって脆弱性スキャンをしているのか4回に分けて記事にしていたのでその記事の解説とそれに関わる記事の解説を書いてます。
このまとめ記事を書くに辺り過去の記事を更新したり、vulsのアップデートを確認したり、自分で書いたはずの記事なのに忘れていることが多かったり・・・振り返ることができました。
また、元々コードを読んで理解しようというモチベーションで始めたものがプルリク出してOSSに貢献できたり、実際に自分でコードを書いてOSSを公開したりと、ちょっとしたきっかけがどんどん次に繋がっていたのだなぁと改めて思いました。
Vulsのコードを読む
その1 全体像の把握
Vulsで使われているGoogleのsubcommandsというCLIツールを作成する際に使われるライブラリの話がメインです。
GoでCLIツール作りたい人は読んでもいいかもですが、あまり深くまで書かれていない(コードの読み始めで理解ができていなかった)ので読まなくてもいい記事。
また、GoのCLI用のライブラリとしてsubcommandsはメジャーではないように思われますし、私が作成したCLIツールgo-cve-searchでもsubcommandsではなくurfave/cliを使っています。
Vulsのコードを読む その1 全体像の把握 - Security Index
その2 go-cve-dictionary を理解する、バグを見つけてプルリクを出してマージされるまで
Vuls本体ではなく、Vulsが利用しているgo-cve-dictionaryというNVDからCVEの情報を収集してデータベースに格納、そして簡易的なサーバモードとして立ち上げることでデータベースから出力することができるライブラリについての解説です。
タイトルにあるようにコードを読んでいく中で小さなバグを見つけたのでプルリクを作成してマージしてもらう、ということを経験しました。
今までOSSを使うことはあってもコントリビュートしたことはなかったのでVulsのコードリーディングの中で初めてOSSへの貢献をする事ができました。
マージだんですっhttps://t.co/1wRQYP5hxC
— バルスのちょんまげおじさん (@kotakanbe) 2019年11月22日
本当に小さなバグ修正ですが、自分の中では大きな良い経験ができたと感じています!
また、NVDのデータフィード、CPE (Common Platform Enumeration)、プルリクの出し方などについても書かれていますので参考になると思います。
Vulsのコードを読む その2 go-cve-dictionary を理解する、バグを見つけてプルリクを出してマージされるまで - Security Index
その3 Vuls scanを調べてみた (Vulsへのプルリク)
Vuls本体の「vuls scan」コマンドを実行した時に行われる処理の部分を説明しています。
vuls scanでは脆弱性の特定までは行っておらず、スキャン対象のサーバの状態(カーネル情報、インストールされているパッケージ情報、アップデート可能なパッケージ情報など)を取得して、resultsディレクトリ以下に結果の保存する処理を行っています。
この部分を読むことでスキャン対象のサーバのディストリビューションの特定方法(Debian, RedHat, SUSEなど)、インストールしているパッケージ情報の取得、アプリレイヤーのライブラリの取得に関してどの辺りで行われているのか、他のOSSを上手く利用して実現されていることなど感じることができると思います。
その3ではVulsのスキャン部分で小さな気になる部分があったのでそこへプルリクを投げ、マージされました。
今回も本当に小さな修正ですが、Github starが7.6kもあるOSSへ貢献できたというのはとても嬉しい経験でした。
Vulsのコードを読む その3 Vuls scanを調べてみた (Vulsへのプルリク)- Security Index
その4 Vuls reportを調べてみた
Vuls本体の「vuls report」コマンドを実行した時に行われる処理の部分を説明しています。
ここではその3で説明したvuls scanで取得したサーバ情報と外部から収集した脆弱性情報をマッチングさせ、その結果をレポートとして出力する処理に関して書かれています。
アプリケーション層のライブラリの脆弱性に関してはTrivy、各ディストリビューションの脆弱性はgoval-dictionary、cpeを使ったマッチングはgo-cve-dictionary、Github Secruity Alertsの情報の取得、RedHatなどのSecurity Trackerの情報はgost (go-security-tracker)、Exploitコードの情報はgo-exploitdb、go-msfdb。
Vuls本体ではこれらのOSSで収集した脆弱性情報をvuls scanで特定したサーバの情報をマッチさせて、様々なレポート形式で出力させることを行っています。
go-msfdbは2020/7/13にリリースされたv0.11.0で新しく組み込まれたものでrapid7のMetasploitモジュールの情報を収集するライブラリのようです。
このまとめ記事を書くに辺り「その4」の記事にgo-msfdbの内容も少し加筆しました。
また、vulsではレポートとしての出力先が豊富にあり、email, http, slack, hipchat, telegram, localfile, s3, azure-blobなど。
Goでこの辺りへの出力方法を検討している人は書き方を参考にすると良いのかもしれません。
Vulsのコードを読む その4 Vuls reportを調べてみた - Security Index
その他
ソフトウェアデザイン 2019年11月号 脆弱性スキャナ特集(Vuls/Trivy/Dockle) まとめと感想
ソフトウェアデザイン 2019年11月号の特集2「脆弱性スキャナ Vuls/Trivy/Dockle」のまとめと感想の記事です。
このまとめ記事を書くにあたり再度ソフトウェアデザインを読み直しましたがコラムの「Vulsとの出会い」、Vuls/Trivy/Dockleのそれぞれの開発者が語る第4章「開発者が語るOSSノインパクト」の話がとても面白い。
セキュリティは本当に総合格闘技と呼ばれるくらい様々な知識が必要で、Trivyの開発者の方も幅広くセキュリティの知識を付けたが結局何ができる人なのか、という点で悩んでいたそうです。
Vulsと出会う前にも自分が楽になるためのソフトウェアなどは書いていたが自分だけが使うものなので綺麗なコードで書くわけでもなく、セキュリティと開発の両立ができるものはないかと思っていたところでVulsで出会ったそうです。
VulsとVulsの開発者の方との出会いからTrivyの開発まで繋がり、イスラエルで働くことになるという想像もできないような変化が生まれたのだと思います。
Vulsの開発者の神戸さんも2019年度ソフトウエアジャパンアワードを受賞し、Dockleの開発者の方もデンソーの「Misaki」に関わるなど大変活躍されています。
祝!ソフトウエアジャパンアワード受賞 「OSSで社会貢献したい」Vuls開発者 神戸さんインタビュー|未来報|フューチャー株式会社
ソフトウェアデザイン 2019年11月号 脆弱性スキャナ特集(Vuls/Trivy/Dockle) まとめと感想 - Security Index
go-cve-search 作ってみた - TDD, Circleci, README Badge, Terminal Gif, Cliツール開発の話
vulsのコードリーディングを終えた後、やっぱり自分でも何か作りたい!と思い作ったものです。
CVE IDを引数に与えるとNVDのデータフィードから情報を取ってくるというかなり単純なものです。
GithubでNVDのデータフィードを整形したものを置いてくれているレポジトリも多くあるのですが全てのデータをcloneして持ってくるとデータサイズがかなり大きくなる、常にアップデートして最新状態にしておかなくてはならない、などの自分としては課題を感じている部分があったのでそこを解消するものを作りました。
どうせなら周辺の技術も学びたいということでTDDやCircleciもやってみたり、Github starが欲しい!ということでREADMEに色々なBadgeを付けたり、Gifで使い方がわかるデモのようなものを付けたりしました。
公開当時は当然ではありますが全くスターもつかず、一生スター0で終わるんだろうなぁ・・・と思っていたのですが、最近たまたま見てみたらスター数 14、forkも1されていて驚きました・・・
GitHub - s-index/go-cve-search: lightweight CVE search
一部の人にもしかしたら使われているのかもしれないですし、今後もいくつか改善アイデアがあるので時間を見つけてアップデートしていきたいです。
go-cve-search 作ってみた - TDD, Circleci, README Badge, Terminal Gif, Cliツール開発の話 - Security Index
最後に
少し時間があったので過去を振り返ろうと思い半年ほど前に書いた記事を読み返して、更新してみましたが忘れていることも多く、また振り返るとその当時どんなことを考えてたのかとか、何に悩んでいたのかとかも思い出せてとても良い機会になりました。
また、元々コードを読んで理解しようというモチベーションで始めたものがプルリク出してOSSに貢献できたり、実際に自分でコードを書いてOSSを公開したりとちょっとしたきっかけがどんどん次に繋がっていたのだなぁ・・・と改めて思いました。
Twitter (@security_index) | Twitter
これでできる!はじめてのOSSフィードバックガイド 「つよいエンジニア」になるための実績の育て方