• 沒有找到結果。

第一章 序論

1.4 論文架構

在第二章我們會介紹認證協定基本概念和常用的標記,另外還有本文中會用 到的標記和定義。第三章詳細的介紹我們演算法的想法、架構和可以找出哪些範 圍的漏洞。第四章顯示程式的介面和分析模擬後的結果。第五章結論和提出未來 可以改進的方向。

第二章 何謂認證協定

2.1 認證協定的基本概念

z 認證協定指的是至少兩個或兩個以上的參與者經過一連串的訊息傳遞後,可 以確定彼此身份的一系列步驟。

z 認證協定必須由第一個訊息開始,由最後一個訊息結束,而且訊息必須從第 一個依序到最後一個,其中任何一個訊息不能沒有執行到,否則認證協定就 會中止。

z 認證協定中的參與者通常除了要溝通的雙方之外還會有一個受信任的第三 者(通常用S來代表受信任的第三者)。

z 認證協定中所使用的加解密演算法有三種類型,第一類是對稱式加密演算 法、第二類是非對稱式加密演算法,最後一類是前兩個類型交互使用。

2.2 認證協定常用的標記

z Na:由參與者 A 產生的亂數。

z Ta:由參與者 A 產生的 Timestamp。

z A:參與者 A 的 identity。

z Kas:代表只有參與者 A 和受信任的第三者 S 才擁有的 key。

z Kab:參與者 A 和參與者 B 在這次溝通中用來加解密的 Session key。

z {message}Kas:message 用 Kas 加密。

2.3 自訂的標記和定義

z Message:認證協定中的每一個訊息都是 Message,也就是說認證協定是由 多個 Message 所組成的。如圖 2.1 總共有五個 Message。

z Item:以圖 2.1 的第一個 Message 來說,這個 Message 有三個 Item,分別是

A、B、Na。Item 可以是沒有加密過的,也可以是有加密過的,甚至於可以 是多重加密的(例如{Na, A, {Na}Kas}Kas、{Na}Kas 都是 Item)。

z 資料數量:有多少個 Item。如果是要計算 Message 有多少個資料數量,那麼 只要計算這個 Message 有多少 Item 即可,不必管 Item 是否有多重加密。如 果是要計算一個 Item 有多少個資料數量,假設這個 Item 沒有加密,那麼資 料數量只有一個,假設這個 Item 有加密,那麼只要計算被這個 Item 加密的 Item 有多少個,一樣不必管 Item 是否有多重加密。舉例來說,圖 2.1 的第 二個 Message 只有一個資料數量(也就是{Na, B, Kab, {Kab, A}Kbs}Kas),

而這個 Item 有四個資料數量(也就是 Na、B、Kab 和{Kab, A}Kbs)。

z 重要的 Item:顧名思義指的是 Item,而這個 Item 必須是有加密過的,並且 還要跟接下來的 Message 比對才可判斷是否是重要的 Item。判斷方式詳見 3.2.2 節。

z 有意義的 Item:Attacker 可以製造出來或拿的到也看的懂的 Item,也就是說 Attacker 可以控制這個 Item。如果 Item 沒有加密,很顯然 Attacker 可以製造 出這個 Item 而且也看的懂這個 Item 是什麼;如果 Item 有加密,Attacker 不 一定可以製造的出來或看的懂這個加密的 Item 裡面的資料是什麼。

z 沒有意義的 Item:Attacker 無法製造出來或拿的到但看不懂的 Item。很明顯 沒有意義的 Item 一定是有加密的 Item,因為這樣 Attacker 才會看不懂是什 麼資料。

圖 2.1: Needham-Schroeder Protocol

第三章 系統設計與實作

在這一章節中,我們開始詳細的介紹我們提出的驗證演算法,在顯示這個演 算法的虛擬碼時也同時說明這樣子做的原因。

3.1 Proposed 驗證認證協定演算法的介紹

要攻擊金融機構的安全系統,必須要先對他們的系統有深入的了解,剖析之 後才能知道要怎麼攻擊這個系統。在法律方面,要鑽法律漏洞必須要先對法律條 文滾瓜爛熟之後才能知道有哪些法律遺漏、沒有規範到的事情。即使在認證協定 也是一樣的,要防止任何人入侵,破壞我們的系統之前,必須要先知道我們的系 統有哪些漏洞可能會被攻擊,也就是說要防護之前必須要先知道怎麼破壞。因此 為了要找出認證協定的漏洞,我們希望能夠站在 Attacker 的角度上來剖析認證協 定。當 Attacker 要攻擊認證協定的時候,他並不是想要攻擊就可以攻擊成功,而 是會去把所有可以搜集的資料都搜集齊全,接著在尋找如何利用這些現有的資料 去攻擊。這個想法就是我們演算法的中心概念。

