GAIO CLUB

2024年01月12日

【第17回】脆弱性の分類

静的解析/コンパイラ技術
いまさら聞けない静的解析/コンパイラ技術
CWEでは、脆弱性の種別・分類の共通基準を提供しています。
ということで、前回集めた過去5年間のTop 25について見てみます。

なお、本コラムでは、2023年11月時点で公開されているCWE List Version 4.13を参照しており、登録されている脆弱性の数は934個です。

抽象度による分類

CWEのIDは抽象度による階層構造を持っています。4つに分かれており、Pillar・Class・Base・Variantです。抽象度が1番高いのがPillarで、Variantは具体的な表現になっています。

CWEのサイトには、各IDに説明ページがあり、そこには関連するIDの情報も載っています。その中に、ChildOfとParentOfという情報があり、親にあたるIDと子にあたるIDを示しています。この情報をもとに親子関係の図を作ることができます。

以下はCWE-125の説明ページですが、抽象度はBase、ChildOfに119、ParentOfに126と127があります。
CWE-125の説明

階層図

CWD-IDの親子関係から階層図を作ってみます。

まず、前回お話した過去5年間のTop 25の中で一番若いIDのCWE-20(不適切な入力データ検証)です。
CWD-IDの親子関係からの階層図
箱の数字はCWE-IDです。色は、茶色がPillar、黄色がClass、水色がBase、紫色がVariantです。

この図はCWE-20に直接関わる親子関係にあるものだけ繋いであり、例えばCWE-179の別の親であるCWE-696等は載せていません。図で分かる通り、必ずしもPillar→Class→Base→Variantという階層ではなく、Base→BaseやClass→Variantという階層もあります。CWE-20には沢山の子や孫が繋がっていることが分かります。

別のIDをお見せします。抽象度の低そうな脆弱性CWE-476(NULLポインタ参照)です。
CWD-IDの親子関係からの階層図
2つのPillarから繋がっていて親子関係は3段です。抽象度が低いので末端のIDですが、Variantではなく、Baseになっています。

もう一つ、過去3年連続ランク1位になっているCWE-787(範囲外書き込み)です。
CWD-IDの親子関係からの階層図
親子関係は5段です。CWE-787はBaseに設定されていて、子に2つのBaseと2つのVariantが繋がります。

最下層のCWE-121~CWE-124はこのような脆弱性です。
・ CWE-121:Stack-based Buffer Overflow
・ CWE-122:Heap-based Buffer Overflow
・ CWE-123:Write-what-where Condition
・ CWE-124:Buffer Underwrite (‘Buffer Underflow’)

Top25の抽象度

過去5年分のTop25をまとめた表のIDに抽象度の色分けをしました。
CWE(Common Weakness Enumeration)Top 25の抽象度
抽象度の高い脆弱性が並ぶかと思いましたが、そうでもないようです。また、抽象度の低い脆弱性がソースプログラムをイメージしやすいとも言えない気がします。

CWE-352を赤色にしてありまが、このIDはCompoundElement(Composite)と指定されており、複数の弱点による複合要因で発生する脆弱性のようです。その複数とは、以下のものだとしています。
・CWE-346:Origin Validation Error
・ CWE-441:Unintended Proxy of Intermediary (‘Confused Deputy’)
・ CWE-642:External Control of Critical State Data
・CWE-613:Insufficient Session Expiration

ViewとCategory

CWEサイトでは、脆弱性(Weakness)、複合要因(CompoundElement)の他に、ビユー(View)とカテゴリ(Category)という視点も提供しています。

ビューは、CWE-IDの見せ方や調べ方の体系と考えて良いと思います。例えば以下のようなものがあります。
・CWE-699 :VIEW:Software Development
・CWE-1194:VIEW:Hardware Design
・ CWE-1344 : VIEW:Weakness in OWASP Top Ten(2021)

本コラムを読んでくださっているみなさんに馴染みがありそうな、CERT Cのビユーもあります。
・ CWE-1154 : VIEW:Weakness Addressed by the CERT C Coding Standard

カテゴリは、共通のテーマによる脆弱性のグループ化です。
こちらも色々ありますが、CERT Cのグループを示すカテゴリが分かりやすいと思います。
・ CWE-1155 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 01. Preprocessor(PRE)
・ CWE-1156 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 02. Declarations and Initialization (DCL)
・ CWE-1157 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 03. Expressions(EXP)
・ CWE-1158 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 04. Integers(INT)
・ CWE-1159 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 05. Floating Point(FLP)
・ CWE-1160 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 06. Arrays(ARR)
・ CWE-1161 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 07. Characters and Strings(STR)
・ CWE-1162 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 08. Memory Management(MEM)
・ CWE-1163 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 09. Input Output(FIO)
・ CWE-1165 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 10. Environment(ENV)
・ CWE-1166 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 11. Signals(SIG)
・ CWE-1167 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 12. Error Handling(ERR)
・ CWE-1168 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 13. Application Programming Interfaces(API)
・ CWE-1169 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 14. Concurrency(CON)
・ CWE-1170 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 48. Miscellaneous(MSC)
・ CWE-1171 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 50. POSIX(POS)
・ CWE-1172 : CWE CATEGORY: SEI CERT C Coding Standard - Guidelines 51. Microsoft Windows(WIN)

CWE-1154の実際のページは、こちらです。
CWE-1154
CERT Cのルールと結びついていると、CWEを身近に感じられるかもしれません。

筆者紹介

浅野 昌尚(あさの まさなお)

ガイオ・テクノロジー株式会社

開発1部 QTXグループ

1980年代から30年以上にわたり汎用構造のCコンパイラ開発に従事し、その間に8ビットマイコンからRISC・VLIW・画像処理プロセッサまで、さまざまなCPU向けのクロスCコンパイラを開発。

人気のコラム

最新のコラム