バッファオーバーフロー攻撃とは
コンピュータはそれぞれの装置やソフトウェアによって処理速度が異なり、データのキャパシティも異なります。その処理速度の差を補うためにデータを一時的に蓄えておく記憶装置があり、その脆弱性を悪用するのが今回紹介する「バッファオーバーフロー攻撃」です。これは開発側が特に注意しなければいけない内容ではありますが、利用者側も仕組みをしっかりと知っておくことで迅速な対応をすることが可能になります。
目次
バッファオーバーフロー
バッファオーバーフローとは、一時的にデータを保存する領域の役割を果たすバッファに、処理可能なデータ量以上のデータを送信し、バッファの許容量を超えて溢れさせることで意図しない作動を引き起こさせる攻撃手法です。
バッファとは
バッファとは、複数の主体がデータを受け渡しする際、処理速度や転送速度の差を補うために一時的にデータを蓄えておく記憶場所・保存領域のことです。
RAMといわれる種類のメモリがあります。これは半導体記憶素子を用いてコンピュータの動作に必要なデータを記憶する主記憶装置の一種です。RAMは読み書きが得意で、装置内のどこに記録されても等しい時間でデータを読み書きできる性質と、電源を切るとデータが消える揮発性という特徴を持っています。このRAMといわれるメモリ上に確保する領域をバッファ領域と呼びます。バッファ領域はCPUなどいろいろな種類の装置や回路のデータ処理速度や転送速度の差を補うためのメモリで、データの入出力処理の際に調整をして遅延やデータの取りこぼしがないように一時的にデータを保存しておくためのものです。
これはプリンタとコンピュータの関係を想像すると分かりやすいかもしれません。プリンタでデータを印刷する際、プリンタの処理速度はコンピュータからプリンタへのデータ転送速度より圧倒的に遅いため、プリンタはコンピュータから送られてきた処理データを一時的に貯めておき、プリント処理に合わせて貯めておいたデータを読み込んでいきます。
攻撃の種類
バッファオーバーフロー攻撃はバッファ領域のうちどこを攻撃のターゲットとするかにより、主に以下の3種類に分けることができます。
- スタック領域型
- ヒープ領域型
- 静的領域型
スタック領域型
スタック領域とは、メモリ領域に展開していて、サブルーチン(特定の機能や処理を持つプログラムの集合体で、別の所から呼び出して実行できるようにしたもの)呼び出しのための情報や、リターンアドレス(サブルーチンの処理終了後に次に実行すべきプログラムコードのアドレス)など、プログラム実行に必要な情報を格納する領域のことです。あるプログラムが内部的にデータを保存しておく必要がある時に利用されます。スタック領域は、格納した順番とは逆の順序で解放していくのが特徴です。
スタックのサイズは有限であるため、スタック領域に確保されたバッファに対してその容量を上回るサイズのデータを入力すると、オーバーフローを起こし、スタック領域内のリターンアドレスなどのデータを上書きしてしまい、正しい処理が行われなくなります。
この脆弱性を悪用して攻撃者がリターンアドレスを書き換えた場合、実行中のプログラムがクラッシュする、管理者権限が奪われる、侵入させたマルウェアを呼び出すなどの被害につながってしまいます。
ヒープ領域型
スタック領域に対して、ヒープ領域にはデータの格納や取り出しに決まった順序がありません。プログラムの実行時に必要に応じてデータ容量を確保し、不要になったら解放することができます。
計算や操作などのためのデータを格納する領域で、プログラムの実行時、OSからソフトウェアに対して一定量のヒープ領域が与えられます。その際、領域の管理には、各要素が自分の「次」と「前」へのリンクを持ち両方向へ要素を辿ることができる、双方向リストという構造が用いられています。その双方向リストの仕組みを悪用してオーバーフローを起こしてリターンアドレスなどを書き換えるのです。ヒープ領域のオーバーフローでは、任意のアドレスに対して、任意の4バイトでアドレスを書き換えますが、そのアドレスが書き込み不可のメモリ領域を指していた場合、アクセスバイオレーションが発生し、プログラムは異常終了してしまいます。そのため、ヒープオーバーフローを成功させるためには一定の条件が必要で、スタックオーバーフローの脆弱性に比べ、この脆弱性を悪用するのは難しいと言えます。
静的領域型
静的領域は、定数やグローバル変数のように多数の関数などに使用される変数などを格納する場所で、プログラムの開始時に保持され、終了まで値の配置が固定される領域です。主にオーバーフローを起こして、実行するコードの場所が書かれた「ジャンプアドレス」を書き換えることで、攻撃を仕掛けることができます。
上記の手口の攻撃を成功させるには、プログラムの動き、メモリ配置を把握している必要があります。
攻撃を受けると
バッファオーバーフローは、確保したバッファ領域以上のデータが書き込まれることで、データが溢れ、メモリ上のデータが書き換えられることにより、プログラムが異常終了したり攻撃者の任意のコマンドやコードが実行されたりしてしまうものです。このオーバーフローをさらに悪用して侵入させたマルウェアを実行させるといったケースもあります。代表的な被害は主に以下の2点です。
乗っ取り
バッファオーバーフローにより管理者権限を奪取されてしまうケースがあります。管理者権限を奪われてしまうと組織の機密情報の漏洩やデータの改ざん、なりすましなどの被害の恐れがあります。また、侵入させたマルウェアを実行させることで、機密情報の漏えいや改ざんなどの被害も考えられます。
攻撃の踏み台
攻撃者がコンピュータに侵入させたマルウェアを実行することで、別のターゲットに対する攻撃に利用されてしまうケースもあります。被害者であるはずの自分自身が加害者に仕立て上げられてしまうのです。組織の所有するコンピュータだった場合、社会的信用を大きく失ってしまうことになるので非常に恐ろしい被害です。
DoS攻撃との違い
規定以上のデータを送り付けることで攻撃を仕掛けるという点でいうと、バッファオーバーフローとDoS攻撃は非常に似ています。そもそもDoS攻撃とは何でしょうか。
DoS攻撃とは、特定のターゲットに対して大量の不正データなどを送り付けることでターゲットのシステムをダウンさせてしまう攻撃方法のことです。
一台のコンピュータからデータを大量に送り付けるDoS攻撃ですが、近年では一般的なコンピュータも処理速度が向上し一台のコンピュータからのデータ送信は処理しきれてしまいます。それを踏まえた上で近年は様々な種類のDoS攻撃が存在しています。
DoS攻撃の種類
DDoS攻撃
DDoS攻撃とは、複数のコンピュータから特定のターゲットに対して大量の処理要求を送り付けることでシステムをダウンさせてしまう攻撃手法のことです。DoS攻撃では攻撃者が所有する一台のコンピュータから直接攻撃を仕掛けていましたが、DDoS攻撃では攻撃者のコンピュータが複数のコンピュータを踏み台にして攻撃を仕掛けます。
EDoS攻撃
EDoS攻撃とは、利用量によって料金が変わる従量課金制のサービスを利用している標的に対して、大量のデータを送信することを強いるような通信を行い、利用者に多額の通信料金を支払わせるという手口のことです。よく見られるものが、F5キーを押すとWebサイトが更新されて利用料が発生することを利用して、ツールを使って大量にF5キーを連打することで高額な利用料を発生させる手口です。
DRDoS攻撃
DRDoS攻撃は近年増加している手口で、送信元アドレスをターゲットに偽装した上で攻撃者のコンピュータから攻撃のターゲットとは別の大量のコンピュータにパケットを送信し、増幅された応答パケットをターゲットに集中させることでシステムをダウンさせる手法です。ドメイン名とIPアドレスの対応関係の問い合わせに用いられるDNSサーバの仕組みが悪用されています。
バッファオーバーフローとDoS攻撃の違い
バッファオーバーフローは、ソフトウェアの脆弱性を利用した、コンピュータ内部にあるメモリ(スタック領域やヒープ領域など)に対する攻撃です。一方、DoS攻撃は公開サーバに対して負荷をかけることでシステムをダウンさせる攻撃なので、バッファオーバーフローとは攻撃者の目的も、攻撃対象となるコンピュータの場所も異なります。
被害事例
中央官庁 |
2000年1月、バッファオーバーフローによって管理者権限が奪取され、科学技術庁や総務庁、運輸省などのホームページが不正に改ざんされた。さらに総務庁統計局のホームページでは国勢調査などのデータが消去されてアクセス不能になった。 https://xtech.nikkei.com/it/members/NOS/ITARTICLE/20000301/1/ |
対策
考え得る対策は、実際にサービスを利用するユーザー側がするべき対策と、サービスを提供している開発者側がするべき対策で大きく異なるので、分けて説明します。
ユーザー側の対策
ユーザー側ができる対策は多くはありませんが、主に以下の2つが挙げられます。
OSやセキュリティソフトを常に最新の状態にする
まずは脆弱性を少しでも減らすためにOSなどのソフトウェアを常に最新状態にしておくことが重要です。その上でセキュリティソフトを導入し、そのソフトウェアを最新状態にアップデートしておくことでより強固な防御が可能になります。セキュリティソフトを選ぶ際にはマルウェアを検知・駆除・隔離する機能のみのソフトウェアではなく、エンドポイントからログデータを収集し、解析サーバで相関解析した上で不審な挙動やサイバー攻撃を検知し、管理者に通知するEDR(Endpint Detection and Response)と呼ばれるセキュリティソフトを導入することをお勧めします。
修正パッチの導入
利用中のソフトウェアに脆弱性などが見つかった場合、それを是正、改善するための更新プログラムとして修正パッチが適宜公開されます。それを公開後速やかに適用することで攻撃者の付け入る隙を与えないようにすることが大切です。
サービスを提供する側の対策
バッファオーバーフローの対策として最も重要なのが、サービスを提供する側の対策です。主に3つ挙げられます。
入力データのサイズをチェックする処理をプログラムに実装する
バッファオーバーフローの脆弱性は、確保したバッファ領域より大きいデータをバッファに読み込ませないようにチェックをしていれば問題ありません。そのため、入力されるデータの長さをチェックできるライブラリ関数を実装することで、オーバーフローが起きないようにできます。
ソースコードの検査とデバックツールでのオーバーフローの検出
記述済のソースコードを領域あふれ等の観点から検査し、内在する脆弱性を見つけ出すことが重要です。目視によるチェックや、 短時間に問題を見つけ出すことのできるソースコード検査ツールを利用してチェックします。また、プログラムのデバッグの際に領域あふれの問題を見つけるために、領域あふれを検出できるデバッグツールを使用して、バッファオーバーフローを検出します。
比較的安全な言語を使う
昨今様々な種類のプログラミング言語がありますが、WhiteSource Softwareが2020年に発表した調査によると、C言語は報告されている脆弱性の数が最も多い言語であることが分かっています。バッファオーバーフローにおいてもC言語やC++などでコーディングされたプログラムでの被害が多いため、直接メモリを操作できないことからバッファオーバーフローの脆弱性が発見される可能性の低いJavaなどの言語を使用して安全性を確保することも対策として有効です。
まとめ
バッファオーバーフローは、コンピュータ内部にあるメモリ領域をターゲットにして攻撃を仕掛ける手法なので、イメージするのが難しかったかと思います。しかし実際に被害に遭うと、システムの停止や乗っ取りなどによって甚大な社会的・経済的な損失を被ることになります。要点だけでもしっかり掴むことで、少しでも攻撃に対する意識を高め、対策することが大切です。