Share to: share facebook share twitter share wa share telegram print page

バッファオーバーフロー

バッファオーバーフロー: buffer overflow)またはバッファオーバーラン: buffer overrun)は、コンピュータプログラムにおけるバグのひとつ、またはそれにより引き起こされる現象で、プログラムがバッファに割り当てられた空間よりも大きなデータを書き込むことで、データがバッファ境界からあふれ、バッファの範囲外のメモリを上書きし、元々そのメモリにあったデータを破壊してしまうことを指す。

バッファオーバーフローは、上書きされるメモリ領域がスタック領域なのかヒープ領域なのかに応じてそれぞれスタックベースのバッファオーバーフローヒープベースのバッファオーバーフローと呼ばれる。なお、名称が似ているスタックオーバーフローとは別の現象である。

サイバーセキュリティ情報セキュリティの分野では、バッファオーバーフローはメモリ破壊系の脆弱性の一つとして知られ[1]、攻撃者がバッファオーバーフロー脆弱性のあるプログラムに意図的に悪意のあるデータ(コード)を与えることにより、コンピュータの制御を乗っ取ってしまうことを可能にする。バッファオーバーフロー脆弱性を悪用した攻撃をバッファオーバーフロー攻撃という[2]

バッファオーバーフローの具体例

簡単な例

以下の例では、プログラム中の隣接したアドレスに2つのデータ項目が定義されている。一つは 8 バイトの文字列バッファ A、もう一つは 2 バイトの整数 B である。初期状態では、A は 0 で初期化されており可読な文字は入っていない。また、B には整数 1,979 が格納されている。文字のバイト幅は 1 バイトとする。また、エンディアンはビッグエンディアンとする。

変数名 A B
NUL NUL NUL NUL NUL NUL NUL NUL 1979
16進数値 00 00 00 00 00 00 00 00 07 BB

ここで、プログラムがバッファ Aヌル終端文字列「excessive」を書きこもうとした場合を考える。文字列の長さチェックが行われていないと、この処理で B の値が上書きされてしまう。

変数名 A B
「e」 「x」 「c」 「e」 「s」 「s」 「i」 「v」 25856
16進数値 65 78 63 65 73 73 69 76 65 00

プログラマとしては B を変更する意図はなかったが、B の値は文字列の一部で置き換えられてしまった。この例ではビッグエンディアンとASCIIコードを仮定しているため、文字「e」とゼロというバイト列は整数 25,856 として解釈される。ここで、仮にプログラム中で AB 以外にデータ項目変数が定義されていないとものすると、さらに長い文字列を書き込んで B の終端を超えた場合にはセグメンテーション違反などのエラーが発生してプロセスが終了する。

電子メールアドレスを題材にした例

コンピュータプログラムを作るとき、固定長のバッファとよばれる領域を確保してそこにデータを保存するという手法がよく使われる。

たとえば、電子メールアドレスは200文字を超えないだろうと予想して

  1. 200文字分の領域をバッファとして用意する。
  2. ユーザが200文字より長いメールアドレスを入力する。
  3. プログラムがバッファの大きさをチェックせずに入力データを書き込む。
  4. バッファとして確保した領域をはみだしてデータが書き込まれてしまう。

これがバッファオーバーフローである。仮にはみ出した部分にプログラムの動作上意味を持つデータがあれば、これを上書きして破壊することにより、プログラムはユーザの意図しない挙動を示すであろう。

このようにバッファオーバーフローは、プログラムが用意したバッファの大きさを超えてデータを書き込んでしまうバグである。

C言語特有の例

C言語の標準入出力関数であるgets関数はバッファ長のチェックを行わないで標準入力をバッファに書き込むので、この関数を使う全てのプログラムには、バッファオーバーフローによる不正動作の危険性がある。また使い方が分かりやすいという理由でC言語初心者向けの入門プログラミングでしばしば用いられるscanf関数も書式指定を誤った場合は同じ危険性を持っている[3]。これらの関数を実用的なプログラムで用いる場合には注意が必要である。

