Presentation is loading. Please wait.

Presentation is loading. Please wait.

ホストのセキュリティ 情報工学専攻 1年 赤木里騎 P151~172.

Similar presentations


Presentation on theme: "ホストのセキュリティ 情報工学専攻 1年 赤木里騎 P151~172."— Presentation transcript:

1 ホストのセキュリティ 情報工学専攻 1年 赤木里騎 P151~172

2 過去何年にもわたって猛威を振るってきたが、現在でも最も重 大な脆弱性の一つとして存在している
6.1 バッファーオーバーフローの概要 バッファーオーバーフローとは… 遠隔もしくはローカルから対象とするコンピュータのメモリに 不正なデータや実行コードを書き込み、不正に権限を取得した りシステムへの侵入を引き起こしたりする脆弱性 過去何年にもわたって猛威を振るってきたが、現在でも最も重 大な脆弱性の一つとして存在している

3 6.1.1 バッファーオーバーフローの仕組み バッファー… プログラムの実行中にデータ保持のためのメモリ領域
6.1 バッファーオーバーフローの概要 6.1.1 バッファーオーバーフローの仕組み バッファー… プログラムの実行中にデータ保持のためのメモリ領域 CやC++などではスタック領域とヒープ領域とよばれる バッファーオーバーフロー… プログラム実行時に領域を超えてデータを入れようとすると境 界を超えた部分から後ろが上書きされる プログラムの誤作動 一見何の変化もないようにして実行を続ける

4 ある関数が呼び出された後に参照されるメモリ上の番地がバッファー直後のメモリ空間に記されているとする
6.1 バッファーオーバーフローの概要 6.1.1 バッファーオーバーフローの仕組み バッファーオーバーフローを利用した悪用例 正常な状態 ある関数が呼び出された後に参照されるメモリ上の番地がバッファー直後のメモリ空間に記されているとする バッファー スタック リターンアドレス

5 6.1.1 バッファーオーバーフローの仕組み バッファーオーバーフローを利用した悪用例 6.1 バッファーオーバーフローの概要 入力
正常な状態 バッファーのサイズを超えるデータ 入力 バッファー スタック 不正な命令コード 不正な命令コードのアドレス リターンアドレス

6 6.1.1 バッファーオーバーフローの仕組み バッファーオーバーフローを利用した悪用例 6.1 バッファーオーバーフローの概要 入力
正常な状態 バッファーのサイズを超えるデータ 入力 バッファー スタック 不正な命令コード 不正な命令コードのアドレス リターンアドレス バッファーからあふれる 呼び出された アドレスに戻る

7 何らかの方法で攻撃者がプログラム実行時にバッファーオーバーフローを引き起こし、リターンアドレスの値を上書きできるとする
6.1 バッファーオーバーフローの概要 6.1.1 バッファーオーバーフローの仕組み バッファーオーバーフローを利用した悪用例 正常な状態 不正なデータが送られた後の状態 バッファーのサイズを超えるデータ 入力 バッファー スタック 不正な命令コード 不正な命令コード バッファーからあふれる部分 不正な命令コードのアドレス リターンアドレス 不正な命令コードのアドレス バッファーからあふれる 何らかの方法で攻撃者がプログラム実行時にバッファーオーバーフローを引き起こし、リターンアドレスの値を上書きできるとする

8 6.1.1 バッファーオーバーフローの仕組み バッファーオーバーフローを利用した悪用例 6.1 バッファーオーバーフローの概要 入力
正常な状態 不正なデータが送られた後の状態 バッファーのサイズを超えるデータ 入力 バッファー スタック 不正な命令コード 不正な命令コード バッファーからあふれる部分 本来であればリターンアドレスに戻るところが不正なアドレスに戻ってしまう。攻撃者がそこに不正なプログラムを用意していたらそれが実行されてしまう。 不正な命令コードのアドレス リターンアドレス 不正な命令コードのアドレス バッファーからあふれる 攻撃者が上書きされた値が示す場所に悪意あるプログラムを用意し、関数呼び出し後に戻ろうとすると悪意あるプログラムを実行することになる 不正な アドレスに戻る

