labunix's blog

labunixのラボUnix

CVEデータベースの最新版のチェック

■CVEデータベースの最新版のチェック
 csv.gzをダウンロード、解凍してファイルとパイプに渡して、
 CVE番号のみを抽出、
 最初と最後のCVE番号を出力。

$ wget -O - https://cve.mitre.org/data/downloads/allitems.csv.gz 2>/dev/null | \
  zcat | tee CVEdatabase_`date '+%Y%m%d_%H%M%S'`.csv | \
  awk -F, '{print $1}' | grep ^CVE | \
  awk '(NR==1){print};END{print}'
CVE-1999-0001
CVE-2014-5880

■ファイルに落としてあるので、以下で確認出来る。
 「ls -t」で更新日時の新しい順に並び替えすることで、
 最新のCSVを選択して表示する。

$ ls -t CVEdatabase_* | head -1 | xargs cat | \
  awk -F, '{print $1}' | grep ^CVE | tee CVE-ALL_`date '+%Y%m%d_%H%M%S'`.log | \
  awk '(NR==1){print};END{print}'
CVE-1999-0001
CVE-2014-5880

■最新のCSVにあるCVEは約7万。

$ ls -t CVEdatabase_* | head -1 | xargs cat | \
  awk -F, '{print $1}' | grep ^CVE | tee CVE-ALL_`date '+%Y%m%d_%H%M%S'`.log | \
  wc -l
71611

■DEBIANをCVE基準で検索。
 ※古いものに一部、DSAの無い番号がある。

$ ls -t CVEdatabase_* | head -1 | xargs cat | grep DEBIAN: | \
   awk -F, '{print $1}' | grep ^CVE | tee CVE-DEBIAN_`date '+%Y%m%d_%H%M%S'`.log | \
   awk '(NR==1){print};END{print}'
CVE-1999-0374
CVE-2014-4049

■DSA基準で検索
 ※一部DSAで始まらない番号がある。

$ ls -t CVEdatabase_* | head -1 | xargs cat | grep "DEBIAN:[D0-9]" | \
  sed s/".*DEBIAN\:\([0-9A-z_:\-]*\).*"/"\1"/g | tee DSA_CVE_list_`date '+%Y%m%d_%H%M%S'`.log | \
  awk '(NR==1){print};END{print}'
19990215
DSA-2961

■wheezy固有のCVEが2件なはずは無くて、少なくとも約3千はある。

$ ls -t CVEdatabase_* | head -1 | xargs cat | grep -i wheezy | \
  awk -F\, '{print $1}'
CVE-2012-0216
CVE-2013-1048

$ grep -i wheezy CVE*.log | awk -F\: '{print $1}' | sort -u | wc -l
3445

■本家のセキュリティ勧告は日付不詳、1997-1998など、
 外部参考セキュリティデータベースが無いセキュリティ情報も管理している。

$ for list in undated `seq 1997 2014`;do \
    if [ -f "$list.log" ];then \
      cat "$list.log"; \
    else \
      w3m -dump "https://www.debian.org/security/${list}" 2>/dev/null | \
        tee "$list.log"; \
    fi; \
  done | grep "\[[0-9A-z]" | \
    tee DSA-list_`date '+%Y%m%d_%H%M%S'`.log | \
    awk '{if("[undated]"==$1) \
            {OLD=$0} \
          else \
            {if("[2014-07-01]" > $1 && MAX < $1) \
              {MAX=$0} \
             } \
           };END{print OLD"\n"MAX}'
[undated] bliss virus
[2014-06-27] DSA-2969 libemail-address-perl - security update

■最新のDSAとCVEの対応リストでクリティカルバグの条件を加えるなら以下。

 Debian Wheezyのセキュリティ情報の取得(DSA/CVE/クリティカルバグ)
 http://labunix.hateblo.jp/entry/20140614/1402674748

■REDHATをCVE基準で検索。
 ※一部RHSAの書式が異なる番号がある。

$ ls -t CVEdatabase_* | head -1 | xargs cat | grep "REDHAT:" | \
  awk -F, '{print $1}' | grep ^CVE | tee CVE-REDHAT_`date '+%Y%m%d_%H%M%S'`.log | \
  awk '(NR==1){print};END{print}'
CVE-1999-0342
CVE-2014-3496

■REDHATをRHSA基準で検索。

$ ls -t CVEdatabase_* | head -1 | xargs cat | grep "REDHAT:RHSA" | \
  sed s/".*REDHAT\:\(RHSA[0-9A-z_:\-]*\).*"/"\1"/g | tee RHSA_CVE_list_`date '+%Y%m%d_%H%M%S'`.log | \
  awk '(NR==1){print};END{print}'
RHSA-1999:032-01
RHSA-2014:0764

■Redhat社のCVEデータベースから一覧を取得
 修正した「公開日」の無いものもある。

