システムにおける脆弱性とは?その対策と管理方法について
ニュースやテレビでよく使われる「脆弱性」というワードについて、情報セキュリティに関する話題とともに使われることが多いため、「セキュリティ」に関する言葉であるということはなんとなく感じつつも、しっかりと意味を理解・説明される機会が少ないかと思います。
最近でも不正アクセスに関するニュースで「修正パッチが公開される前の脆弱性を利用したゼロデイ攻撃」なんていう言葉が出ていましたね。
ということで、この記事ではサイバーセキュリティ/サイバー攻撃における「脆弱性」という言葉の意味と代表的な攻撃方法、そして脆弱性対策/管理の方法についてご紹介いたします。
脆弱性とは
サイバーセキュリティにおける「脆弱性」とはシステム/ソフトウェア上で(アプリケーション、ミドルウェア、OS、ネットワークなどシステムを構成するすべて)、管理者の意図しない動作やインシデント、そして外部からの攻撃につながる可能性のある“セキュリティ上の弱点”のことです。
脆弱性は、サーバーにもクライアントにも存在し「セキュリティホール」という言葉で呼ばれることもあります。
※厳密には「セキュリティホール」はプログラムの設計や実装時のミスなどにより、サービスやソフトウェアにセキュリティ上の不具合(バグ)が発生する場合に限定して使用される用語です。
脆弱性はなぜ生まれるのか
脆弱性はなぜ生まれるのでしょうか。
情報システムは非常に複雑で、その上で大量のプログラムにより構成されています。
そのため、不具合や設計/実装上のミスが含まれることがあります。
攻撃者はこの脆弱性を突くことで、システムの内部に不正アクセスしたり、コンピューターウィルスを届けるといったサイバー攻撃が可能となります。
また、ミスが生じていない場合でも外部から攻撃可能な箇所が存在すればそれも「脆弱性」となります。
「脆弱性」はこのように幅広い意味で使用され、またシステムのあらゆる部分に存在する可能性を秘めています。
特にシステムをインターネット上からあらゆる人間に利用可能にしているWebアプリケーションやWebサービスなどは脆弱性の脅威にさらされやすいといえます。
こういった脆弱性は情報システムを構成するのに不可欠といえるOSやミドルウェア、OSS(オープンソースソフトウェア)などにも存在します。
そして、現代のプログラムは複雑であり、また攻撃方法もさまざまなため、日々、新たな脆弱性が発見されるのです。
脆弱性に対してどうやって対応するのか
それでは、あらゆる場所に存在する脆弱性は対処されることなく放置されているのでしょうか。
もちろん、開発者や開発メーカーはこのような脆弱性が発見されると、すぐに解決するためのアップデートを行い、セキュリティパッチ(修正プログラム)を提供しています。
このセキュリティパッチをシステムに適用することで、脆弱性に対応、つまりサイバー攻撃に利用されることを防ぐことができます。
しかしながら、提供されたセキュリティパッチを自身のシステムやソフトウェアに適用するまでにはいくつかのハードルが存在します。
たとえば脆弱性は続々と発見されるため、その脆弱性が自身のシステムに存在するかを確認することに多大な労力がかかります。
また、脆弱性には攻撃に利用される可能性などをしめす深刻度というものがありますが、それらを一つ一つ手動で把握することも困難です。
このような理由で脆弱性は対策が実施されず、放置されることも珍しくありません。
脆弱性に対して、完璧な対応を実施することは難しく、またこの瞬間にも新たな脆弱性が続々と発見されています。
このような脆弱性への対策、セキュリティ対策が間に合わなくなり、最終的にサイバー攻撃による被害を受け、重要情報や個人情報の流出や不正アクセスなどが生じたといった事例は世界中で発生しています。
代表的な攻撃方法
脆弱性を利用した代表的な攻撃方法とは具体的にどのようなものでしょうか。
いくつかの代表的な攻撃手法を以下に記載しました。
1. SQLインジェクション
概要:データベースを呼び出す(操作)するための命令文(SQL)を改ざんし、意図しない操作や悪意のある操作を行うことです。たとえばお問い合わせフォームにSQL文を入力し、データベースのユーザー情報にアクセスするなどが挙げられます。
被害例:データベースへの不正アクセス、盗難、改ざんなど
2. クロスサイト・スクリプティング(XSS)
概要:攻撃者が作った不正なスクリプトをリンクなどに埋め込むことで、ユーザーにWebブラウザ上で実行させる攻撃手法です。たとえばWebサービス上に不正なリンクを埋め込み、そのリンクを踏んだユーザーの情報を盗むなどが挙げられます。
※そのような攻撃が可能になっているWebサービスの状況などを指すこともあります。
3. HTTPヘッダ・インジェクション
概要:ユーザーがWebサービスなどを利用する際にWebサーバー側に送信する通信(HTTPリクエスト)に、不正な文字列を埋め込むことで、返信を意図しない/悪意のある通信に改ざんすることです。
たとえばユーザーを意図しないWebサイトに移動させたり、不正なcookieをブラウザにセットします。
4. バッファオーバーフロー
概要:システムがあらかじめ確保しているバッファ領域(メモリ上のデータを格納する領域)に領域以上の大きなサイズのデータを送りつけることでバッファ領域を溢れ(フロー)させ、予期せぬ動作を発生させたりシステムの操作権を奪う攻撃です。
Webサービス上の入力フォームに大量の文字を入力するなどが代表的な方法として挙げられます。
脆弱性対策/管理の方法について
このような脆弱性に対して現実的にどのような対策や管理方法が挙げられるでしょうか。
1. 脆弱性の情報を収集する
対処方法としてはなによりも効率的かつ徹底した脆弱性情報の収集が必要となります。
公開された脆弱性に関する深刻度や危険性に関する情報は脆弱性に関するデータベースや製品ベンダーから公表されます。
その情報を収集し、自システムに該当するものが存在するかを突き合わせ、判断することが必要となります。
この際に自システムが利用している各OS、ミドルウェア、OSS、プログラミング言語、ライブラリ、フレームワークなどをすべて正確に把握していることも前提となります。
2. 脆弱性の危険度や深刻度を確認する
脆弱性は攻撃を受ける可能性などをはじめ、一つ一つ危険度や深刻度などのレベルが異なります。
すべての脆弱性に即座に対応できることが理想ですが、セキュリティパッチの適用などは検証やシステムのメンテナンスなどが必要となるため、現実的とは言えません。
そのため、攻撃される危険度や具体的な攻撃方法やエクスプロイトコード(PoC)が確認されているものから優先的に対応していくことが重要となります。
脆弱性の深刻度は世界でスタンダードとなっている共通脆弱性評価システムCVSS(Common Vulnerability Scoring System)により評価されます。
この評価は深刻度で点数がつけられ、レベル分けされているため、この指標を確認することで、攻撃を受けるリスクの高さなどがある程度判断可能です。
また、危険度の高い脆弱性は対応を見送った場合、攻撃可能な状態のまま放置されるため、対応までの時間が長ければ長いほど、サイバー攻撃の被害に遭うリスクは高くなります。
さいごに
脆弱性は日々新たに発見されるため、システムの開発時には存在していなくても、運用開始後に発見される脆弱性も珍しくありません。
攻撃者は日々新たな脆弱性をキャッチし、攻撃の機会を伺っています。
そのため、脆弱性対策に終わりはありません。
しかしながら、脆弱性を正しく理解し、適切な対応を行うことで、脆弱性によって引き起こされるサイバー攻撃のリスクを抑えることは可能です。
脆弱性対策や管理を効率的に行うことで、システム/プロダクト開発にリソースを集中することも可能になるでしょう。
また脆弱性対策ツールや脆弱性管理ツールなどのサービスも提供されているため、それらの利用も検討に入れてもいいかもしれません。