9 攻撃者はバッファーオーバーフローを利用してshellコードな どを実行すること
6.2 バッファーオーバーフローを用いた攻撃例 [目的] 攻撃者はバッファーオーバーフローを利用してshellコードな どを実行すること [種類] ローカルでの攻撃 リモートからの攻撃 乗っ取りやプログラムのインストール、設定の変更などが利用可能になる

10 6.2.1 ローカルでの攻撃 [目的] 高い権限の取得(管理者 or root) [何ができるか]
6.2 バッファーオーバーフローを用いた攻撃例 6.2.1 ローカルでの攻撃 [目的] 高い権限の取得(管理者 or root) [何ができるか] 攻撃対象のプログラムの実行時の高い権限レベルでshellを動 させれば攻撃対象のコンピュータを自由自在に操作できる [対象] ネットワークサーバープログラム等

11 6.2.2 リモートからの攻撃 [目的] 高い権限の取得
6.2 バッファーオーバーフローを用いた攻撃例 6.2.2 リモートからの攻撃 [目的] 高い権限の取得 ターゲットのサーバプログラムを操作したり、マルウェアをダ ウンロードさせて実行すること [例1] 攻撃者 ターゲット マルウェアが置かれたサイト

12 ①バッファーオーバーフローを引き起こすデータ
6.2 バッファーオーバーフローを用いた攻撃例 6.2.2 リモートからの攻撃 [目的] 高い権限の取得 ターゲットのサーバプログラムを操作したり、マルウェアをダ ウンロードさせて実行すること [例1] ①バッファーオーバーフローを引き起こすデータ 攻撃者 ターゲット マルウェアが置かれたサイト

13 ①バッファーオーバーフローを引き起こすデータ
6.2 バッファーオーバーフローを用いた攻撃例 6.2.2 リモートからの攻撃 [目的] 高い権限の取得 ターゲットのサーバプログラムを操作したり、マルウェアをダ ウンロードさせて実行すること [例1] ①バッファーオーバーフローを引き起こすデータ 攻撃者 ②shellコードを実行させる ターゲット マルウェアが置かれたサイト

14 ①バッファーオーバーフローを引き起こすデータ
6.2 バッファーオーバーフローを用いた攻撃例 6.2.2 リモートからの攻撃 [目的] 高い権限の取得 ターゲットのサーバプログラムを操作したり、マルウェアをダ ウンロードさせて実行すること [例1] ①バッファーオーバーフローを引き起こすデータ 攻撃者 ②shellコードを実行させる ③shellコードがマルウェア本体をダウンロード ターゲット マルウェアが置かれたサイト

15 ①バッファーオーバーフローを引き起こすデータ
6.2 バッファーオーバーフローを用いた攻撃例 6.2.2 リモートからの攻撃 [目的] 高い権限の取得 ターゲットのサーバプログラムを操作したり、マルウェアをダ ウンロードさせて実行すること [例1] ①バッファーオーバーフローを引き起こすデータ 攻撃者 ②shellコードを実行させる ④shellコードがマルウェアを実行 ③shellコードがマルウェア本体をダウンロード ターゲット マルウェアが置かれたサイト

16 ①バッファーオーバーフローを引き起こすデータ
6.2 バッファーオーバーフローを用いた攻撃例 6.2.2 リモートからの攻撃 [目的] 高い権限の取得 ターゲットのサーバプログラムを操作したり、マルウェアをダ ウンロードさせて実行すること [例2] ①バッファーオーバーフローを引き起こすデータ 攻撃者 ターゲット