次のプログラムはgets関数を用いた例である(セキュリティ上、gets関数はそれ自体をテストする以外の目的で使用されるべきではない。Linux Programmer's Manualには「gets()は絶対に使用してはならない」と書かれている)。バッファ長として200バイト確保されている。gets関数はバッファの長さについては関知しないため、200バイトを超えても改行文字かEOFが現れなければバッファオーバーフローが発生する。

#include <stdio.h>
int main(int argc, char *argv[])
{
  char buf[200];
  gets(buf);
  ....
}

gets関数の代わりにfgets関数を用いることで、この問題を回避できる(fgets#getsを置き換える例等を参照)。fgets関数にはバッファのサイズを渡すことができ、このバイト数を超えてバッファに書き込みを行わない。したがってバッファサイズが正しく設定されていれば、fgets関数においてバッファオーバーフローは起こり得ない。

これ以外のC言語の標準文字列処理関数の多くにも同様の問題(脆弱性)がある。

バッファオーバーフロー攻撃

情報セキュリティ・サイバーセキュリティにおいてバッファオーバーフロー攻撃は、バッファオーバーフローの脆弱性を利用した攻撃である。バッファオーバーフローの脆弱性は整数オーバーフロー書式文字列バグUse-After-Freeなどと同様、メモリ破壊系の脆弱性に相当する[1]

共通脆弱性タイプCWEには、

番号 名称
CWE-120 入力サイズをチェックしないバッファのコピー(古典的バッファオーバーフロー)[4]
CWE-121 スタックベースのバッファオーバーフロー[5]
CWE-122 ヒープベースのバッファオーバーフロー[6]

などが登録されており、これら3つはいずれも「CWE-119: メモリバッファの境界内における操作の不適切な制限」[7]に属している[7][8]

これら3つのバッファオーバーフロー脆弱性が頻繁に生じるのはC言語C++であり[4][5][6]、古典的バッファオーバーフローはアセンブリ言語でも生じる[4]

これら3種類のバッファオーバーフローはセキュリティポリシーの外側で任意のコードを攻撃者に実行可能にする事が頻繁にある[4][5][6]。さらに任意のコードの実行により他のセキュリティサービス機構を破壊する事も可能になる[4][5][6]。またこれら3種類のバッファオーバーフローはクラッシュの原因にもなるので[4][5][6]、意図的にクラッシュさせる攻撃が可能になる[4][5][6]

CWEでは「CWE-193: Off-by-oneエラー[9]がバッファオーバーフローの原因になると述べられており[10]、整数オーバーフローもバッファオーバーフローの原因になる事が述べられている[11]

古典的バッファオーバーフロー攻撃

バッファAの値を他のバッファBにコピーするとき、BのバッファサイズがAのバッファサイズよりも大きいことをチェックしない場合に生じる脆弱性である[4]。この脆弱性は、プログラマーがこのようなチェックの実装を怠った事により生じる[4]。これはプログラマーが最低限のセキュリティチェックすらしていないことを強く示唆する[4]

脆弱性の具体例としては、例えばC言語C++において、配列サイズをチェックする事なく、配列にstrcpyscanfで文字列等をコピーするといったものがある[4]。攻撃者は意図的に大きな入力をstrcpyscanfgetsに与えることで、古典的バッファオーバーフローを不正に生じさせる事ができる[4]

例えば攻撃者がバッファAをバッファオーバーフローさせる事により、Aの隣りにある変数xを不正に変更できた場合、xがセキュリティ上重要なデータ(例えば管理者権限を持っているか否かを判定するビットを保持している)であれば、セキュリティ上重要な問題が生じる。

スタックベースのバッファオーバーフロー攻撃

スタックベースのバッファオーバーフローは「上書きされるバッファがスタック(すなわち、局所変数や、まれに関数のパラメータ)にアロケートされる」[5]事が可能な場合に生じる脆弱性である。このような脆弱性はファジングを使用して発見されることが多い[12]

C言語・C++におけるメモリ領域

スタックベースのバッファオーバーフローについて説明するためにプロセスのメモリ利用方法を復習する。オペレーティングシステム (OS) は各ユーザプロセスに仮想アドレス空間を割り振り、WindowsLinuxなどのOSでは上位のアドレスをカーネルが使うカーネル空間とし、残りをユーザプロセス自身が用いるユーザ空間とする[注釈 1]。カーネル空間はユーザプロセスがアクセスする事はできず、通常のプログラミングでは意識する事はない。

C言語C++で書かれたプログラムの場合、ユーザ空間をさらに分割する。これらの言語で書かれたプログラムでは、仮想アドレスの最低位の箇所から順にプログラムの実行コードを置くコード領域(テキスト領域とも)、初期化された静的変数・大域変数を置くデータ領域、初期化されていない静的変数・大域変数を置くbss領域[注釈 2][注釈 3]malloc等で動的に確保されたメモリを置く(可変サイズの)ヒープ領域を確保する[13]

一方、ユーザ空間における仮想アドレスの最高位の箇所は関数のコールスタックを保存する(可変サイズの)スタック領域として用いられる[13]

最低位 最高位
コード領域 静的領域 ヒープ領域

(高位に向かって成長→)

スタック領域

(←低位に向かって成長)

データ領域 bss領域

スタック領域はプロセス中で呼ばれる関数のコールスタックを格納する領域で、コールスタック中の各関数のデータ(スタックフレームという)を並べて格納している[14]。プロセス中で関数fが関数gを呼び出した場合、コールスタックは以下のようになる[14][15]

低位アドレス 高位アドレス
gのスタックフレーム fのスタックフレーム
gの処理に必要な一時的な情報 gの局所変数 gのSFP gのリターンアドレス gの引数の値 fの処理に必要な一時的な情報

プロセスで現在実行中の関数のスタックフレームの位置を覚えるためにプロセッサによって用いられるのがフレームポインタ[注釈 4]で、具体的には(現在実行中の関数がgであれば)gのSFPのアドレスを指している。SFPは関数呼び出し時に呼び出し元の関数のフレームポインタのアドレスを覚えるための領域で、fがgを呼び出した際、スタックフレームの値(=fのSFPのアドレス)をgのSFPに格納する。なお、SFPは「Saved Frame Pointer」の略で、日本語訳は「退避されたフレームポインタ」である[14]

一方gのリターンアドレスは呼び出し元関数fのプログラムカウンタ[注釈 5]のアドレスを格納する[14]

攻撃の基本的アイデア

今例えば、関数gはユーザから(ASCIIコードの)文字列を入力を受け取り、入力された文字列を配列char A[10]に格納するとする。Aのサイズは10であるので、関数gのプログラマはユーザから受け取った文字列をAに格納する前に、その文字列が本当に10文字以下なのかをチェックする機構をgに実装しておかねばならない。このようなチェック機構を実装するのを忘れていた場合、悪意のあるユーザ(以下、「攻撃者」と呼ぶ)によりスタックベースのバッファオーバーフロー攻撃を受けてしまう危険がある。

具体的には、攻撃者は以下のような文字列をgに入力する:

シェルコード)…(シェルコードの仮想アドレス

ここでシェルコードとは、何らかの悪意のある短いプログラムで、例えば攻撃者のためにバックドアを開けたり、マルウェアのダウンロードを行ったりする[15]

この文字列が配列Aの先頭から順に書き込まれていくと、A[i]のアドレスはiが大きいほど大きくなるので、攻撃者が入力文字列の長さを適切に選べば、アドレス空間には以下のようにデータが書き込まれ、gのリターンアドレスがシェルコードの仮想アドレスに上書きされる[15]

低位アドレス 高位アドレス
gのスタックフレーム fのスタックフレーム
gの処理に必要な一時的な情報 gの局所変数 gのSFP gのリターンアドレス gの引数の値 fの処理に必要な一時的な情報
(シェルコード)… (シェルコードの仮想アドレス)

よって関数gが終了したとき、gのリターンアドレス(の箇所に上書きされたシェルコードの仮想アドレス)が読み込まれるので、プログラムカウンタはシェルコードの位置にジャンプし、攻撃者の狙い通り、シェルコードが実行される事になる[15]

NOPスレッド

上で述べた攻撃のアイデアが実行可能であるためには、攻撃者がリターンアドレスに上書きすべき仮想アドレスを正確に知り、それを関数gに入力する必要があるが、スタックは動的に変化するため、これは容易ではない[16]。そこで本節ではリターンアドレスに上書きすべき仮想アドレスの「おおよその値」さえ分かれば攻撃が可能になるテクニック(NOPスレッド)を述べる。

NOPとは「何も行わない」事を意味するアセンブリ命令で[16]、本来はタイミングを合わせるなどの動機により何もせずにCPU時間を消費するために用いられる[16]。NOPスレッド(sled、そり)[16]とはこのNOP命令を複数個並べたもので、これを利用する事により攻撃対象の関数をシェルコードの位置まで滑走させる。

具体的には攻撃者は下記のような文字列を攻撃対象の関数gに入力する:

NOP … NOP (シェルコード)(戻りアドレス)…(戻りアドレス)

最初の「NOP … NOP」の部分がNOPスレッドである。攻撃者がNOPスレッドの長さや戻りアドレスの繰り返し回数を適切に選んでgに入力すると、スタック領域は例えば以下のようになる(攻撃に関係する部分だけ抜書き):

gのスタックフレーム fのスタックフレーム
gの局所変数 gのSFP gのリターンアドレス
NOP… NOP NOPNOP (シェルコード)…(戻りアドレス)…(戻りアドレス) (戻りアドレス) (戻りアドレス)…

これでgのリターンアドレスは「戻りアドレス」にセットされるので、攻撃者が「戻りアドレス」としてNOPスレッド部分のアドレスを指定する事に事前に成功していれば、gの終了時にNOPスレッドへとプログラムカウンタが移動する。するとプログラムはNOPを順に実行して右へ右へと移動し、シェルコードの位置にたどり着いてシェルコードが実行されるので、攻撃成功となる[16][17]。戻りアドレスがNOPスレッドのどこかに落ちさえすればよいので、前節で述べた攻撃違い、リターンアドレスにセットする値を完璧に制御する必要はなく、NOPスレッドの長さ分の誤差が発生しても攻撃が成功する事になる。

NOPスレッドは頻繁に使用されるため、多くの侵入防止システムベンダーでシェルコードの判定に使用されている。このため、エクスプロイトの作成者側では、シェルコードの実行に影響を及ぼさない(NOP以外の)任意の命令をランダムに選んでスレッドを構成することが常套手段となっている[18]

戻りアドレスの値の予想

攻撃を実行するには、あとは「戻りアドレス」として具体的にどの程度の値を代入すればよいかを知ればよい。しかし攻撃の標的となる組織の環境で戻りアドレスの絶対アドレスがいくつ程度の値になるのかを事前に知る事は難しい。そこで相対アドレスを利用して戻りアドレスを適切に選ぶ攻撃テクニックを紹介する。この攻撃のシナリオでは、攻撃者はシェルコードを含んだ攻撃用のプログラムh(をコンパイルして作った実行コード)を攻撃の標的となる組織に送りつけ、hのサブルーチンとしてgを呼び出す事で攻撃を行う。

この攻撃用プログラムhでは、変数xを宣言が宣言されているものとする。hが標的の環境でgを呼び出したとき、gのスタックフレームはスタック領域上でhのスタックフレームのすぐ隣に配置される事から、攻撃用文字列を入れ込むgの変数の絶対アドレスvar_addは

var_add = &x - (小さな値)

になるはずである[16]。ここで「&x」はxのアドレスを表す。既に述べたようにNOPスレッドを使った攻撃では戻りアドレスとしてvar_add近辺の値を選べば成功するので、攻撃者はこの「小さな値」を決定しさえすればよい。

よって攻撃者は関数gの実行コードを事前に入手し、(シェルスクリプト等を使って)NOPスレッドの長さや戻りアドレスを変えながら攻撃対象のプログラムを何度も実行することで適切な「小さな値」を選び、その「小さな値」を攻撃用プログラムhに書き込んでおけばよい[16]

埋め込めるコード量が小さい場合の対処

関数gに埋め込む攻撃用の文字列は「NOPスレッド+シェルコード+戻りアドレスの繰り返し」という形をしており、gのリターンアドレスが「戻りアドレスの繰り返し」の部分に落ちない限り攻撃は成功しないので、関数gに攻撃用文字列を埋め込む箇所とgのリターンアドレスとが(仮想アドレス空間上で)あまりに近い場合は、攻撃に必要な長さのシェルコードを埋め込めないという問題が攻撃者に生じる。

しかし攻撃者が攻撃の標的となるマシンの環境変数を設定できる状況下では、攻撃者はこの問題を回避した攻撃が可能である。標的マシンでプロセスが実行される際には、そのプロセスの仮想アドレス空間に環境変数が読み込まれるので、攻撃者が事前に標的マシンの環境変数に「NOPスレッド+シェルコード」を書き込んでおけば、プロセスの仮想アドレスに「NOPスレッド+シェルコード」ができあがる事になる。プロセス中で関数gが実行された際、攻撃者は攻撃用文字列をgに入力して、リターンアドレスをそのNOPスレッドに書き換えれば攻撃が成功する事になる[19]

より確実な攻撃方法として、攻撃プログラムhの中に環境変数を読み込む関数(getenv()等)を用いるものもある[20]

ヒープスプレー

NOPスレッドを長くしすぎると、gのリターンアドレスの位置にすらNOPが書き込まれてしまって攻撃に失敗する為、NOPスレッドを長くして攻撃成功率を上げる手法には限界がある。しかし攻撃者がプロセスのヒープ領域の値をも自由に操れるという条件下では、攻撃者はヒープスプレーというテクニックを用いる事により、この限界を突破した攻撃を行う事が可能になる[21]

ヒープスプレーでは、NOPスレッドとシェルコードを、スレッド領域ではなくヒープ領域に埋め込み、戻りアドレスとしてヒープ領域中のNOPスレッドを指定する。ヒープ領域上のNOPスレッドにはスレッド領域のNOPスレッドと違い前述した長さの上限が存在しないため、「長いNOPスレッド+シェルコード」の組み合わせを大量にヒープ中に書き込むことで攻撃成功率を上げる[21]

ウェブブラウザではJavaScriptなどのクライアントサイドスクリプトにより任意の長さのヒープを作成できるので、ブラウザを対象にしたドライブバイダウンロード攻撃ではヒープスプレーが使われる事が多い[21]

トランポリング

攻撃者の入力したデータ(エクスプロイトなど)のアドレスは未知であるが、そのデータのアドレスがレジスタに格納されていることは分かっているという場合には、トランポリン(trampolining)と呼ばれる手法が利用される。この手法では、攻撃者の入力したデータにジャンプするオペコードのアドレスをリターンアドレスへ上書きする。例えばアドレスがレジスタRに格納されている場合、jump R(あるいはcall Rなど)というオペコードが格納されているアドレスにジャンプさせることでユーザの入力したデータを実行させる。この手法で使用するオペコードはDLLや実行ファイルの中のものを利用する。ただし、一般的にオペコードのアドレスにヌル文字が含まれていてはならず、また処理に使用するオペコードのアドレスはアプリケーションやオペレーティングシステムのバージョンによって異なる。Metasploitプロジェクトはこのような目的に適したオペコードのデータベースの一つであり、Windowsで使用できるオペコードが記載されている[22]

ヒープベースのバッファオーバーフロー

mallocなどでヒープ領域に動的にメモリを確保する関数に対するオーバーフロー攻撃である[6]。基本的な攻撃手法としては、関数がヒープに確保したメモリ領域が2つあるとき、そのうち一方の領域に対して確保済みのメモリサイズより大きなデータを入力する事でオーバーフローを起こし、もう一方のメモリ領域を書き換えるというものである[23]。mallocは複雑な方法でメモリ確保の場所を決定しているものの、連続して2度mallocを実行した場合、その結果として確保される2つのメモリ領域は(仮想アドレス空間上で)近くに配置されている傾向があるため、上述のようなバッファオーバーフロー攻撃が可能になる。

mallocのメモリ管理

より高度なヒープベースバッファオーバーフロー攻撃手法を説明する為の準備として、mallocのメモリ管理方法を説明する。なおメモリ管理方法の詳細はmallocの実装に依存するため、実行環境によって細かなところは下記の説明と異なる部分があるので注意されたい。

mallocは未使用なヒープ領域(の一部)をメモリプールとして管理しており、メモリプールは複数のchunkと呼ばれる単位からなっている[24]。プログラム中でmallocが実行されるたびに、管理しているchunkの中から適切なサイズのものをプログラムに返す[24]。適切なサイズのchunkがない場合は、システムコールにより新たなchunkを確保してプログラムに返す[24]。mallocはchunkを(サイズ毎に異なる複数の[25]連結リストとして管理しており[24]、chunkをプログラムに渡す際にこの連結リストからchunkを削除し、プログラムがメモリ領域をfreeすると、freeされたchunkが連結リストに加わる[24]

chunkは連結リストとして管理されているので、各chunkには「次のchunk」を指定するポインタ(Windowsでは「flink」[26]、linuxでは「fd」[24])や「前のchunk」を指定するポインタ(Windowsでは「blink」[26]、linuxでは「bk」[24])がある。

未使用chunkと隣接するメモリ領域が解放された場合は、解放されたメモリ領域と未使用chunkとを連結 (coalesce) する事で1つの大きなchunkを作って管理する[26]

mallocのメタデータの書き換え

より高度なヒープベースバッファオーバーフロー攻撃として、mallocがメモリ管理に使うメタデータを書き換える手法がある。例えばWindows XP SP1またはそれ以前のWindowsでは、mallocしたメモリ領域をオーバーフローさせる事で、そのメモリ領域の(仮想アドレス空間で)隣りにある未使用chunkのflinkやblinkを任意のアドレスに書き換えるという攻撃手法が可能であった[27]。flinkやblinkはcoalesceのタイミングでmallocにより参照されるので攻撃が成功する[27]

バッファオーバーフローの結果

write-what-where状態

バッファオーバーフロー攻撃の結果として、write-what-where状態("write-what-where condition"[28]、CWE-123[28]。任意の場所に任意の値を書き込むことができる状態[29])になる危険がある[28]

write-what-where状態になると、セキュリティポリシーのスコープ外にメモリのデータを書き込むことができる[28]。セキュリティポリシーのスコープ外にコードを置くことで、攻撃者はほぼ確実に任意のコードを実行できるようになる[28]。管理者権限を制御しているフラグ等が書き換えられる場合も、攻撃者は任意のコードが実行可能になる[28]

プログラムのフリーズ・クラッシュ

攻撃者は意図的にバッファオーバーフローを起こすによりプログラムをクラッシュさせたり[4][5][6]、処理を書き換えて無限ループに追い込むことでプログラムをフリーズさせてたり[4][5][6]する事でプログラムの可用性を侵害できる。

関数ポインタの書き換え

古典的バッファオーバーフロー[30]やヒープオーバーフロー[6]などの結果として、関数ポインタの書き換えが可能になるケースがある。攻撃者はnmコマンドを用いる事でプログラム中で用いられている様々な関数のアドレスを知る事ができるので[30]、nmの結果を参照して攻撃に利用可能な関数に関数ポインタの値を書き換えられる。

技術的対策

コンパイラやライブラリによる対策

カナリア

バッファオーバーフローを検出するコードをコンパイル時に実行コードに挿入する手法がある。典型的手法としては、ローカル変数とSFPの間に、カナリア(canary)[31][32]もしくはクッキー[33]と呼ばれる領域を挿入する方法である。プログラムは実行中カナリアを監視し続け、バッファオーバーフローによりカナリアが書き換わったらプログラムを停止する。

安全なライブラリへの置き換え

標準Cライブラリ等にはバッファオーバーフロー検知機能が施されていない関数が収録されているので、これを検知機能を持った関数に置き換えたライブラリを標準Cライブラリの代わりに使う事で攻撃を検知できる。例えばLibsafe[36]は標準Cライブラリのstrcpy(*dest,*src)をより安全な関数に置き換えており、入力srcのサイズがコピー先のdestのサイズが大きいか否かを検知できる[37]

実行環境での対策

Write XOR eXecute

典型的なスタックベースのバッファオーバーフロー攻撃では、本来データを格納すべき領域にシェルコードやNOP命令のような実行コードを置き、これをプログラムに実行させる事で攻撃が成立する。そこでこのような攻撃を防ぐため、データを格納すべき領域では実行不可にする、Write XOR eXecute[37]WX[37]もしくはW^Xと略す)という対策手法が知られている[37]。WXのWindowsにおける実装はDEP: data execution prevention、データ実行防止)と呼ばれる[37][38]。またDEPではSEH例外ハンドラへのポインタが上書きされないように明示的に保護を行う[39]。 一部のUNIX(OpenBSDmacOSなど)はWXなどの実行保護が有効になった状態で出荷されている。それ以外のオプショナルなパッケージとしては以下のものが挙げられる。

また、プロプライエタリなアドオンとしては以下のものがある。

なお、2018年現在広く使われているx64アーキテクチャのプロセッサでは、WXを実現する為にデータ領域である事を識別するNXビットという仕組みがハードウェアレベルでサポートされている[45](インテルではNXビットのことをXDビットと呼んでいるが同一のものである[45])。

ASLR

バッファオーバーフロー攻撃を含めたメモリ破壊攻撃全般を緩和する技術としてASLR(Address Space Layout Randomization、アドレス空間配置のランダム化)がある。これは仮想メモリ空間におけるスタック領域やコード領域の位置、読み込まれるDLLの位置等を(プログラム起動時もしくはOS自身の起動時に)ランダムに変える技術で、これにより攻撃者が攻撃に有効な実行コードの特定箇所を指定してメモリ改ざんを行うのを困難にする。

ASLRはバッファオーバーフロー攻撃の発展形であるReturn-to-libc攻撃(後述)を緩和できるが、さらにその発展形であるReturn-oriented programmingには対抗できない。

カーネル空間のASLRをKASLR(kernel address space layout randomization)といい、linuxカーネル(バージョン3.14以降)[46]、iOS(バージョン6以降)[47]などで実装されている。またKASLRをバイパスしようとする攻撃に対抗する為の機構としてKernel page-table isolationがある。

gccとg++でコンパイルとスタック領域とヒープ領域に対してはASLRを用いるが、コード領域にASLRを用いるにはオプション「-pie」を使わねばならない[48]。また共有ライブラリにASLRを用いるにはオプション「-fPIC」を指定する[48]

開発時の対策

プログラミング言語・プログラミング環境の選択

C言語やC++以外の言語ではバッファオーバーフローが発生しないよう対策が取られているものも多く、コンパイル時にバッファオーバーフローのチェックを行ったり、実行時にバッファオーバーフローに対する警告や例外を上げたりするものもある(AdaEiffelLISPModula-2SmalltalkOCaml、およびC言語から派生したCycloneD言語など)。

Javaプラットフォーム.NET Frameworkでは全ての配列に対して境界チェックが必須とされる。ほぼすべてのインタプリタ言語ではバッファオーバーフローへの対策が行われており、エラー発生時にはその状態が明確に伝えられる。境界チェックを行うのに十分な型情報を保持しているようなプログラミング言語では、境界チェックの有効・無効を切り替えるためのオプションが提供されていることもある[注釈 6]

ソースコード記述時の対策

バッファオーバーフロー攻撃は主にC言語やC++を対象としたものなので、以下ではプログラミング言語としてC言語かC++を選んだ場合に対しての対策を述べる。

人手による対策

バッファオーバーフロー攻撃を防ぐには、領域長とデータ長を意識したプログラミングを行う事が重要である[51]

  • データをバッファに挿入する際には、データ長がバッファ長を超えない事を調べる検査ロジックをプログラムに書き加えておく[51]
  • データが文字列の場合は文字列長を数え間違えないよう、文字列の終端にあるナル文字も数える[51]
  • データ長に依存したループを書くときに間違ってループを回しすぎる(Off-by-oneエラー)事が無いようにする[51]
  • 事前にデータ長の上限がわからない場合は、バッファをmalloc等で動的に確保し、不要になったら確実にfreeする[51]

安全なライブラリの使用

標準Cライブラリを使う代わりに、バッファあふれを未然に防いだりエラーとして検出してくれたりするセキュアなライブラリを使う事も重要である。このようなライブラリとして以下のようなものがある。

またBSD libcなど、Cライブラリの実装によってはstrlcpystrlcatといった、より安全に配慮した文字列用関数が用意されている。

静的コード解析時における対策

人手による静的コード解析

静的コード解析の際、前述した領域長とデータ長を意識したプログラミングが行われているか再確認し、strcpy, sprintf 等のデータ領域長を意識しないライブラリ関数が使用されていないか、使用されているならその入力長の計算が間違っていないかを確認する[55]。またヒープオーバーフロー対策としてmalloc/freeやnew/deleteの多用に注意し、関数ポインタの書き換えを防ぐために関数ポインタが多用に注意し[55]、攻撃パターンを見逃す事がないようデータの一部を切り捨てている関数に注意する[55]

自動化された静的コード解析

strcpy等のバッファオーバーフローが起こりやすい関数の使用に対して警告を出してくれる関数名照合型検査ツール[55]や、各種ソースコード検査ツール[55]を使用してバッファオーバーフロー対策を行う。開発環境の中にはソースコード検査ツールをオプションとして備えているものもあるので、それを利用する事もできる[55]

またソースコードが手に入らない製品等を利用する場合は、ファジングツールでブラックボックス解析する。

発展的な攻撃

Return-to-libc攻撃

既に述べたように、典型的なスタックベースのオーバーフロー攻撃では、本来データを格納すべき箇所にシェルコードやNOP命令のようなコードを置き、リターンアドレスを書き換えてこれらのコードにジャンプして、これらのコードを実行する必要があった。しかしWXが実装された実行環境ではデータを格納すべき箇所におけるコード実行を不許可としているので、こうしたオーバーフロー攻撃を仕掛ける事はできない。

そこでWXを回避する為に考案されたのがReturn-to-libc攻撃である。この攻撃では、リターンアドレスのジャンプ先をデータ格納箇所に書き換えるのではなく、標準Cライブラリ(libc)のような共有ライブラリ・DLLにジャンプするよう書き換える。こうしたライブラリはデータ格納箇所以外に置かれているので(WXが実装された環境においても)実行許可がある。そこで攻撃者はライブラリ内の関数を悪用して、攻撃を仕掛ける事ができる。

実行環境がASLRを実装していれば、libc等のライブラリの仮想アドレスはランダムに変わるので、攻撃者がジャンプ先をライブラリに落ちるようリターンアドレスを書き換えるのは困難になる。

Return-to-Register攻撃

Return-to-Register攻撃とは「ret命令実行後にレジスタが指しているアドレスに不正な命令コードを挿入し、その上で”そのレジスタ値に実行を移す命令群が格納されているアドレス”でリターンアドレスを書き換える攻撃」[56]のことである。

例えばレジスタAがバッファの先頭へのポインタを格納しているとすると、そのときレジスタAをオペランドにとる任意のjumpまたはcall命令が実行フローの支配権を得るのに使用できる[57]

ret2esp攻撃

ret2esp(Return to esp)攻撃は、2017年現在のASLRの実装のデフォルトではコード領域(.textセクション)をランダマイズしない事を利用してASLRを回避する攻撃手法である[58]。ここでespはx86におけるスタックポインタである。この攻撃は.textセクション内に「jmp esp」のような命令がある場合に成立する[58]。攻撃者はバッファオーバーフローを利用してespの(仮想アドレス空間上の)下にシェルコードを配置した上で、リターンアドレスを「jmp esp」の箇所に書き換える。するとまずリターンアドレスの書き換えにより「jmp esp」のところにジャンプし、次に「jmp esp」が実行されてespの箇所にジャンプするので、その下に配置したシェルコードが実行される事になる[58]

歴史

バッファオーバーフローがある程度公に文書化されたのは1972年の初めで[独自研究?]Anderson 1972 で以下のように説明されている。

Anderson 1972, p. 61: The code performing this function does not check the source and destination addresses properly, permitting portions of the monitor to be overlaid by the user. This can be used to inject code into the monitor that will permit the user to seize control of the machine.

この処理を実行するコードは読み込み元と書き込み先のアドレスに対するチェックを適切に行なっておらず、モニターの一部に対しユーザによる上書きを許すことになっている。これはモニターにコードを挿入するのに利用される可能性があり、結果としてユーザがマシンの制御を掌握する可能性がある。

モニターとは、現在カーネルと呼ばれているのと同じものである。

バッファオーバーフローを利用した悪意のあるエクスプロイトで最初に文書化されたのは、1988年に書かれたMorris wormがインターネット上で増殖するのに利用していたエクスプロイトのうちの一つである。攻撃対象のプログラムはUNIXサービスであるfingerであった[59]。 1995年、Thomas Lopaticはそれとは独立にバッファオーバーフローを発見し、セキュリティに関するメーリングリストBugtraqへ投稿した[60]。 1996年、エリアス・レヴィ(ハンドルネームAleph one)はオンラインマガジンPhrackで記事"Smashing the Stack for Fun and Profit"を発表した[61]。 これはスタックベースのバッファオーバーフローを使用したエクスプロイトを手順を追って説明していく内容である。

これ以降、少なくとも2つの有名なインターネットワームがバッファオーバーフローを利用したエクスプロイトで多くのシステムに被害を与えている。2001年にはCode RedがマイクロソフトのInternet Information Services (IIS) 5.0のバッファオーバーフローを利用している[62]。 また2003年にはSQL SlammerMicrosoft SQL Server 2000の動作するマシンに被害を与えている[63]

2003年には、市販のXboxのゲームに含まれるバッファオーバーフローが利用され、無認可のソフトウェア(例えばHomebrewのゲームなど)をModチップなどのハードウェアの改造なしに動作させるのに利用された[64]PlayStation 2では同じ目的のためにPS2 Independence Exploitが使用される。またWiiではHomebrewが利用されるが、これはゼルダの伝説 トワイライトプリンセスに存在するバッファオーバーフローを利用している。

参考文献

関連項目

脚注

注釈

  1. ^ i386の場合、Windowsであれば仮想空間の上位2 GB、Linuxであれば仮想空間の上位1 GBがカーネル空間になる。なお本節で書いたメモリ箇所はいずれも後述するセキュリティ技術アドレス空間配置のランダム化 (ASLR) を用いていない場合の話である。
  2. ^ Block Started by Symbolというアセンブラの疑似命令に由来する。
  3. ^ なお、データ領域とbss領域を合わせて静的領域という。
  4. ^ x86ではebpレジスタ (Stack Base Pointer Register)。
  5. ^ 命令ポインタとも。x86ではeipレジスタ (Extended Instruction Pointer)。
  6. ^ 例えばDelphiでは$RangeChecksディレクティブで境界チェックの有効・無効を切り替えられる[49][50]

出典

  1. ^ a b 八木, 村山 & 秋山 2015, p. 59.
  2. ^ 第10章 著名な脆弱性対策バッファオーバーフロー: #1 概要”. セキュアプログラミング講座 C/C++言語編 旧2007年公開版. 情報処理推進機構. 2018年12月14日閲覧。
  3. ^ [迷信] scanf ではバッファオーバーランを防げない”. C/C++迷信集. 株式会社きじねこ. 2020年1月12日時点のオリジナルよりアーカイブ。2010年2月28日閲覧。 “書式指定が不適切なために発生する脆弱性であって、scanf の問題ではありません。”
  4. ^ a b c d e f g h i j k l m n CWE-120: Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')”. Mitre. 2018年12月18日閲覧。
  5. ^ a b c d e f g h i CWE-121: Stack-based Buffer Overflow”. Mitre. 2018年12月18日閲覧。
  6. ^ a b c d e f g h i j CWE-122: Heap-based Buffer Overflow”. Mitre. 2018年12月18日閲覧。
  7. ^ a b CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer”. Mitre. 2018年12月18日閲覧。
  8. ^ CWE-787: Out-of-bounds Write”. Mitre. 2018年12月18日閲覧。
  9. ^ CWE-193: Off-by-one Error”. Mitre. 2018年12月18日閲覧。
  10. ^ CWE-131: Incorrect Calculation of Buffer Size”. Mitre. 2018年12月18日閲覧。
  11. ^ CWE-680: Integer Overflow to Buffer Overflow”. Mitre. 2018年12月18日閲覧。
  12. ^ The Exploitant - Security info and tutorials”. 2009年11月29日閲覧。
  13. ^ a b Erickson 2011, pp. 87–88.
  14. ^ a b c d Erickson 2011, p. 84.
  15. ^ a b c d 八木, 村山 & 秋山 2015, pp. 60–61.
  16. ^ a b c d e f g Erickson 2011, pp. 161–164.
  17. ^ 八木, 村山 & 秋山 2015, p. 64.
  18. ^ Akritidis, P.; Markatos, Evangelos P.; Polychronakis, M.; Anagnostakis, Kostas D. (2005). "STRIDE: Polymorphic Sled Detection through Instruction Sequence Analysis." (PDF). Proceedings of the 20th IFIP International Information Security Conference (IFIP/SEC 2005). IFIP International Information Security Conference.
  19. ^ Erickson 2011, pp. 164–168.
  20. ^ Erickson 2011, pp. 168–173.
  21. ^ a b c 八木, 村山 & 秋山 2015, pp. 65–67.
  22. ^ The Metasploit Opcode Database”. 2007年5月12日時点のオリジナルよりアーカイブ。2007年5月15日閲覧。
  23. ^ Erickson 2011, pp. 173–179.
  24. ^ a b c d e f g 角馬 文彦(技術本部 クラウド基盤エキスパート) (2007年11月30日). “malloc(3)のメモリ管理構造”. VA Linux Systems Japan. 2018年12月26日閲覧。
  25. ^ Doug Lea. “A Memory Allocator”. 2018年12月26日閲覧。
  26. ^ a b c FFRI 2013, p. 7.
  27. ^ a b FFRI 2013, p. 8.
  28. ^ a b c d e f CWE-123: Write-what-where Condition”. Mitre. 2018年12月26日閲覧。
  29. ^ JVNDB-2015-004721 Silicon Integrated Systems WindowsXP Display Manager における権限を取得される脆弱性”. JVN iPedia. 2018年12月26日閲覧。
  30. ^ a b Erickson 2011, pp. 179–192.
  31. ^ 芝国雄 (2006年9月5日). “第14回: バッファオーバーフローとサーバ側のセキュリティ対策を考える”. ThinkIT. オープンソースの適用可能性を示す. p. 2. 2019年1月1日閲覧。
  32. ^ David Wheeler (2004年1月27日). “セキュアなプログラマー バッファー・オーバーフローに対抗する 今日最大の脆弱性を防止する”. IBM. 2019年1月1日閲覧。
  33. ^ a b c 八木, 村山 & 秋山 2015, pp. 69–70.
  34. ^ StackGuard: Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks by Cowan et al.” (PDF). 2012年2月9日閲覧。
  35. ^ /GS (バッファーのセキュリティ チェック)” (2016年11月4日). 2012年2月9日閲覧。
  36. ^ Libsafe - Free Software Directory”. 2012年2月9日閲覧。
  37. ^ a b c d e 八木, 村山 & 秋山 2015, pp. 71–73.
  38. ^ Windows XP Service Pack 2、Windows XP Tablet PC Edition 2005、および Windows Server 2003 のデータ実行防止 (DEP) 機能の詳細”. 2012年2月17日閲覧。
  39. ^ Bypassing Windows Hardware-enforced Data Execution Prevention”. 2007年5月20日閲覧。
  40. ^ PaX: Homepage of the PaX team”. 2012年2月17日閲覧。
  41. ^ KernelTrap.Org”. 2012年5月29日時点のオリジナルよりアーカイブ。2012年2月17日閲覧。
  42. ^ Openwall Linux kernel patch 2.4.34-ow1”. 2012年2月17日閲覧。
  43. ^ BufferShield: Prevention of Buffer Overflow Exploitation for Windows”. 2012年2月17日閲覧。
  44. ^ NGSec Stack Defender”. 2007年5月13日時点のオリジナルよりアーカイブ。2012年2月17日閲覧。
  45. ^ a b NXビット”. IT用語辞典e-Words. 2019年1月1日閲覧。
  46. ^ Linux kernel 3.14, Section 1.7. Kernel address space randomization”. kernelnewbies.org (2014年3月30日). 2014年4月2日閲覧。
  47. ^ Stefan Esser. “iOS 6 Exploitation 280 Days Later”. 2019年1月1日閲覧。
  48. ^ a b Hardening”. Devian. 2019年1月1日閲覧。
  49. ^ Neil Moffatt. “Delphi Basics : $RangeChecks command”. 2012年2月3日閲覧。
  50. ^ 範囲チェック - RAD Studio
  51. ^ a b c d e f g h 第10章 著名な脆弱性対策 バッファオーバーフロー: #2 ソースコード記述時の対策”. セキュアプログラミング講座(2007年公開版). 情報処理推進機構. 2018年12月27日閲覧。
  52. ^ The Better String Library”. 2012年2月8日閲覧。
  53. ^ The Vstr Homepage”. 2012年2月8日閲覧。
  54. ^ The Erwin Homepage”. 2012年2月8日閲覧。
  55. ^ a b c d e f 第10章 著名な脆弱性対策 バッファオーバーフロー: #3 ソースコードの静的検査”. セキュアプログラミング講座(2007年公開版). 情報処理推進機構. 2018年12月27日閲覧。
  56. ^ メモリ破損脆弱性に対する攻撃の調査と分類 2014, p. 769.
  57. ^ Shah, Saumil (2006). "Writing Metasploit Plugins: from vulnerability to exploit" (PDF). Hack In The Box. Kuala Lumpur.
  58. ^ a b c CTFで学ぶ脆弱性(スタックバッファオーバーフロー編・その1)”. NTTデータ先端技術株式会社. 2019年1月1日閲覧。
  59. ^ "A Tour of The Worm" by Donn Seeley, University of Utah”. 2007年5月20日時点のオリジナルよりアーカイブ。2007年6月3日閲覧。
  60. ^ Bugtraq security mailing list archive”. 2007年9月1日時点のオリジナルよりアーカイブ。2007年6月3日閲覧。
  61. ^ Smashing the Stack for Fun and Profit”. 2007年6月3日閲覧。
  62. ^ eEye Digital Security”. 2007年6月3日閲覧。
  63. ^ Microsoft Technet Security Bulletin MS02-039”. 2007年6月3日閲覧。
  64. ^ Hacker breaks Xbox protection without mod-chip”. 2007年9月27日時点のオリジナルよりアーカイブ。2007年6月3日閲覧。

Read other articles:

For the 1980 Hindi film by Hrishikesh Mukherjee, see Khubsoorat. 1999 Indian filmKhoobsuratDirected bySanjay ChhelWritten bySanjay ChhelProduced byRahul SughandStarringSanjay DuttUrmila MatondkarCinematographyMadhu AmbatEdited byAseem SinhaMusic byJatin–LalitRelease date 26 November 1999 (1999-11-26) CountryIndiaLanguageHindiBudget₹60 millionBox office₹151.1 million Khoobsurat (transl. Beautiful) is a 1999 Indian Hindi-language romantic comedy film directed by Sanja...

 

Изображение было скопировано с wikipedia:en. Оригинальное описание содержало: On the Third Day album cover 1973 Uk original Scanned by me the author Licensing Це зображення є обкладинкою музичного альбому або синглу. Найімовірніше, авторськими правами на обкладинку володіє видавець альбому (синглу) або виконаве

 

Jean l'AgneauBiographieNaissance TihangeDécès MaastrichtActivité PrêtreAutres informationsÉtape de canonisation SaintFête 25 juilletmodifier - modifier le code - modifier Wikidata Saint Jean (dit l’Agneau), qui vécut au VIIe siècle, fut le 25e évêque de Tongres. Il est considéré comme saint par l’Église catholique. Biographie Jean dit l’Agneau, agriculteur et fils d’un riche propriétaire foncier, vivait si pieusement à Tihange près de Huy en Belgique qu’il ...

Florida Federal Open 1978, парний розряд Eckerd Tennis Open 1978Переможець Мартіна Навратілова Енн СмітФіналіст Керрі Рід Венді ТернбуллРахунок фіналу 7-6, 6-3Дисципліни одиночний розряд парний розряд ← 1977 · Eckerd Tennis Open · 1979 → Докладніше: Eckerd Tennis Open 1978 В парному розряді жіноч�...

 

Mountain in Wicklow, Ireland LugnaquillaLog na CoilleLooking into the Fraughan Rock Glen (river) and the summit of Lugnaquilla (back, centre)Highest pointElevation925 m (3,035 ft)[1][2][3]Prominence905 m (2,969 ft)[1]ListingCounty top (Wicklow), P600, Marilyn, Furth, 100 Highest Irish Mountains, Hewitt, Arderin, Simm, Vandeleur-LynamCoordinates52°58′02″N 6°27′53″W / 52.96714°N 6.464618°W / 52.96714; -...

 

Конвенція СНД про права та основні свободи людини Конвенція Співдружності Незалежних Держав про права та основні свободи людини (рос. Конвенция Содружества Независимых Государств о правах и основных свободах человека) — міжнародний договір, укладений у 1995 році. Набран�...

2022 South Korean film DittoTheatrical release posterHangul동감 Directed bySeo Eun-youngScreenplay bySeo Eun-youngBased onDittoby Kim Jung-kwonStarring Yeo Jin-goo Cho Yi-hyun Kim Hye-yoon Na In-woo Bae In-hyuk CinematographyJeong Gi-wookEdited byKim Hyeong-juMusic byKim Hong-jibProductioncompanyGogo StudiosDistributed byCJ EntertainmentRelease date November 16, 2022 (2022-11-16) Running time114 minutesCountrySouth KoreaLanguageKoreanBox officeUS$3.8 million[1] Ditto ...

 

City in Brčko District, Bosnia and HerzegovinaBrčko БрчкоCityBrčkoBrčkoLocation within Bosnia and HerzegovinaShow map of Bosnia and HerzegovinaBrčkoBrčko (Balkans)Show map of BalkansCoordinates: 44°52′38″N 18°48′40″E / 44.87722°N 18.81111°E / 44.87722; 18.81111Country Bosnia and HerzegovinaDistrictBrčko DistrictGeographical regionPosavinaGovernment • MayorZijad Nišić (SBiH) • President of the District AssemblySini�...

 

Marylebone High StreetLooking south down the High StreetLength0.3 mi (0.48 km)LocationMarylebone, London, EnglandPostal codeW1North endThayer StreetToMarylebone RoadConstructionConstruction startc.1400OtherKnown forShopping; St Marylebone Parish Church; Manchester Square The former site of the Tyburn Manor House at the north end. Marylebone High Street is a shopping street in London, running sub-parallel to Baker Street and terminating at its northern end at the junction with M...

Men's team foil at the 2023 World Fencing ChampionshipsVenueMilan Convention CenterLocationMilan, ItalyDates29–30 JulyCompetitors124 from 32 nationsTeams32Medalists  Kazuki IimuraKyosuke MatsuyamaTakahiro ShikineKenta Suzumura   Japan Chen HaiweiMo ZiweiWu BinXu Jie   China Cheung Ka LongRyan ChoiLeung Chin YuYeung Chi Ka   Hong Kong← 20222024 → 2023 WorldFencing ChampionshipsÉpéemenwomenTeam épéemenw...

 

Mobi BankaNative nameМоби БанкаTypeJoint-stock companyIndustryFinancial servicesFounded9 May 2014; 9 years ago (2014-05-09)HeadquartersOmladinskih brigada 88, Belgrade, Belgrade, SerbiaArea servedSerbiaKey peopleMiloš Brusin (CEO)ProductsCommercial bankingRevenue €7.11 million (2018)[1]Total assets €134.786 million (2018)[1]OwnerPPF Financial Holding (100%)Number of employees174 (Dec 2018)Websitemobibanka.rs Mobi Banka, formerly known as Telenor...

 

For other uses, see Hawa. Village development committee in Janakpur Zone, NepalHawa हवाVillage development committeeHawaLocation in NepalCoordinates: 27°34′N 86°10′E / 27.57°N 86.16°E / 27.57; 86.16Country   NepalZoneJanakpur ZoneDistrictDolakha DistrictPopulation (1991) • Total1,833Time zoneUTC+5:45 (Nepal Time) Hawa is a village development committee in Dolakha District in the Janakpur Zone of north-eastern Nepal. At the ...

For other uses, see Bucovăț (disambiguation). Town in MoldovaBucovățTownBucovățCoordinates: 47°11′19″N 28°37′25″E / 47.18861°N 28.62361°E / 47.18861; 28.62361CountryMoldovaDistrictStrășeni districtGovernment • MayorAlexandru Pascaru (Independent[1])Population (2014)[2]1,601Time zoneUTC+2 (EET) • Summer (DST)UTC+3 (EEST)ClimateDfb Bucovăț (Romanian pronunciation: [bukoˈvət͡s]) is a town in Str...

 

1923 novel by Felix Salten Bambi, a Life in the Woods First edition cover of the original publicationAuthorFelix SaltenOriginal titleBambi: Eine Lebens­geschichte aus dem WaldeTranslatorWhittaker ChambersIllustratorKurt WieseCountryAustriaLanguageGermanGenreFictionPublisherUllstein VerlagPublication date1923Published in English1928Media typePrint (hardcover)OCLC2866578Followed byBambi's Children  Bambi, a Life in the Woods (German title: Bambi: Eine Lebensgeschic...

 

Pakistani actor (born 1963) Iqbal ThebaTheba in October 2012Born (1963-12-20) December 20, 1963 (age 59)Karachi, PakistanOccupationActorYears active1992–presentChildren2 Iqbal Theba (pronounced /ˈɪkbɑːl ˈteɪbə/; born December 20, 1963)[1] is a Pakistani actor, known for his recurring role as Principal Figgins in the show Glee. Early life Theba was born in Karachi, Pakistan.[1] He belongs to the Theba tribe, a Gujarati-speaking group originating from Sindh.&#...

Historian specialized in American History, and particularly the History of the Southwest Anna LewisAnna Lewis as pictured in the 1926 Oklahoma College for Women yearbookBorn(1885-10-25)October 25, 1885Choctaw Nation, Indian TerritoryDiedAugust 1, 1961(1961-08-01) (aged 75)Pushmataha County, OklahomaNationalityAmericanOccupation(s)Professor, historian, writerYears active1917–1956Known forAmerican History, History of the Southwest,Notable workAlong the Arkansas (1932), Pushmata...

 

The Central Harbourfront is a waterfront site in Central, Hong Kong. It is the result of Central and Wan Chai Reclamation, and it sits to the east of ifc skyscraper. A partial view of the Central Harbourfront area, with the HKOW located on the left and a limited sight of the Kowloon skyline behind. The harbourfront is now the site of the Hong Kong Observation Wheel, AIA Vitality Park, Central Harbourfront Event Space,[1] and Hong Kong ePrix of Formula E. The harbourfront is the best p...

 

Museum, house in which Martin Luther died Martin Luther's Death HouseUNESCO World Heritage SiteThe house where it was thought that Martin Luther diedOfficial nameLuther's Death HouseLocationEisleben, Mansfeld-Südharz, Sachsen-Anhalt, GermanyPart ofLuther Memorials in Eisleben and WittenbergCriteriaCultural: (iv)(vi)Reference783-001Inscription1996 (20th Session)Area0.12 ha (0.30 acres)Buffer zone1.37 ha (3.4 acres)Coordinates51°31′41″N 11°32′40″E...

1813 battle during the Peninsular War Battle of the Bidassoa (1813)Part of War of the Sixth CoalitionBattle of the Bidassoa, 9 October 1813.Date7 October 1813LocationNear Hendaye, France and La Rhune43°20′16″N 1°43′7″W / 43.33778°N 1.71861°W / 43.33778; -1.71861 (Mont Calvaire)Result Allied victoryBelligerents French Empire United Kingdom Portugal SpainCommanders and leaders Nicolas Soult Duke of WellingtonStrength 62,000[1] 89,000[2]...

 

American college basketball season 2022–23 Northwestern State Demons men's basketballConferenceSouthland ConferenceRecord22–11 (13–5 Southland)Head coachCorey Gipson (1st season)Associate head coachRodney HamiltonAssistant coaches Tony Holliday Tim Ward Home arenaPrather ColiseumSeasons← 2021–222023–24 → 2022–23 Southland Conference men's basketball standings vte Conf Overall Team W   L   PCT W   L   PCT Texas A&M–Corp...

 
Kembali kehalaman sebelumnya