体系的に学ぶ脆弱性

     

概要


サイバー攻撃において、攻撃者が用いる手法の1つに「脆弱性の悪用」がある。
制御システムにおいても、ノイマン型のコンピュータを使用している以上、制御システムに対する攻撃手法はITシステム同じであり、脆弱性が悪用される手法も同じである。

ここでは、サイバー攻撃の発端となることが多い「脆弱性」について体系的に解説する。

用語としては脆弱性と一括りにされることが多いが、この脆弱性には非常に多くの種類が存在しており、ハードウェアからソフトウェアまで範囲も多岐に広がる。最近では、セキュリティ対策の重要性が認知されつつあり、新規開発したシステムや運用しているシステムに対して、定期的に脆弱性診断(システムに脆弱性がないか検査すること)することが多くなっている。これは非常によい傾向ではあるが、システム開発者がセキュリティや脆弱性に十分に詳しいとは限らない。

例えば、2017年に、「MS17-010 *1」という脆弱性により、世界中でマルウェア(WannaCry *2)に感染する等の被害生じたが、これがどのような脆弱性であり、コンピュータ上のどこの領域でどのような影響を及ぼしているかを理解できていただろうか。脆弱性の解析を業務としているセキュリティの専門家以外は、脆弱性の細部まで理解する必要はないが、脆弱性への適切な対応を取るためにも、脆弱性自体がコンピュータ上のどこの領域で発生しているかやその影響度を理解しておくことは重要である。脆弱性には、CVSS *3 という脆弱性の脅威レベルを評価する基準値も設定されており非常に有用であるが、自分なりに脆弱性の種別や影響度を解釈し、評価できるようになることも重要である。

脆弱性を正しく理解するには、コンピュータの動作の仕組みを理解する必要があるが、ここではコンピュータの動作の仕組みについては詳しく説明はしない(既存の洗練された文献を参照してください)。ただし、コンピュータの動作の仕組みを詳しく理解していなくても、本記事を通して、脆弱性を体系的に理解できるようにはなると思っている(これはよく分からん!!とかあれば、ご連絡ください)。

なお、脆弱性の「脆」という感じは、常用漢字ではないため、JIS Z 8301:2011 *4 の規格に沿った書き方だと、「ぜい」とひらがなで記述されることもあるが、最近では「脆弱性」と漢字の方がよく見るので、文書の中で統一さえしていれば問題ないように思える。本文章では、「脆弱性」と漢字を用いる。

     

脆弱性とは


JIS Q 27000:2014 *5 では、脆弱性を「一つ以上の脅威によって付け込まれる可能性のある,資産又は管理策の弱点。」と定義されている。
少し具体的に説明すると、コンピュータ上における脆弱性とは大きく2つあり、

  • ハードウェアやソフトウェアの設計・実装の不備(バグともいう)が原因となり、セキュリティが脅かされる欠陥
  • システムの運用・管理上の問題点により、セキュリティが脅かされる欠陥

のことである。

攻撃者がこれらの脆弱性を悪用することで、コンピュータへの不正アクセス、コンピュータの停止/破壊、マルウェアの感染、情報漏洩などを行えてしまうという危険性がある。

以降では、コンピュータの仕組みを踏まえつつ、上記の前者の脆弱性について体系的に解説していく。
(※脆弱性の細かい仕組みまでは説明しません。)

     

脆弱性の発生個所


ご存じの方がほとんどだと思うが、コンピュータの構成は、この概略図のように大きくソフトウェアとハードウェアに分かれている。
(※ここでのアプリとは、我々がよく使うブラウザやOfficeソフト、または独自で作成したプログラムのことを指します。)

また、図のように、コンピュータ上における脆弱性は、ハードウェアとソフトウェアのすべての個所で存在している。
当然ではあるが、それぞれの層ごとに、脆弱性の修正者も変わる(脆弱性の修正は、そのプログラムの著作権限を持っている組織や人物が行うことがほとんどである)。
          

脆弱性の箇所 修正者
アプリの脆弱性 アプリ作成者が対応。
フレームワーク、ライブラリの脆弱性 フレームワーク、ライブラリの作成者が対応。
プログラミング言語自体の脆弱性の対応なども含む。
OS の脆弱性 OS 作成者が対応。
ハードウェアの脆弱性 ハードウェア作成者が対応。

     
ただし、スキルのある人だと、修正者がパッチを出す前に自分でパッチを書いて暫定対応するケースもある。

       

ハードウェアの脆弱性


本記事でのハードウェアは、コンピュータにおいて物理的に実体のあるものとする(CPU、メモリ、HDD/SSD、NIC など)。
BIOS や組み込み機器などのファームウェアは、本記事ではソフトウェアに分類するためハードウェアには含めない(ROM に書き込まれたソフトウェアという認識)。

ハードウェアの脆弱性は、ハードウェアの設計/実装上の問題によるものが原因であることが多い。
例えば、CPU の実装上の脆弱性(Spectee、Meltdown など)、メモリの脆弱性(Rowhammer Bug、RAWBleed Bug など)、漏洩電磁波の脆弱性などがある。