以 Attacker 的想法來剖析認證協定之後,我們發現兩個重要的特性。

z 要攻擊的目標 Item ( 重要的 Item )

Attacker 攻擊認證協定時,並不是真的盲目的用暴力法去攻擊整個認證協 定,而是會去剖析認證協定找出認證協定中的缺陷,就像鑽法律漏洞一樣,另闢 一條不正當的路徑來達到相同的目的。在我們看了很多認證協定後,我們發現認 證協定中的 Item 可以分為兩類,一類只是單純的訊息傳遞而已,另一類是用來 確認身分的 Item。因此很明顯的 Attacker 要攻擊的 Item 就是認證協定中用來確 認身分的 Item。只要 Attacker 能夠攻擊這些 Item 就可以成功的攻破認證協定。

z 可以利用的資源

當 Attacker 決定了攻擊目標之後,不會就這樣一股腦的去攻擊目標,而是會 盡量的去蒐集所有他可以到手的資料,然後想盡辦法去攻擊它。另外我們都知道 網路是一個很不安全的地方,任何人都可以在網路上攔截封包,當然 Attacker 也不例外。因此很明顯的 Attacker 可以拿到要攻擊的認證協定的所有 Item,拿到 這些 Item 之後,Attacker 會盡其所能的想辦法直接使用這些 Item 來當成要攻擊 的目標 Item( 重要的 Item )或是用來製造出要攻擊的目標 Item( 重要的 Item ),

以便來欺騙別人。

因此我們希望能找出所有可以利用的資源,並利用這些可以利用的資源來攻 擊要攻擊的目標 Item( 重要的 Item )。

3.2 Proposed 驗證認證協定演算法

在這一小節中,我們會先介紹我們設計用來儲存認證協定中的 Message、Item 這些資料的 Data Structure 並舉例說明如何將這些資料完美的連結起來。接下來 我們會介紹如何找出 3.1 節裡提到的攻擊的目標 Item( 重要的 Item )和可以利用 的資源這兩個特性。接著再繼續介紹我們如何找出認證協定的漏洞。

3.2.1 Data Structure

在這一小節中,我們提出我們設計的 Structure Message 和 Structure Item,這 兩個 Structure 分別是用來儲存認證協定中的 Message 和 Item。

