本記事は、Webアプリケーション攻撃入門シリーズの最終回であり、次の2つの脆弱性について解説します。
- クリックジャッキング
- バッファオーバーフロー
クリックジャッキング
クリックジャッキングは、「UI Re-Dressing(リドレッシング)」とも呼ばれ、ユーザーインターフェイスの要素を欺くことにより、ユーザーが意図しているアクションと異なる操作を行わせる手法です。
クリックジャッキングの具体的な被害には以下のものが考えられます。
- 機密情報の漏洩:
- ユーザーが意図せずに機密情報(例:パスワード、個人識別情報)を入力するフォームをクリックし、それが攻撃者に送信される可能性があります。
- 不正なソーシャルメディア活動:
- 攻撃者はクリックジャッキングを使って、ユーザーに自分の知らないうちにソーシャルメディアでコンテンツを「いいね!」する、共有する、あるいは特定のページをフォローするよう仕向けることができます。
- 不正な課金・金銭の損失:
- オンラインショッピングサイトや決済サービスで、ユーザーが購入や決済の確認をする際に、意図せずに高額の商品を購入したり、金銭を送金したりすることがあります。
- 不正なサービス登録:
- ユーザーが意図せずに特定のサービスやサブスクリプションに登録する操作を行うことがあります。
クリックジャッキングの攻撃手法
クリックジャッキングは、ウェブページが他のページや要素を埋め込まれることによって生じます。例えば、攻撃者が作成したウェブサイトに、ターゲットとなるウェブサイト(銀行サイトやソーシャルネットワークなど)のログインページをiframeで埋め込み、その上に「賞品を獲得するためにクリック」というボタンを配置する場合があります。ユーザーがボタンをクリックすると、実際にはターゲットサイトのログインボタンをクリックしてしまいます。
- 透明なフレームの使用
- 攻撃者は、透明なiframeを使って正規のウェブサイトの上に不正なコンテンツを重ねます。ユーザーは表面上は正常なページの要素をクリックしているように見えますが、実際には透明なiframe内の別の要素をクリックしています。例えば、攻撃者はオンラインバンキングサイトのログインボタンの上に透明なiframeを配置し、ユーザーがログインボタンをクリックするつもりで、実際には攻撃者の意図した別のアクションを実行させます。
- 隠蔽された要素
- ウェブページ上に目立つ要素(例:ビデオプレイボタン)を配置し、実際にはこの要素の下に別の操作(例:「購読する」ボタン)が隠されています。ユーザーはビデオを再生するつもりでクリックしますが、実際には購読する操作を実行します。例えば、攻撃者は人気のある動画のプレイボタンを偽装してウェブページに配置し、実際にはその下に自動的に有料サービスに登録するリンクがあります。
- ボタンの上書き
- 攻撃者は正規のウェブページ上に見えるボタンを偽装し、ユーザーがクリックすると別の操作が実行されるようにします。この手法は特に、ユーザーが既に信頼しているインターフェースを狙う際に有効です。例えば、攻撃者は「動画を共有する」というラベルのボタンをウェブページに設置しますが、ユーザーがクリックすると、実際にはユーザーのソーシャルメディアアカウントにアクセスする許可を与える操作になっています。
例えば、下記のようなHTMLがあり、ユーザが「WAF入門記事へ」ボタンを押したことを考えます。この時、透明化したiframeのリンクが実際にはクリックされ、CDN入門記事のトップページに飛ばされる動作となります。このように、ユーザが意図しない操作をさせることが、クリックジャッキングの仕組みです。(後述のX-Frame-Options
のsameorigin
により、本HTMLは同オリジン[www.bloomblock.net]でのみ動作します。)
<!DOCTYPE html>
<html>
<head>
<title>クリックジャッキング攻撃のデモ</title>
<style>
iframe {
width: 200px;
height: 200px;
opacity: 0.0; /* 透明度を0にして見えなくする */
position: absolute;
top: 100px;
left: 100px;
}
button {
position: absolute;
top: 100px;
left: 100px;
}
</style>
</head>
<body>
<h3>クリックしてみてください</h3>
<button>WAF入門記事へ</button>
<iframe src="https://www.bloomblock.net/media/cdn-basic-series/"></iframe>
<!-- ここで、ユーザーはボタンをクリックするつもりですが、実際にはiframe内のページがクリックされます。 -->
</body>
</html>
クリックジャッキングの対策
クリックジャッキングに対する防御には、ウェブサイトがiframeでのコンテンツ埋め込みを制限する「X-Frame-Options」ヘッダの設定や、より包括的な「Content Security Policy」(CSP)を利用する方法があります。
- X-Frame-Optionsヘッダーの使用: ウェブサーバーにX-Frame-Optionsヘッダーを設定して、ページがiframe内で表示されることを防ぎます。X-Frame-Optionsには二つのオプションがあり、deny(読み込み不可)、sameorigin(同オリジンであれば許可)で制御可能です。
- Content Security Policy (CSP): CSPの
frame-ancestors
を利用することで、X-Frame-Optionsより細かく制御することが可能です。
バッファオーバーフロー
バッファオーバーフローは、プログラムがデータをバッファ(例えば、メモリの割り当てられた領域)に書き込む際に、バッファの容量を超えてデータを書き込むことです。これにより、隣接するメモリ領域に不正なデータが書き込まれる可能性があります。
バッファオーバーフローの具体的な被害には以下のものが考えられます。
- 不正なコード実行
- 攻撃者はバッファオーバーフローを利用して、ターゲットシステム上で任意のコードを実行できる可能性があります。これにより、攻撃者はシステムを完全に制御することができます。例えば、ウィルスやトロイの木馬などのマルウェアをシステムにインストールし、システムの制御を奪ったり、機密情報を盗み出したりすることが可能です。
- システムクラッシュやサービスの中断
- バッファオーバーフローはプログラムやオペレーティングシステムをクラッシュさせ、サービス中断(Denial of Service, DoS)を引き起こすことがあります。例えば、重要なサーバーやネットワーク機器がクラッシュすることで、ビジネスの運営に影響を与え、生産性の損失や金銭的な損害を引き起こす可能性があります。
バッファオーバーフローの攻撃手法
バッファオーバーフロー攻撃は、ソフトウェアの脆弱性を利用して、システム上で任意のコードを実行するための手法です。入力の検証やバッファのサイズ管理が不十分な場合、特に、プログラムがユーザーからの入力に基づいてデータをバッファに書き込む際に、その長さをチェックしない場合に問題が生じます。例えば、 C言語の strcpy()
関数は、ソース文字列を目的のバッファにコピーする際に長さをチェックしません。したがって、ソース文字列がバッファのサイズを超える場合、隣接するメモリ領域にデータが書き込まれ、オーバーフローが発生します。
バッファオーバーフローには、その対象によりいくつかの種類に分けられます。主要なものをいくつか紹介します。
- スタックベースのバッファオーバーフロー
- 最も一般的なタイプのバッファオーバーフロー攻撃です。攻撃者はスタック上のバッファをオーバーフローさせ、リターンアドレスを上書きします。これにより、攻撃者は任意のコード(通常はシェルコードと呼ばれる)を実行できるようになります。
- ヒープベースのバッファオーバーフロー
- この攻撃では、ヒープ上のバッファ(動的に割り当てられたメモリ領域)をオーバーフローさせます。ヒープオーバーフローは、スタックオーバーフローよりも実行が複雑ですが、アプリケーションの内部ロジックにより影響を与える可能性があります。
- 整数オーバーフローによるバッファオーバーフロー
- 整数オーバーフロー攻撃は、整数変数を使用する際に発生する可能性があります。整数オーバーフローが発生すると、不適切なメモリ割り当てにより、メモリ破損やアプリケーションクラッシュを引き起こすことがあります。
バッファオーバーフローの対策
バッファオーバーフローの対策としては、入力の検証、セーフ関数やセキュアなプログラミング言語を使用することが有効です。
- バッファの境界チェック
- プログラムがメモリにデータを書き込む際に、データの量が割り当てられたバッファのサイズを超えないようにチェックします。例えば、使用するプログラミング言語が提供するバウンドチェック付きの関数を使用します(例:C言語での
strncpy()
代わりにstrcpy()
)。
- プログラムがメモリにデータを書き込む際に、データの量が割り当てられたバッファのサイズを超えないようにチェックします。例えば、使用するプログラミング言語が提供するバウンドチェック付きの関数を使用します(例:C言語での
- セキュアなプログラミング言語の利用
- バッファオーバーフローのリスクを減らすために、セキュリティに焦点を当てたプログラミング言語を選択します。例えば、 Java、Python、Rubyなど、メモリ管理を自動で行う言語を使用することで、バッファオーバーフローのリスクを減らすことができます。
- アドレス空間配置のランダマイズ(ASLR)
- ASLR(Address Space Layout Randomization)はメモリ上でプログラムのコードやデータがロードされる位置をランダム化することで、攻撃者に対してメモリ位置を予測しにくくします。
おわりに
本記事では、クリックジャッキングとバッファオーバフローについて解説しました。 本シリーズでは「安全なウェブサイトの作り方」で紹介されている11の脆弱性を解説してきましたが、脆弱性は多種多様であり、対策を行うには幅広い知識が必要であることが伝わったかと思います。
本シリーズを通して、読者がWebアプリケーションへの攻撃手法を理解し、それらを防ぐ検討の一助になれば幸いです。
Webアプリケーション攻撃入門の記事一覧ページはこちらです。読み返したい場合は、ブックマークをお願いいたします。