CPU はトランジスタの集合体であり、電気信号のオン/オフにより演算を行い、目的の処理を実行する。この処理を高速化するために集積回路を改良し、パイプライン、スーパスカラ、VLIW(Very Long Instruction Word)、ハイパースレッディング等、様々な技術が導入されている。
CPU の詳細な説明については、下記の参考文献を参照されたい。

参考文献 リンク
コンピュータの基本構成と動作原理〜知識編 *6
How transistors work - Gokul J. Krishnan *7
集積回路を使わずにトランジスタだけでコンピュータを自作するとこうなる *8
CPUの高速化技術 *9, *10

     

これらの集積回路の改良により高速に処理を行えるようになったが、命令を先読みする処理により、本来実行されるはずのない処理を実行させてしまったり、参照できないはずのメモリ領域が参照可能となる。

このような高速化に伴う集積回路の実装上の欠陥が CPU の主な脆弱性の原因の1つである。
その他の CPU の脆弱性も同じような仕組みで発生しているものが多い。

脆弱性 リンク
Spectre と Meltdown *11
Foreshadow *12
Portsmash *13
SPOILER *14
ZombieLoad *15

     

メモリの脆弱性や漏洩電磁波においても、ハードウェアの物理的な性質上の欠陥(バグ)などを悪用し、攻撃につなげている。

脆弱性 リンク
Rowhammer 攻撃 *16
RAMBleed 攻撃 *17
テンペスト攻撃 *18

     

このように、ハードウェアの脆弱性は、そもそもの製品の実装上の欠陥や物理的な欠陥によるものであるため、ユーザ側での脆弱性への対応が難しいという特徴がある。

     

ソフトウェアの脆弱性


本記事でのソフトウェアは、すべて何らのプログラミング言語でプログラムとして作成されており、最終的には CPU 上で実行されるものを指す。

このソフトウェアの脆弱性の種類は多岐に渡り、脆弱性を管理する組織である MITRE では、CWE(Common Weakness Enumeration)*19という方法で脆弱性を分類している。
CWE には、2019/7月時点において、1140 種類の脆弱性を定義している *20

IT・OT の世界においても、問題となる脆弱性の多くがこのソフトウェアの脆弱性である。
ソフトウェアの脆弱性の原因を端的に説明すると、プログラムの設計ミスやコーディングミスによるものである。

セキュリティ対策が強化されたプログラミング言語等も存在しているが、そうでないプログラミング言語で作成されたプログラムも数多く存在するため、未だに多くの脆弱性が日々発見されている。
文献 *21 によると、主なプログラミング言語は 2019/7 月時点で約260種類存在している。

なぜこれほどの数のプログラミング言語が存在するかというと、それぞれのプログラミング言語の開発者が既存プログラミング言語に不満を持ち、より簡単に(抽象度高く)、より高速に、よりセキュアに、という想いから、新しいプログラミング言語が登場したとされる。
プログラミング言語自体にも様々な使いやすいフレームワークやライブラリがあるとの考えは同じである。

さて、様々あるプログラミング言語から作成されたプログラムも最終的には CPU で機械語として解釈され、目的の処理を行う。
ここで、プログラミング言語ごとに生成されたプログラムの実行方式が異なるということを理解していただきたい。

このプログラム実行方式には、大きく下記の種類が存在し、プログラミング言語ごとに専用のプログラム(コンパイラやインタープリタなどの言語処理系と呼ばれるプログラム)が存在する。
     

実行方式 主なプログラミング言語 概要
コンパイル方式 C/C++、Rust、Go 事前に、コンパイラでプログラミング言語から CPU が実行できる機械語に変換し、
実行時はプログラムをそのままメモリに展開して実行する方式。
プログラミング言語自体にメモリを操作できる関数等が用意されていることが多い。
インタープリタ方式 Ruby、Python、JavaScript 事前の処理はせず、実行時にプログラミング言語を
インタープリタが逐次機械語に変換し、実行する方式。
ハイブリッド方式 Java、C#、VB.Net 実行速度と移植性を高めるため、コンパイラ方式とインタープリタ方式を組み合わせた方式。
事前にコンパイラで独自の機械語に近い中間言語に変換し、実行時にインタープリタや
JIT コンパイラで機械語に変換する。

     
この言語処理系と呼ばれるプログラムにより、プログラミング言語と CPU やメモリのようなハードウェアとのセマンティックギャップを解消している。
続いて、プログラム実行方式の違いにより、発生する脆弱性の違いについて示す。
     

