VulsがAlpine Linuxに対応したぞ


こんにちは、Vulsのちょんまげこと、サウナおじさんです


コンテナ向け軽量OSである、Alpine Linuxですが結構流行ってるみたいっすねぇ。
Dockerの公式イメージもAlpineベースになってるとか。
Docker Official Images are Moving to Alpine Linux


GitHubのISSUEやSlackでもAlpine, Alpine、あんまりゆうもんだから対応しなきゃなぁっておもってたんだよ。
で、ついに先日、勢いで実装したVuls:#545をマージしたもんですのて、Vulsのスキャン可能なOSにAlpine Linuxが追加されやした。
使い方はVuls:#545に書いてるのでそれ見てもらうとして、このVuls Advent Calendar3日目ではどーいう感じでAlpine Linuxに対応したのかを書いてみるよ。

Alpine Linuxが提供する脆弱性情報

alpine-secdbにてYAML形式で提供されてるよ。
現在はv3.2 - v3.6の脆弱性情報が提供されてるんだね。リンク

v3.6の情報を見ると、それぞれのバージョンごとに、
- community.yaml
- main.yaml
の2ファイルにわけて提供されてます。なんで2つに分かれているのか?
VulsのIssue経由で公式のWikiにその理由が載ってるよとの情報あり。
https://wiki.alpinelinux.org/wiki/Enable_Community_Repository

Starting with Alpine Linux version 3.3, there is a new repository called community.
Many packages have been moved from the main repository to community to 
indicate that they are not guaranteed to be supported beyond six months. 
If you are using any of these packages, be sure to add the community repository.

で、2つみたらいいんじゃね、と。

so in my opinion it would make sense to check against both - why should we left of users of software from the community repo

YAMLの内容は、こんな感じ。

packages:
  - pkg:
      name: apache2
      secfixes:
        2.4.27-r1:
          - CVE-2017-9798
        2.4.26-r0:
          - CVE-2017-3167
          - CVE-2017-3169
          - CVE-2017-7659
          - CVE-2017-7668
          - CVE-2017-7679
        2.4.27-r0:
          - CVE-2017-9789

パッケージ名、バージョン名、直したCVE-IDのリストになっとる。この情報、使えますな。

Alpine-secdbの取り込み

2017/12/3時点のVulsでは、インターネット上で公開されている脆弱性データベースを使っててそれにVulsからアクセスしやすくするために以下の2つのツールを作って使ってる。

  • go-cve-dictionary

    • 米国NISTが提供するNVD
    • IPAが提供する日本語の脆弱性情報であるJVN
  • goval-dictionary

    • Linux系ディストリビュータが提供するOVAL形式の脆弱性データベース

で、今回Alpine-secdbをどーやってVulsに組み込もうかなーと悩んで、別ツールとしてリポジトリ分けようかなーともかんがえたんだけど、そうなるとセットアップの手間が増えるのでアレかな、うーんとかサウナで悩んで、結局alpine-secdbを無理やりOVAL形式に変換して組み込むことにした。OVAL形式にしたほうがVuls本体側の実装が楽になるしね。

それがコレgoval-dictionary:#22
Alpine-secdbからYAMLをフェッチしてきてDBにぶち込んでるだけや。

利用例はここに書いといたよ

Vuls側の実装

このプルリクVuls:#545がVuls側の実装だよ。
実装は簡単だったよ。
以下、何やってるか書いとくよ。

  • Alpine Linuxを判別
    • ls /etc/alpine-releaseで判別してるよ
    • serverspecの実装を徹底的に参考にさせていただきやした
  • インストールされてるソフトウェアリストを取ってくる部分
    • apk info -vの結果をパースしてる
  • アップデー後のバージョンを取っていくる部分
    • apk versionをパースしてる

基本そんだけで対応出来たよ。OVAL形式にしたので既存の実装に乗っかれたわけだね。
あたしゃOVAL形式に合わせといて良かったよ。天才だね

さーてサウナでも行くべよ(土曜日20:40記)