struct Message {

String source; //記錄 source String destination; //記錄 destination Item item; //記錄 item;

Message *next; //記錄下一個 Message 的位置 }

struct Item {

String content; //記錄 Item 的內容 String key; //記錄用來加密的 key int number; //記錄總共有多少個 Item 數量

int location; //記錄 Item 是屬於認證協定的第幾個 Message Boolean important; //記錄 Item 是否是重要的 Item,預設是 False Boolean flag; //記錄是否已經找到可以攻擊的 Item,預設是 False Item*next; //記錄下一個 Item 的位置

Item*include; //記錄被加密的 Item 的位置 }

舉例說明:

假設有一個 Message 是 A -> B : A, {A, {Na}Kas}Kbs, Na。

1. 宣告一個 Message 變數是 message。

2. parsing 此 Message 後

2.1 A 會記錄在 message.source 2.2 B 會記錄在 message.destination

2.3 而 Message 的 item(A, {A, {Na}Kas}Kbs, Na)經 parsing 後會記錄在 message.item

2.4 *next 記錄下一個 Message 的位置。沒有下一個 Message 就是 NULL。

3. 首先分析第一個 item:A

3.1 由於這個 item 沒有被加密,所以變數 content 會被記錄為 A。

3.2 由於這個 item 沒有被加密,所以 message.item.key 仍然是 NULL。

3.3 由於這個 item 沒有被加密,所以資料數量只有一個,number 被記錄為 1。

3.4 假設此 Message 是認證協定的第一個 Message,則 location 會被記錄為 1。

3.5 當此 Item 被分析為重要的 Item 時,important 才會被記錄為 True。

3.6 flag 記錄該 item 是否已經被找到可以用來代替自己的 item。

3.7 *next 記錄下一個 item({A, {Na}Kas}Kbs)的位置。

3.8 由於這個 item 沒有被加密。因此變數 include 仍然是 NULL。

5. 全部分析完畢後,會變成圖 3.1 這樣的結構。因為 important 和 flag 這兩筆資 料在分析重要的 Item 和尋找漏洞的時候才有可能改變,因此在圖 3.1 中我們 就不顯示這兩筆資料的內容。

message

A B item null

A null 1 1 null

null Kbs 2 1

Na null 1 1 null null

A null 1 1 null

null Kas 1 1 null

Na null 1 1 null null

圖 3.1: Message & Item Linked list

3.2.2 尋找攻擊的目標 Item( 重要的 Item )

在我們想好驗證認證協定演算法的設計概念之後,接著就開始設計我們的驗 證認證協定演算法,首先就是要先找出 3.1 節裡提到的攻擊的目標 Item( 重要的 Item )和找出可以利用的資源。只有找好這些資料後才可以來尋找認證協定是否 存在漏洞。

我們先將認證協定裡的每一個 Message、每一個 Item 讀取、parsing 後建成 3.2.1 節中的 Data Structure 並且同時將這些資料一一的串接起來。接下來我們 利用建好的 Structure 根據下面的方法(analyze 和 include 這兩個 function)來尋

找攻擊的目標 Item( 重要的 Item )。

void analyze( Message protocol )

{ /* 參數 protocol 代表建好的認證協定 Message 和 Item 的資料串列 */

int numberOfImportant = 0; //記錄找到多少個重要的 Item Item important; //Item is a linked list;

Item nextItem;

Item item_temp;

Boolean flag = false;

Item itemUsingKab;

Message message_now = protocol;

/* 找出最後一個 Message */

while( message_now.next != null )

message_now = message_now.next;

item_temp = message_now.item;

/* 處理最後一個 Message */

while(item_temp != NULL ) {

if( item_temp is ciphertext ) {

if( item_temp.key is not session key) {

item_temp.important = true;

copy the item_temp to important;

//copy 代表將這個 item 複製到 important(不包含 Structure 裡的 next 欄位)。

numberOfImportant++;

flag = true;

} else

copy item_temp to itemUsingKab;

}

item_temp = item_temp.next;

}

if( flag == true && itemUsingKab != null) {

itemUsingKab.important = true;

copy itemUsingKab to important;

numberOfImportant++;

flag = true;

}

/* 處理倒數第二個到第一個 Message */

while( message_now != protocol ) {

/* 找出前一個 Message */

Message Pre_message = protocol;

if( Pre_message != message_now )

while( Pre_message.next != message_now ) Pre_message = Pre_message.next;

message_now = Pre_message;

nextItem = message_now.next.item;

item_temp = message_now.item;

while( item_temp != NULL ) {

boolean add = false;

if( item_temp is ciphertext ) {

if( item_temp.key is not session key) {

/* 將目前分析的 Message 跟他之後的所有 Message 比對 */

if( nextItem 是目前分析的 Message 的下一個 Message) {

if( include(nextItem, item_temp) == false ) {

item_temp.important = true;

copy the item_temp to important;

//copy 代表將這個 item 複製到 important(不包含 Structure 裡的 next 欄位)。

numberOfImportant++;

add = true;

} }

if( include(nextItem, item_temp) == true ) {

if( the item which include this item_temp is the important item)

{

item_temp.important = true;

copy the item_temp to important;

//copy 代表將這個 item 複製到 important(不包含 Structure 裡的 next 欄位)。

numberOfImportant++;

add = true;

item_temp = item_temp.next;

}

if( flag == false && add == true ) {

itemUsingKab.important = true;

copy itemUsingKab to important;

numberOfImportant++;

flag = true;

} }

if( numberOfImportant == 0 )

The Protocol does not have any encrypted data。

}

Analyze function 的用意就是要找出攻擊的目標 Item( 重要的 Item ),這個 function 會先找到認證協定的最後一個 Message,然後找出這個 Message 中所有

有加密而且用來加密的 key 不是 session key 的 Item,之後將這些 Item 記錄在 important 並同時遞增 numberOfImportant。如果一個 Message 中找到用 session key 加密的 Item,那麼是否要記錄下來?只有當此 Message 中有不是用 session key 加密的 Item 被記錄到 important 裡的時候才要記錄到 important 裡,否則不理會。

接著找出認證協定的倒數第二個 Message,將這個 Message 中所有有加密而 且用來加密的 key 不是 session key 的 Item 找出來,接下來利用 include function 來判斷找到的這些 Item 是否出現在這個 Message 之後的 Message,如果沒有出現 在下一個 Message 中就將 Item 記錄到 important 並同時遞增 numberOfImportant;

如果有出現在下一個 Message 或是在下一個 Message 之後的 Message 中,就要看

如果有出現在下一個 Message 或是在下一個 Message 之後的 Message 中,就要看

相關文件