実行方式 主な脆弱性の特徴
コンパイル方式 直接メモリ上に展開されるため、予期せぬメモリアドレスを参照したり、メモリを改ざんする脆弱性が発生する。
インタープリタ方式
ハイブリッド方式
自身のプログラミング言語で行える範疇内で予期せぬ処理を行える脆弱性が発生する。
コンパイル方式のように、直接メモリ自体に影響するケースはほとんどない(言語処理系に脆弱性がある場合を除く)。

     
インタープリタ自体は、コンパイル方式で作成されたプログラムであることが多いため(例:Python の 言語処理系である CPython は C言語で作成されているなど)、インタープリタ自体の脆弱性が発見された場合は、インタープリタ方式の言語でメモリ操作できる場合もある(間接的にヒープ領域のメモリを確保・解放できる JavaScript を用いて、ブラウザに存在する脆弱性を悪用する攻撃など *22)。

よく混同するのが、「Java、Python、Ruby の脆弱性が報告」といった記事等を見るケースがあるが、プログラミング言語自体に脆弱性がある訳ではなく、多くの場合が言語処理系の脆弱性のことを指しているので、プログラミング言語の設計そのものが危険だという訳ではないので、その際は内容をよく確認されたい。

           

おわりに


本記事を通して、脆弱性はハードウェアからアプリまですべての層において存在していることを理解していただけたであろうか。
ソフトウェアの脆弱性については、実行方式の違いにより、発生する脆弱性が異なるという特徴もあるため、自身で開発するプログラムの特性を理解しておくことが必要である。

脆弱性への対応では、自組織におけるソフトウェアがどのようなハードウェア、OS、ライブラリ、フレームワーク、アプリなどが導入して動作しているかを適切に把握しておくことが重要である。
今後は、脆弱性への対応が必要となった際に、その脆弱性はどこの層でどの程度影響が出るのかを自分なりに解釈して対応できるようになっていただければと思う。

     

参考文献


[1] マイクロソフト セキュリティ情報 MS17-010 - 緊急,https://docs.microsoft.com/ja-jp/security-updates/securitybulletins/2017/ms17-010
[2] 「WannaCry」騒動とは何だったのか? 感染理由とその対策 ,https://www.itmedia.co.jp/news/articles/1705/17/news106.html
[3] 共通脆弱性評価システムCVSS概説,https://www.ipa.go.jp/security/vuln/CVSS.html
[4] JIS Z 8301:2011,https://kikakurui.com/z8/Z8301-2011-01.html
[5] JIS Q 27000:2014,https://kikakurui.com/q/Q27000-2014-01.html
[6] コンピュータの基本構成と動作原理〜知識編,https://qiita.com/zacky1972/items/ef4486e8a6d95edb68fd
[7] How transistors work - Gokul J. Krishnan,https://www.youtube.com/watch?v=WhNyURBiJcU
[8] 集積回路を使わずにトランジスタだけでコンピュータを自作するとこうなる,https://gigazine.net/news/20150731-fulltr-11-super-l/
[9] [5]CPUの高速化技術,https://www.net.itc.nagoya-u.ac.jp/~shimada/old_lecture/CSC/slide/chap03slide2.pdf
[10] CPUの高速化技術,http://www.kogures.com/hitoshi/webtext/hs-cpu-high/index.html
[11] CPUの脆弱性「Spectre(スペクター)」と「Meltdown(メルトダウン)」,https://www.fujitsu.com/jp/solutions/business-technology/security/secure/column/201802-1/
[12] IntelのCPUで新たに発見された脆弱性「Foreshadow」の解説ムービーをRedHatが公開中,https://gigazine.net/news/20180815-l1-terminal-fault/
[13] IntelのCPUで新たな脆弱性「Portsmash」が発見される、ハイパースレッディングに関する2つ目の脆弱性,https://gigazine.net/news/20181105-intel-cpu-hyperthreading-exploit-portsmash/
[14] Intel製CPUに見つかった新たな脆弱性「SPOILER」はまたもシリコンレベルでの再設計による修正が必要,https://gigazine.net/news/20190306-intel-cpu-vulnerability-spoiler/
[15] Intel CPUの脆弱性"ZombieLoad"の論文を読んでみる,http://msyksphinz.hatenablog.com/entry/2019/05/19/040000
[16] Rowhammer攻撃を解説,https://qiita.com/IK_PE/items/59b6b6125999b18a56f0
[17] メモリの脆弱性を利用してデータを盗み読む「RAMBleed攻撃」が発見される,https://gigazine.net/news/20190613-rambleed-attack/
[18] テンペスト技術とは?遠隔で不正に情報を傍受する技術への対策について
https://cybersecurity-jp.com/security-measures/27685
[19] NVD CWE Slice,https://nvd.nist.gov/vuln/categories#cwes
[20] CWE VIEW: Comprehensive CWE Dictionary,https://cwe.mitre.org/data/definitions/2000.html
[21] TIOBE Programming Community Index Definition,https://www.tiobe.com/tiobe-index/programming-languages-definition/
[22] Use After Freeとヒープスプレー (1/3),https://www.atmarkit.co.jp/ait/articles/1409/22/news010.html

登録日時2019-07-15 00:00:35 +0900
更新日時2019-09-29 19:52:54 +0900