2016年4月19日掲載
サイバー攻撃対策はもはや経営課題であり、全社で取り組むべき課題でもあります。そのため誰もがサイバー攻撃に関するポイントを押さえておく必要があると言えます。サイバー攻撃のパターンには大きく、プログラムのぜい弱性につけこむ方法と、巧妙な手口でだます方法があります。今回はプログラムのぜい弱性につけこむ方法を見ていきましょう。
埼玉県にある従業員約280人のEMS(Electronics Manufacturing Service)企業、YMC電子工業(仮名、以下YMC)。同社の顧問ITコンサルタントである美咲いずみ(仮名)は、同社の山田勝(仮名)社長と山田昭(仮名)CIO兼システム部長の要請で、情報セキュリティに関する講義を開始したところだ。
「まず『ぜい弱性』という言葉について考えてみましょう。『情報セキュリティに関するぜい弱性がある』と指摘されたとしたら、どういうことがあったと考えますか? 運用担当の宮下さん、いかがですか?」といずみが質問した。
宮下浩二(仮名)が答える。「えーと。セキュリティパッチを充てていない(ベンダーが発行するセキュリティ修正プログラムを適用していない)というような運用担当者の不手際だとか、設定しているパスワードが容易に見破れるとか、コンピュータールームへの入退出が誰でも可能とか……」
「そうですね。具体例に挙げてくださったように、『ぜい弱性』というのはかなり広い概念です。情報セキュリティ対策としては、これらすべてのぜい弱性を問題にする必要があります。ただし、今回の講座では、主にネットからのサイバー攻撃について考えます。このときに特に問題になるのが『プログラムのぜい弱性』です」
「『セキュリティホール』という言葉がありますが、それと同じですか?」と運用委託先の伊達システムズ(仮名)から常駐している高橋正弘(仮名)が質問した。
「はい。そう思っていただいて構いません。悪意のある人間がそれを利用して、他のプログラムを操作したり、データを改ざんしたりできるようなプログラムの欠陥を、プログラムのぜい弱性やセキュリティホールと呼びます。
では、セキュリティホールとは具体的にどんなものか分かりますか?」
誰も答えないのでいずみが続ける。「それでは代表的なセキュリティホールである『バッファオーバーフロー』を紹介します(図1)。セキュリティホールのイメージがつかめると思います」
「まず『バッファ』とは何か? 1つのプログラムは、実行命令を実行順に並べたコード領域、計算や操作に使うデータを格納するためのヒープ、プログラムそのものの実行に必要なデータを格納するスタックの3つで構成されています。このうちヒープとスタックを合わせてバッファと呼びます。山田社長、ちょっと専門的ですが、よろしいでしょうか?」
「『プログラム』はさすがに分かるよ。それが3つの領域に分かれているが、何らかのデータが格納される領域2つを併せてバッファと言うことが分かっていればいいのかな?」
「はい。それで十分です」
いずみは社長に対して、ニコッとほほえんだ。
「さて、プログラムはOSから呼び出されて実行されますが、さらに子どものプログラムを呼び出して何らかの処理をさせるという階層型の構造を持っているのが普通です。呼び出されたプログラムは処理が終了したら、呼び出しを実行した命令の次の命令が存在するアドレスに戻らなければいけません。そのアドレスは呼び出しを実行した親プログラムしか知らないので、子プログラムを呼び出す際に教えることになっています。子プログラムは、スタック内にある戻り先アドレスを格納するエリアにそのアドレスをコピーして、終了時にそのアドレスに戻るという命令(リターン命令)を実行します。これが正常な流れです」
ここでコード領域、ヒープ、スタックの3つの領域が出てきたが、すべて物理的には連続したメモリ領域の中にあり、それぞれの専用領域というものはない。なので、本来はヒープとして使用されている領域に実行命令をコピーし、何らかの方法でそこにジャンプすれば、その命令を実行することができるのである。
言い換えると、ヒープに悪意のあるコードを埋め込み、それを実行することができれば、システムを破壊したり、データを改ざんしたりすることが可能になるということだ。では、どうすればそのようなことが可能なのだろうか。
入力画面をイメージしてほしい。入力エリアに入力された文字列はバッファに格納される。なので、入力エリアの長さよりも長いデータを入力することができれば、あふれた(オーバーフロー)した分をバッファに格納することができることになる。
実際にこのようなことが可能な「欠陥」のあるプログラムが存在している。データの入出力は開発言語が提供してくれるライブラリを利用して実行することが普通だが、そのライブラリの中に入力エリアの長さを考慮せずに、いくらでもデータを入力できる機能が存在していることがある。プログラマがその機能を利用すると、「バッファオーバーフロー」と呼ばれるセキュリティホールを持つプログラムができあがってしまう。
バッファオーバーフローのぜい弱性を持つプログラムに対しては、入力機能を利用して、バッファに悪意のあるプログラムを埋め込み、戻り先アドレスをこのプログラムの先頭にすれば、サイバー攻撃が可能となる。
いずみが社長に対し、難しくなかったかを確認したところ、「細かいところは分からないが、不適切なライブラリ機能を使用すると、外部からプログラムの書き換えが可能になり、それを使って悪意のあるプログラムを実行できるという理解でいいのかな?」という返答があった。
「さすがです。そこまで理解していただければ十分です」といずみは社長を称えた。
「しかし、そんなに知られているセキュリティホールなら、もう世の中に存在しないのでは?」と山田CIOが突っ込む。
「それが残念ながら、まだまだ世の中にはバッファオーバーフローは絶えません。古いプログラムにも残っていますし、数は減ってきましたが、セキュリティを考慮しない開発標準を使っていたり、開発標準がなくプログラマ任せだったりする会社の開発したプログラムだと最新のものでも存在します。啓発と意識改革が十分ではないのです」
「そうか。困ったことだね。いや。我々もよく知らなかったのだから、セキュリティホールのあるプログラムを開発したり導入したりしている可能性は十分にあるわけだ」。山田CIOは沈痛な面持ちでそう言った。
「啓発と意識改革が必要という意味では、カミンスキー攻撃という手法についても知っておいてください。これはDNSという機能のぜい弱性を悪用したサイバー攻撃です」
DNS(Domain Name Service)とは、ホスト名(正確にはドメイン名)を渡すとIPアドレスを教えてくれる機能である。DNSの機能を実現するサーバーには、キャッシュDNSサーバーと権威DNSサーバーの2種類がある。
一般の企業では、社内にキャッシュDNSサーバーを設置し、通常の問い合わせに対してはキャッシュDNSサーバーがIPアドレスを返す。キャッシュDNSサーバーに問い合わせされたホスト名がないときにだけ、外部に存在する権威DNSサーバーに問い合わせるのである。
権威DNSサーバーに問い合わせをしているときに、一瞬早く誘導したいサイトのIPアドレスを返して、以後なりすましたサーバーと通信させるサイバー攻撃をDNSキャッシュポイズニングと言う。
これに対しては有効な対策がすぐに考案されたが、2008年にセキュリティの専門家であるカミンスキー博士がさらに巧妙な方法を考案した。この「改良」型DNSキャッシュポイズニングをカミンスキー攻撃と呼ぶ。
カミンスキー攻撃に対しては、DNSのポート番号をランダムに変化させるという方法が有効で、カミングスキー攻撃発表後のDNSサーバーソフト(BIND)にはその機能が標準装備されている。
「だったら、もうカミンスキー攻撃は怖くないんじゃないの?」と木村美佐子(仮名)主任が指摘すると、いずみは「それが残念なことに、それ以前の古いバージョンのBINDが今でも世界中で使われているのです。ですので、カミンスキー攻撃もまだまだ有効です。啓発と意識改革が必要というのは、このためです」と答えた。
「Webサイトが改ざんされたり、データが盗まれたり破壊されたりすることがよくあるけれど、あれはどうやってやっているのかな?」と真鍋勇(仮名)課長が聞く。
「あれも基本的にはプログラムのぜい弱性を利用したものです。主な手口は、クロスサイトスクリプティング(XSS)とSQLインジェクションと呼ばれるもので、どちらもWebアプリケーションが入力データを適切に処理していないということによるものです」
XSSは、入力エリアにコマンドが入力されると、そのコマンドがWebアプリケーションの内部で実行されてしまうという欠陥につけこんだ攻撃だ。これにより、危険なコンテンツがWebブラウザ側に送り込まれたり、特別な権限を持ったユーザーになりすましたり、セッション情報(cookie)を奪って悪意のあるサーバーに誘導したりする攻撃が可能になる。
特別な権限を持つユーザーになりすますことができれば、Webコンテンツを改ざんすることなどが簡単にできるようになる。
SQLインジェクションは、入力エリアにSQLが入力されると、それが実行されてしまうという欠陥につけこんだ攻撃だ。これにより、個人情報など重要データを盗んだり、データベースを破壊・改ざんしたりする攻撃が可能になる。
どちらも、入力データを適切に処理して、コマンドやSQLの実行ができないようにすれば防ぐことができる。だが、サーバー側アプリケーションの欠陥なので、ユーザーが取れる防御策がほとんどないことが大きな問題である。
「この対策にも、セキュリティを考慮した、プログラム開発の標準化が必要なようね」と木村主任が意見を述べる。いずみは大きく頷いた。
いずみがさらに続ける。「中にはセキュリティホールと言えるか微妙なものもありますが、インターネット上のサービスの仕様を利用することが多いサイバー攻撃がDoS攻撃やDDoS攻撃です」
DoS(Denial of Service)攻撃は、「サービス妨害攻撃」と訳すことが多い。またDDoS(Distributed Denial of Service)攻撃は、「分散型サービス妨害攻撃」あるいは「分散型DoS攻撃」と訳すことが多い。
「DoS攻撃は、攻撃対象のサーバーに大量のデータを何度も送りつけることで、サーバーの負荷を極大化し、業務処理が実質上行えなくする攻撃です。かなり昔には、pingというネットワークの疎通を確認するリクエストを大量に送るという攻撃もありました。
このように単純にデータやリクエストを送りつけても成立しますが、それよりも攻撃対象になりすまして、インターネット上のサービスにリクエストして、攻撃対象にレスポンスを送らせるというやり方のほうが効率的です。これをリフレクション(反射)攻撃と言います」
「どんなサービスが使われるのですか?」と新人の樋口優子(仮名)が質問した。
「あらゆるサービスが使用可能ですが、リクエストと比べてレスポンスのデータサイズがかなり大きくなるサービスを悪用するのが主流です。先ほど話があったDNSがそうですし、NTP(Network Time Protocol)という時刻合わせのサービスもよく使われます」
いずみが続ける。「単純なDoS攻撃だと、一定時間に大量のデータを何度も送ってくる通信相手をブロックするなどの対策で防ぐことができます。そこで、編み出されたのがDDoS攻撃です。これは、複数のサーバーを『踏み台』にして攻撃対象に大量のデータを送信するという攻撃法です(図2)」
「2013年にはDNSリフレクションを使用した大規模なDDoS攻撃が発生しました。翌2014年にはNTPリフレクションによるさらに大規模なDDoS攻撃もありました。
DNSリフレクションであれば、オープンリゾルバという外部からのリクエストに応答してしまうDNSキャッシュサーバーが踏み台になりました。一般の企業であればオープンリゾルバは本来不要ですから、BINDの設定を変更して外部からのリクエストに応答しないようにしておく必要があります。
NTPリフレクションも同様で、踏み台にされない設定をしておく必要があります。
このような対策についてはIPA(独立行政法人 情報処理推進機構)が情報公開して注意喚起しているのですが、まだまだ踏み台にされる可能性のあるサーバーやPCが大量に存在しているのが現実です」と、いずみは残念そうに言う。
真鍋課長が質問する。「今の話は、踏み台にされないための対策だが、DDoS攻撃を避けるための対策はないのかな?」
「有効な対策がないというのが現実です。早期に検知して、被害が広がらないうちにブロックするしかありませんが、攻撃相手のスキルが高いと防戦一方になります。そのときには、業務継続計画(BCP)実現のために遠隔地に用意したスタンバイシステムに切り替えるしかないかもしれません。だからこそ、各企業が踏み台にならない努力をするべきなのです」
「美咲さん。完全な対策はないとしても、我々ができるベストの対策は何なのだろう?」と山田社長が聞く。
「はい。まずベンダーから配布されるセキュリティパッチについては、できるだけ速やかに適用することです。また、IPAからはセキュリティに関する勧告が随時発行されますので、それにも速やかに従うことです」
「宮下君。我が社はどうなんだい?」
「はい。ベンダーが発行するセキュリティパッチについては、運用ツールで自動的に全サーバー、全PCに適用する仕組みを作っていますので、こちらは問題ないと思います。IPAの勧告については、最新のものは見ていますが、過去のものは分かりません。実はオープンリゾルバという言葉自体、今日初めて知りました。過去の勧告もすべて調べて、不足があれば早急に対応します」
「うん。過ぎてしまったことは仕方がないが、このように勉強すればよりベストに近づけるわけだ。講義してもらった甲斐がありそうだよ」
山田社長は大いに手応えを感じているようだ。
まとめ
日立システムズは、システムのコンサルティングから構築、導入、運用、そして保守まで、ITライフサイクルの全領域をカバーした真のワンストップサービスを提供します。