17 ①バッファーオーバーフローを引き起こすデータ
6.2 バッファーオーバーフローを用いた攻撃例 6.2.2 リモートからの攻撃 [目的] 高い権限の取得 ターゲットのサーバプログラムを操作したり、マルウェアをダ ウンロードさせて実行すること [例2] ①バッファーオーバーフローを引き起こすデータ ②shellコードを実行させる 攻撃者 ターゲット

18 ①バッファーオーバーフローを引き起こすデータ
6.2 バッファーオーバーフローを用いた攻撃例 6.2.2 リモートからの攻撃 [目的] 高い権限の取得 ターゲットのサーバプログラムを操作したり、マルウェアをダ ウンロードさせて実行すること [例2] ①バッファーオーバーフローを引き起こすデータ ②shellコードを実行させる 攻撃者 ③shellコードによるconnect-back ターゲット

19 ①バッファーオーバーフローを引き起こすデータ
6.2 バッファーオーバーフローを用いた攻撃例 6.2.2 リモートからの攻撃 [目的] 高い権限の取得 ターゲットのサーバプログラムを操作したり、マルウェアをダ ウンロードさせて実行すること [例2] ①バッファーオーバーフローを引き起こすデータ ②shellコードを実行させる 攻撃者 ③shellコードによるconnect-back ④遠隔端末ツールによる操作 ターゲット

20 6.3.1 プロセスのメモリ配置とスタック プログラム内の変数はコンピュータの内部でプロセス単位で管理 される
6.3 バッファーオーバーフローの詳細と対策 6.3.1 プロセスのメモリ配置とスタック プログラム内の変数はコンピュータの内部でプロセス単位で管理 される それぞれ独立したアドレス(0x ~0xFFFFFFFF)を持つ 0xFFFFFFFF プロセスC プロセスB 0x プロセスA

21 6.3.1 プロセスのメモリ配置とスタック プログラム内の変数はコンピュータの内部でプロセス単位で管理 される
6.3 バッファーオーバーフローの詳細と対策 6.3.1 プロセスのメモリ配置とスタック プログラム内の変数はコンピュータの内部でプロセス単位で管理 される それぞれ独立したアドレス(0x ~0xFFFFFFFF)を持つ 0xFFFFFFFF 0x

22 6.3.1 プロセスのメモリ配置とスタック プログラム内の変数はコンピュータの内部でプロセス単位で管理 される
6.3 バッファーオーバーフローの詳細と対策 6.3.1 プロセスのメモリ配置とスタック プログラム内の変数はコンピュータの内部でプロセス単位で管理 される それぞれ独立したアドレス(0x ~0xFFFFFFFF)を持つ 最高位アドレス側から若いアドレスに向けて割り当てられる スタックセグメント 0xFFFFFFFF 複数プロセスが実行時に共有して利用するライブラリ 共有ライブラリ Cのmalloc関数により動的に確保された領域 ヒープ領域 初期値を持たない静的変数と大域変数は初期値0としてBSSへ BSS 初期値を持つ静的変数と大域変数 データセグメント 実行コード テキストセグメント 0x