$ for list in `seq 1999 2014`;do \
    if [ -f "Redhat-CVE-$list.log" ];then \
      cat "Redhat-CVE-$list.log"; \
    else \
      w3m -dump "https://access.redhat.com/security/cve/?year=${list}" | tee "Redhat-CVE-$list.log"; \
    fi | grep "CVE-"; \
  done | \
  awk '(NR==1){print};END{print}'
CVE-1999-0002 Buffer overflow in NFS mountd gives root access to
CVE-2014-4667 Details pending                                     Moderate  2014-06-12

■Redhat社もCVE互換認定されているが、
 サポートが終了したバージョンのCVEの詳細情報をRedhat社から得ることは難しい。
 例えば、以下の参照先はリンク切れ。

 CVE-1999-0342
 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-1999-0342

■他にCVE番号が見つからなかったのは58件ある。

$ grep "CVE が見つかりませんでした" REDHAT-CVE*.log | awk -F\: '{print $1}' | sort -u | wc -l
58

■Microsoft社はCVE互換認定されていないことが、
 CVE番号で検索するのが難しい理由なのかも知れない。

 CVE-Compatible Products and Services
 https://cve.mitre.org/compatible/compatible.html

■MicrosoftのMS番号で検索。

$ ls -t CVEdatabase_* | head -1 | xargs cat | grep "MS:" | \
  awk -F, '{print $1}' | grep ^CVE | tee CVE-MS_`date '+%Y%m%d_%H%M%S'`.log | \
  awk '(NR==1){print};END{print}'
CVE-1999-0004
CVE-2014-2782

■MS Security BulletinのデータベースからMS番号のリストを取得

 Microsoft Security Bulletin
 https://technet.microsoft.com/security/bulletin/

 Microsoft Security Bulletin Data 
 http://www.microsoft.com/en-us/download/confirmation.aspx?id=36982

■MS番号基準のリストの作成
 MS12よりも前が無いのはサポートが終了しているからだろうか。。。

$ test -d MS || mkdir MS && cd MS; \
  URL1="http://download.microsoft.com/download"; \
  URL2="/6/7/3/673E4349-1CA5-40B9-8879-095C72D5B49D/";\
  URL3="MSRC-CVRF.zip"; \
  wget -O ${URL3} ${URL1}${URL2}${URL3}; \
  unzip ${URL3}; \
  for list in ms*.xml;do \
    echo -n "$list," | sed s/".xml"//g | tr '[a-z]' '[A-Z]'; \
    cat "$list" | sed s%".*\(<vuln\:CVE>.*\)"%"\n\1"%g | \
    grep "^<vuln\:CVE" | sed s%"</*vuln\:CVE>"%%g | xargs echo | \
    tr ' ' ','; \
  done | tr -d '\r' > MS-CVE_list-`date '+%Y%m%d_%H%M%S'`.log

$ ls -t MS-CVE_list-[0-9]* | head -1 | xargs cat | \
  awk '(NR==1){print};END{print}'
MS12-036,
MS14-036,CVE-2014-1817,CVE-2014-1818

■またMS番号にあるCVEは、CVEデータベースよりも古い情報を最新としている。
 MS番号のDBの更新タイミングによるものだろうか。。。

$ grep CVE-2014 ms* | sed s/"<"/"\n<"/g | sed s/">"/">\n"/g | \
  grep ^CVE | sort -n | tail -1
CVE-2014-2778

■MSがきちんと管理していないだけで、CVE番号は存在する。
 ※他にもMS番号とCVEの関係に過不足があるかも知れない。

$ ls -t MS-CVE_list-[0-9]* | xargs cat | grep -v CVE
MS12-036,
MS12-038,
MS12-040,
MS12-041,
MS13-015,
MS13-082,

$ ls -t MS-CVE_list-[0-9]* | head -1 | xargs cat | grep -v CVE | \
  tr '[A-Z]' '[a-z]' | tr -d ',' | \
  for list in `xargs`;do \
    echo -n "$list,"; \
    if [ -f "$list.log" ];then \
      cat "$list.log"; \
    else \
      w3m -dump "https://technet.microsoft.com/library/security/${list}" | \
      tee "$list".log; \
    fi | grep CVE | sed s/".*\(CVE[0-9-]*\).*"/"\1"/g | \
      sort -u | tr '\n' ','; \
   done | sed s/",ms"/"\nms"/g | sed s/",\$"/"\n"/
ms12-036,CVE-2012-0173
ms12-038,CVE-2012-1855
ms12-040,CVE-2012-1857
ms12-041,CVE-2012-1864,CVE-2012-1865,CVE-2012-1866,CVE-2012-1867,CVE-2012-1868
ms13-015,CVE-2013-0073
ms13-082,CVE-2013-3128,CVE-2013-3860,CVE-2013-3861

■結論

CVEデータベース、ベンダーのサポート情報の両方を確認し、
必要なら各ベンダーのサポートに問い合わせた上で対応しましょう。