23 6.3.2 プログラム実行時のスタックの様子 6.3 バッファーオーバーフローの詳細と対策 0xFFFFFFFF int a 1: 2:
3: 4: 5: 6: 7: 101: 102: 103: 104: 105: int main() { int a; foo(a); } int foo(int a){ int b; char c[1024]; return 0; スタック の先頭 int a

24 6.3.2 プログラム実行時のスタックの様子 6.3 バッファーオーバーフローの詳細と対策 0xFFFFFFFF int a 引数 a
1: 2: 3: 4: 5: 6: 7: 101: 102: 103: 104: 105: int main() { int a; foo(a); } int foo(int a){ int b; char c[1024]; return 0; int a 引数 a リターンアドレス スタック の先頭

25 6.3.2 プログラム実行時のスタックの様子 6.3 バッファーオーバーフローの詳細と対策 0xFFFFFFFF int a 引数 a
1: 2: 3: 4: 5: 6: 7: 101: 102: 103: 104: 105: int main() { int a; foo(a); } int foo(int a){ int b; char c[1024]; return 0; int a 引数 a リターンアドレス ebpレジスタ保存値/ int b char c[1024] スタック の先頭

26 6.3.2 プログラム実行時のスタックの様子 6.3 バッファーオーバーフローの詳細と対策 0xFFFFFFFF int a 1: 2:
3: 4: 5: 6: 7: 101: 102: 103: 104: 105: int main() { int a; foo(a); } int foo(int a){ int b; char c[1024]; return 0; int a スタック の先頭

27 6.3.3 スタックオーバーフローの仕組み 6.3 バッファーオーバーフローの詳細と対策 0xFFFFFFFF char data 1:
2: 3: 4: 5: 6: 7: 101: 102: 103: 104: 105: int main() { foo(a); } int foo(char *data){ char c[24]; strcpy(c, data); return 0; スタック の先頭 char data

28 6.3.3 スタックオーバーフローの仕組み 6.3 バッファーオーバーフローの詳細と対策 0xFFFFFFFF char data
1: 2: 3: 4: 5: 6: 7: 101: 102: 103: 104: 105: int main() { foo(a); } int foo(char *data){ char c[24]; strcpy(c, data); return 0; char data 引数 data リターンアドレス(5行目) スタック の先頭

29 6.3.3 スタックオーバーフローの仕組み 6.3 バッファーオーバーフローの詳細と対策 0xFFFFFFFF char data
1: 2: 3: 4: 5: 6: 7: 101: 102: 103: 104: 105: int main() { foo(a); } int foo(char *data){ char c[24]; strcpy(c, data); return 0; char data 引数 data リターンアドレス(5行目) ebpレジスタ保存値 char c[24] スタック の先頭

30 6.3.3 スタックオーバーフローの仕組み 6.3 バッファーオーバーフローの詳細と対策 0xFFFFFFFF char data
1: 2: 3: 4: 5: 6: 7: 101: 102: 103: 104: 105: int main() { foo(a); } int foo(char *data){ char c[24]; strcpy(c, data); return 0; char data 引数 data リターンアドレス(x) ebpレジスタ保存値 char c[24] スタック の先頭 c :24byte data:32byte cよりもdataが大きいためにリターンアドレスが上書きされる

31 6.3.3 スタックオーバーフローの仕組み 6.3 バッファーオーバーフローの詳細と対策 0xFFFFFFFF char data
1: 2: 3: 4: 5: 6: 7: 101: 102: 103: 104: 105: int main() { foo(a); } int foo(char *data){ char c[24]; strcpy(c, data); return 0; char data 引数 data リターンアドレス(x) ebpレジスタ保存値 char c[24] スタック の先頭 不正な命令コード

32 6.3.4 ヒープオーバーフローの仕組み スタックオーバーフローに比べ悪用しにくい [理由]
6.3 バッファーオーバーフローの詳細と対策 6.3.4 ヒープオーバーフローの仕組み スタックオーバーフローに比べ悪用しにくい [理由] どのバッファーが攻撃対象となり得るかを調べらければならない 攻撃できるバッファー領域を見つけても、攻撃者が書き込むバッ ファー領域が攻撃対象となるバッファー領域よりも下位のアドレ スでなければならない

33 攻撃対象となるプログラムの実行時に重要なバッファー領域の下位 のアドレス領域に任意にデータを埋め込めること
6.3 バッファーオーバーフローの詳細と対策 6.3.4 ヒープオーバーフローの仕組み [ヒープオーバーフロー成功のカギ] どのバッファーが攻撃対象となり得るかを調べらければならない 攻撃対象となるプログラムの閲覧が可能 攻撃者が書き込むバッファー領域が攻撃対象となるバッファー領 域よりも下位のアドレスでなければならない 攻撃対象となるプログラムの実行時に重要なバッファー領域の下位 のアドレス領域に任意にデータを埋め込めること

34 6.3.5 ヒープオーバーフロー攻撃の例 6.3 バッファーオーバーフローの詳細と対策
1: 2: 3: 4: 5: 6: 7: 8: 9 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: #include<stdio.h> #include<malloc.h> #include<string.h> void main() { char *a = (char *)malloc(sizeof(char)*4); char *b = (char *)malloc(sizeof(char)*4); char *tmp; printf(“Address of a is: %p\n”, a); printf(“Address of b is: %p\n”, b); strcpy(a, “abc”); strcpy(b, “efg”); tmp = a; while(tmp < b + 4){ printf(“%p: %c (0x%x) \n”, tmp, isprint(*tmp)? *tmp: ‘?’, (unsigned int)(*tmp)); tmp += 1; } 6,7行目でポインタ変数a,bが示すバッファー領域を確保 9,10行目でバッファーが存在するアドレスを表示させる 12,13行目で文字列を代入 16~20行目で変数aが示すバッファー領域から変数bが示すバッファー領域までを表示させる →データが表示不可能な場合は“?”が表示させる

35 6.3.5 ヒープオーバーフロー攻撃の例 6.3 バッファーオーバーフローの詳細と対策 …
1: 2: 3: 4: 5: 6: 7: 8: 9 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: #include<stdio.h> #include<malloc.h> #include<string.h> void main() { char *a = (char *)malloc(sizeof(char)*4); char *b = (char *)malloc(sizeof(char)*4); char *tmp; printf(“Address of a is: %p\n”, a); printf(“Address of b is: %p\n”, b); strcpy(a, “abc”); strcpy(b, “efg”); tmp = a; while(tmp < b + 4){ printf(“%p: %c (0x%x) \n”, tmp, isprint(*tmp)? *tmp: ‘?’, (unsigned int)(*tmp)); tmp += 1; } $ ./a.out Address of a is: 0x1d2f010 Address of b is: 0x1d2f030 0x1d2f010: a (0x61) 0x1d2f011: b (0x62) 0x1d2f012: c (0x63) 0x1d2f013: ? (0x0) 0x1d2f02e: ? (0x0) 0x1d2f02f: ? (0x0) 0x1d2f030: e (0x65) 0x1d2f031: f (0x66) 0x1d2f032: g (0x67) 変数aと変数bが示すバッファー領域は隣接していないが、何度も実行するとa,b間の領域は常に等間隔である。そのため、変数aのバッファー領域を溢れさせれば変数bのバッファー領域を書き換えることができる(ヒープオーバーフロー)

36 6.3.6 バッファーオーバーフローを招く関数 バッファーオーバーフローを引き起こす危険がある関数
6.3 バッファーオーバーフローの詳細と対策 6.3.6 バッファーオーバーフローを招く関数 バッファーオーバーフローを引き起こす危険がある関数 gets sprintf vfscanf vsscanf strtrns strcpy scanf streadd strcat fscanf vscanf strecpy 例:getsは格納先バッファーの境界チェックを行わない 対策1:fgets(バッファーの書き込みサイズを指定できる)を利用する 対策2:プログラマ自身が境界領域をチェックする

37 6.3.7 その他のバッファーオーバーフロー対策 OSやアプリ利用者・運用者という観点では提供されるセキュ リティパッチを当てること
6.3 バッファーオーバーフローの詳細と対策 6.3.7 その他のバッファーオーバーフロー対策 OSやアプリ利用者・運用者という観点では提供されるセキュ リティパッチを当てること 開発者の観点ではC/C++やアセンブリ以外の言語を使用する こと(根本的な解決ではないが…) Cのアプリに対してバッファーオーバーフロー対策をしてくれ るコンパイラを用いる 最近のOSではセキュリティ対策としてアドレス空間配置のラ ンダム化の技術が採用されている場合もある

38 6.4.1 セキュアOS Secure OS 強制アクセス制御機能および最小特権機能を実装したOS 強制アクセス制御
操作する主体と操作される対象をそれぞれ段階分けして、その 段階に応じてシステムが強制的にアクセス権限を決定する方式

39 6.4.1 セキュアOS Secure OS 強制アクセス制御機能および最小特権機能を実装したOS
操作する主体と操作される対象をそれぞれ段階分けして、その 段階に応じてシステムが強制的にアクセス権限を決定する方式 任意サクセス制御は操作される対象の所有者が操作される対象の権限を設定することができる ユーザー(利用者) アプリケーション ファイルやディレクトリ等のコンピュータリソース

40 6.4 セキュアOSとセキュアブート 6.4.2 LinuxにおけるセキュアOS SELinux(Secrity-Enhanced Linux) …プロセスごとにラベル を付けることで対象にタイプ付けをする AppArmor…アプリごとのアクセス制御可能、パス名ベースの アクセス制御(対象のフルパス名を要素の識別に利用) TOMOYO Linux …パス名ベースのアクセス制御、ポリシーの 自動学習機能 LSM(Linux Security Modules) …様々なセキュアOSをサポー トするためにLinuxカーネルに追加されたフレームワーク Secrity-Enhanced Linux -> セキュリティを強化したLinux カーネル→OSの中心機能群

41 6.4 セキュアOSとセキュアブート 6.4.3 セキュアブート カーネル自体や共有ライブラリを 書き換える技術をツール化したもの 何らかの手段で攻撃者がホストへのルートキットのインストール に成功してしまうと、カーネルから提供される情報すべてが全て 攻撃者の都合の良いように改ざんされてしまう セキュアブートと呼ばれる、許可されていないOSやドライバー が起動時に実行されないようにする仕組みが提案された

42 6.4.3 セキュアブート 6.4 セキュアOSとセキュアブート 通常のブートシーケンス例 セキュアブートシーケンス Windowsログオン
マルウェア対策ソフト ドライバー ドライバー マルウェア対策ソフト OSローダー OSローダー UEFI->Unified Extensible Firmware Interface(統一された拡張ファームウェアインタフェース) BIOS UEFIモジュール ハードウェア ハードウェア

43 6.4.3 セキュアブート 6.4 セキュアOSとセキュアブート 通常のブートシーケンス例 セキュアブートシーケンス Windowsログオン
マルウェア対策ソフト ドライバー ドライバー マルウェア対策ソフト OSローダー OSローダー UEFI->Unified Extensible Firmware Interface(統一された拡張ファームウェアインタフェース) BIOS UEFIモジュール ハードウェア ハードウェア OSローダーが攻撃者によって改ざんされていると、その後に呼び出されるマルウェア対策ソフトが有効に機能しない

44 6.4.3 セキュアブート 6.4 セキュアOSとセキュアブート マルウェア対策ソフト起動までに検証を行うため、安全な起動を行うことができる
通常のブートシーケンス例 セキュアブートシーケンス Windowsログオン Windowsログオン マルウェア対策ソフト ドライバー ドライバー 検証 -ディジタル署名等を用いる マルウェア対策ソフト OSローダー OSローダー UEFI->Unified Extensible Firmware Interface(統一された拡張ファームウェアインタフェース) BIOS UEFIモジュール ハードウェア ハードウェア 起動を許可するソフトウェアのハッシュ値やディジタル署名をする主体を登録 OSローダーが攻撃者によって改ざんされていると、その後に呼び出されるマルウェア対策ソフトが有効に機能しない

45 サイバーセキュリティーニュース 多数メールクライアントに送信者偽装できる「Mailsploit」が判明 - 送信ドメイン認証では防げず


Download ppt "ホストのセキュリティ 情報工学専攻 1年 赤木里騎 P151~172."

Similar presentations


Ads by Google