搜尋此網誌

顯示具有 技術分享 標籤的文章。 顯示所有文章
顯示具有 技術分享 標籤的文章。 顯示所有文章

2010年10月27日 星期三

[技術分享] ReDoS

BlogTH78201031549ReDoS? 可不是再次的阻斷服務攻擊 (Re-DoS),而是正規表示式阻斷服務攻擊 (Regular Expression DoS),是阻斷服務攻擊的一種手法。對於一般的程式開發,雖然不見得常使用到正規表示式的應用,但是正規表示式卻常見於各式各樣的過濾器上。所以像是網站應用程式的輸入檢查、快取伺服器或其他類型閘道器的存取過濾功能,通常都有正規表示式的存在。

正規表示式最基本的應用就是用來尋找資料中是否含有特定樣式的內容,例如我們可以透過正規表示式來判斷一個文字檔內是否含有手機號碼,而判斷條件就是以0為開頭的連續10個數字 (這個條件可能不適合用來找出所有可能的手機號碼,但是無損於說明性)。也因此正規表示式的應用至少含有兩個部分,一個就是用來當做搜尋的樣式 (Pattern,通常這部份也稱為正規表示式),以前述的例子而言就是”以0為開頭的連續10個數字”。另外一部分則是用來被搜尋的輸入目標,以前述的例子而言就是文字檔的內容。而正規表示式阻斷服務攻擊發生在利用某些樣式進行搜尋時將有可能會產生大量消耗運算資源的情況,因而使得系統無法處理其他的請求。這也是它為什麼被稱為阻斷服務攻擊的原因了。

至於”某些樣式”是哪些樣式,在 OWASP 上面的說明文件舉了一些例子,包含

  • (a+)+
  • ([a-zA-Z]+)*
  • (a|aa)+
  • (a|a?)+
  • (.*a){x} | for x > 10

而前些日子 Microsoft 則推出了一個 Regex Fuzzer 的工具,宣稱可以用來驗證所輸入的正規表示式是否存在遭受正規表示式阻斷服務攻擊的隱憂。不過根據我測試的結果,這個工具的執行結果跟 OWASP 上面的例子並沒有完全一致。以目前的情況而言,想要避免正規表示式阻斷服務攻擊最保險的作法似乎就是限制被搜尋目標的內容長度。如果內容長度過長甚至無法加以限制時,自行利用 Fuzzing 的概念 (或利用 Regex Fuzzer,如果你相信它的話) 加以測試將會是比較安全的作法。

 

相關連結:

2010年10月8日 星期五

[技術分享] 用了參數化查詢就可以對 SQL Injection 高枕無憂? NO!

sql-injection在上個月的一篇文章中,我們看到 WhiteHat Security 對於避免 SQL Injection 的危害提出了 10 個手法。其中第 7 個手法,使用”參數化的查詢 (在 Java 的程式語言中主要是透過 PreparedStatement 來提供) 並避免使用動態式的查詢”對許多人來說應該算是老生常談了。事實上,程式內未採用參數化查詢大多不是因為技術上的考量,因為除了極少數的情況 (通常與效能有關) 外,參數化查詢都是可以順利運作的。在無法採用參數化查詢的原因中,最常見的情況就是使用了預儲程序 (Stored Procedure)。預儲程序如果小心使用,對於 SQL Injection 其實也有一定的防護能力。但是預儲程序畢竟不像參數化查詢那般嚴謹,所以提供這些功能的程式碼無法事先做太多的防範措施,大多數防護的責任還是落在系統開發者自行開發的程式上。而參數化查詢因為會嚴格限制每個參數的型別,所以提供此一功能的程式就可以做好萬全的準備,讓系統開發者在撰寫自己的程式時不需太過擔心。所以除非被限制必須使用預儲程序來存取資料,否則我們就應該採用參數化查詢來存取資料。

參數化查詢與預儲程序之間的取捨,往往還有許多其他非技術的因素,但是這並不是我這篇文章的重點,所以這個問題就在此打住。當我們確實採用了參數化的查詢後,是否就可以對 SQL Injection 高枕無憂了呢?很可惜的是,答案依舊是否定的。如果我們仔細審視第一段的藍色文字,可以發現後半段是避免使用動態式的查詢。而前、後段文字使用”並”加以連結,所以一旦使用者違反了後半段文字的限制,即使使用參數化查詢依舊會遭受 SQL Injection 的攻擊。因為這點對於部分的系統開發者來說或許並不是那麼熟悉,所以接下來我將以實際的例子 (Java 語法) 來加以說明。我假設我們擁有一個稱為 users 的資料表,內含 name 與 password 兩個欄位,分別表示使用者的姓名與密碼。而在此資料表中有一個使用者的姓名與密碼分別為 ‘cyril wang’ 與 ’1234’。

1. 這是 PreparedStatement 的標準用法,也就是利用 setXXX 的方式 (程式碼第 9, 10 行) 來明確指定資料的型別。因為使用者輸入 (參見備註1) 的帳號與密碼相對應,所以此程式執行完後可以取得該使用者的ID。

備註1:雖然在所有的程式範例中, userInputForUsername 與 userInputForPassword 兩個變數的值是固定的,但是在一般程式中此兩變數的值通常來自於一般使用者 (或駭客) 的輸入。

  1: Class.forName("com.mysql.jdbc.Driver");
  2: Connection c =
  3:     DriverManager.getConnection(url, account, password);
  4: 
  5: String userInputForUsername = "cyril wang";
  6: String userInputForPassword = "1234";
  7: String sql = "SELECT * FROM users WHERE name=? AND password=?";
  8: PreparedStatement stmt = c.prepareStatement(sql);
  9: stmt.setString(1, userInputForUsername);
 10: stmt.setString(2, userInputForPassword);
 11: ResultSet rs = stmt.executeQuery();
 12: if (rs.next()) {
 13: 	System.out.println("Your ID is " + rs.getInt(1));
 14: } else {
 15: 	System.out.println("Get out!");
 16: }


 



2. 當使用者 (或駭客) 嘗試輸入 SQL Injection 的攻擊字串,PreparedStatement 的實作會將字串內容加以過濾。因為帳號與密碼無法對應,因此無法取得使用者的 ID。



  1: Class.forName("com.mysql.jdbc.Driver");
  2: Connection c =
  3:     DriverManager.getConnection(url, account, password);
  4: 
  5: String userInputForUsername = "cyril wang' OR 1=1--'";
  6: String userInputForPassword = "aaaa";
  7: String sql = "SELECT * FROM users WHERE name=? and password=?";
  8: PreparedStatement stmt = c.prepareStatement(sql);
  9: stmt.setString(1, userInputForUsername);
 10: stmt.setString(2, userInputForPassword);
 11: ResultSet rs = stmt.executeQuery();
 12: if (rs.next()) {
 13: 	System.out.println("Your ID is " + rs.getInt(1));
 14: } else {
 15: 	System.out.println("Get out!");
 16: }


 



3. 仔細看程式碼第 5 行到第 11 行的寫法,這種常見於一般 SQL 查詢的用法對 PreparedStatement 來說也是合法的,而這種用法就稱為動態式查詢。因為使用者輸入的對應的帳號與密碼,因此可以取得 ID。



  1: Class.forName("com.mysql.jdbc.Driver");
  2: Connection c = 
  3:     DriverManager.getConnection(url, account, password);
  4: 
  5: String userInputForUsername = "cyril wang";
  6: String userInputForPassword = "1234";
  7: String sql = "SELECT * FROM users WHERE name = '" +
  8: 	         userInputForUsername +
  9: 	         "' AND password ='" +
 10: 	         userInputForPassword +
 11: 	         "'";
 12: PreparedStatement stmt = c.prepareStatement(sql);
 13: ResultSet rs = stmt.executeQuery();
 14: if (rs.next()) {
 15: 	System.out.println("Your ID is " + rs.getInt(1));
 16: } else {
 17: 	System.out.println("Get out!");
 18: }


 



4. 使用者 (或駭客) 再次嘗試輸入 SQL Injection 攻擊字串,而這將是一次成功的攻擊。儘管沒有輸入對應的密碼,使用者 (或駭客) 依舊取得 ID。



  1: Class.forName("com.mysql.jdbc.Driver");
  2: Connection c = 
  3:     DriverManager.getConnection(url, account, password);
  4: 
  5: String userInputForUsername = "cyril wang' OR 1=1--'";
  6: String userInputForPassword = "aaaa";
  7: String sql = "SELECT * FROM users WHERE name = '" +
  8: 	         userInputForUsername +
  9: 	         "' AND password ='" +
 10: 	         userInputForPassword +
 11: 	         "'";
 12: PreparedStatement stmt = c.prepareStatement(sql);
 13: ResultSet rs = stmt.executeQuery();
 14: if (rs.next()) {
 15: 	System.out.println("Your ID is " + rs.getInt(1));
 16: } else {
 17: 	System.out.println("Get out!");
 18: }


 



從上面這些簡單的範例程式中,我們可以看到如果在參數化查詢指令中使用了動態式的查詢,那麼程式依舊無法避免 SQL Injection 的問題,也因此我們應該盡力避免使用動態式的查詢。如果動態式的查詢確實有其必要性,做好輸入的檢查 (Input Validation & Sanitization) 就是不可避免的手法。其實以安全的角度來看,不管是不是使用參數化查詢,都應該做好輸入的檢查動作才是。



以目前常見的兩大網站安全問題來看,SQL Injection 的問題與解決之道相對比 Cross-Site Scripting 單純多了,因此我們實在沒有理由讓 SQL Injection 一直肆虐下去。對於已經完成或開發中的程式,採用自動化的白箱工具可以有效地找出所有有問題的程式碼,以避免花費大量時間進行人工搜尋。而透過對系統開發人員的教育訓練,則可以讓 SQL Injection 的問題防範於未然,此時白箱工具則可由原先找出問題的角色轉換為確保安全品質與稽核的角色。正確的觀念 (從單位主管到系統開發人員) 再加上合適的工具,SQL Injection 的避免並沒有想像中的那麼遙不可及。



備註2: 在多層次防禦的概念下,除了使用參數化查詢外,其他手法還是有其必要性,而前述 WhiteHat Security 的文章可作為參考。但是千萬切記勿落入”這就是全部可用的手法”的誤解中,以免因為疏忽而產生危害。

2010年7月10日 星期六

[技術分享] Cross-site Request Forgery (Part 2)

csrf_wizard_sleeves_tshirt-p2357758638809497577c6n_152 在上一篇的文章中,我們了解到何謂 CSRF 以及其運作原理,在這篇的文章中我想要談談網站開發者與使用者該如何做才能避免 CSRF 的威脅。

要避免 CSRF 的攻擊,目前公認最有效的方式就是所謂的 Synchronizer Token Pattern。簡單來說,Synchronizer Token Pattern 指的是每次使用者發出請求時 (不管是透過 POST 還是 GET) 都必須傳回一個網站系統所指定的亂數,而這個亂數可以設計成適用於整個 Session 階段,也可以設計為只能使用一次。以安全性而言,後者的作法確實可以達到相當好的效果,但是卻也會為使用者帶來極大的不便性,所以在大部分的情況下前者反而是比較常用的作法。其實後者的作法除了應用在增加安全性之外,也常被用來作為避免使用者重複發出請求的保護措施。使用者重複發出請求尤其容易出現在反應較慢的系統中,使用者因為失去耐心或不知所措之下往往只好重複之前的動作 (請求)。

等等,在使用 GET 的情形下,Synchronizer Token 不就等於直接擺在 URL 參數中讓人取用,那怎麼還有安全性可言?別忘了在 CSRF 攻擊中,通常駭客是無法取得受害者與目標網站之間溝通的訊息,所以這樣的作法依舊大幅增加駭客產生合法請求的困難度。再加上 Synchronizer Token 的有效期僅存在單一 Session、甚至是單一請求中,因此就算駭客取得 Synchronizer Token 後也往往無濟於事了。此外,透過 SSL 進行連線可以讓 Synchronizer Token 被”看到”的機會大大降低。

Synchronizer Token 的一個特例就是直接把 Session Token 當作 Synchronizer Token 使用,這種方法又稱之為 Double Submit Cookies。使用 Double Submit Cookies 的好處是比較方便,網站系統不需要另外維護一份 Synchronizer Token 的對應關係表,但是這樣做卻會讓 Session Token 處於一個較危險的狀況,增加了 Session Hijacking 攻擊的成功機會。

除了 Synchronizer Token 外,還有一些其他的手法也會被用於應付 CSRF,像是只接受 POST 的方式、檢查 Referer 標頭、將單一請求就可以完成的流程拆成多個請求、URL 重導、秘密的 Cookie (Secret cookie) 等方式。然而這些方法頂多增加 CSRF 攻擊的困難度,甚至有些方法對於應付 CSRF 並沒有任何的助益,在使用上必須多加小心。話雖如此,上述手法中有一個手法被很多網站系統所應用,那就是將單一請求就可以完成的流程拆成多個請求。然而這個手法在實際應用上必須稍加變形,也就是在後面的請求中加上一個駭客 (或瀏覽器) 無法知悉的秘密。沒錯,我講的就是現在很多網站系統會在使用者進行重要請求時 (例如修改密碼) 要求使用者再次輸入密碼。因為駭客無法得知使用者的密碼,再加上密碼並不存在於瀏覽器之內 (記得要關閉瀏覽器記憶密碼的功能),所以可以有效避免使用者遭受 CSRF 攻擊。需要特別注意的是,就算採用了再次輸入密碼的保護措施,依舊不可遺漏了 Synchronizer Token Pattern 的使用。

以上這些方法都是針對網站系統開發人員而言,那麼一般使用者該怎麼做才能保護自己免於 CSRF 的攻擊呢?OWASP 對此有三項建議:

  1. 不使用網站服務時儘快登出 (Logoff immediately after using a web application)。
    嚴格來說,要做到這點越來越不容易,因為現在大部分網站系統就是強調 Alwasy On,努力增加使用者停留的時間。所以之間如何取捨,可就得由使用者自行衡量了。好消息是像網路銀行這類重要的網路系統通常在使用者停止操作後就會在很短的時間內自動登出,以減少遭受攻擊的機會。
  2. 不要使用瀏覽器記憶帳號/密碼的功能,也不要使用網站的”記住我”(Do not allow your browser to save username/passwords, and do not allow sites to “remember” your login)。
  3. 針對一般性的網路瀏覽與存取重要網站服務採用不同的瀏覽器。如果不能採用不同的瀏覽器,至少應該使用不同的視窗,也就是不要使用分頁的方式 (Do not use the same browser to access sensitive applications and to surf freely the Internet; If you have to do both things at the same machine, do them with separate browsers)。
    瀏覽器的選擇除了受到電腦環境的限制外,往往還跟使用者的習慣有很大的關係,因此採用不同的瀏覽器說起來很容易,但是卻很少使用者會這麼勤勞。好在現在已經有部分瀏覽器 (Firefox、Chrome) 推出所謂私密瀏覽的功能,我們可以使用標準模式來進行一般性的網路瀏覽,並透過私密瀏覽來存取重要的網站服務。因為私密瀏覽是一個獨立的空間,與標準模式下的空間彼此互不相干,簡單來說就是在私密瀏覽內的登入資訊 (如 Session Token) 在標準模式下是不存在的。使用私密瀏覽除了可以避免 CSRF 的攻擊外,也可以避免留下任何存取的紀錄與軌跡,這點在使用公共電腦上網時顯得格外重要。

最後,OWASP 提供了 Java、.NETPHP 的 Synchronizer Token Pattern 實作範例,有需要的讀者就請自行參考與取用了。

 

相關連結:

[技術分享] Cross-site Request Forgery (Part 1)

csrf_wizard_sleeves_tshirt-p2357758638809497577c6n_152 Cross-site Request Forgery,常縮寫為 CSRF (或 XSRF),中文翻譯稱之為跨網站的偽造要求。除了這些稱呼,其他像是 Cross-site Reference Forgery、Session Riding、One-click Attack 等等各式各樣的名稱,其實指的都是同一種攻擊手法。 CSRF 跟 XSS (Cross-site Scripting) 都是跨網站的攻擊手法,但是 CSRF 利用的是使用者對於瀏覽器的信任而達到攻擊目的,而 XSS 則是利用使用者對於網站本身的信任。

簡單來說,CSRF 就是在使用者不知情的情況下,讓瀏覽器送出請求給目標網站以達攻擊目的。 對於 HTTP 協定有所了解的讀者,看到這句話可能會覺得很困惑。因為在預設的情況下,任何人只要知道 URL 與參數都可以對網站發出任何請求,如此說來不是所有的網站都會遭受 CSRF 的攻擊了嗎?可以說是,也可以說不是。因此嚴格來說,CSRF 通常指的是發生在使用者已經登入目標網站後,駭客利用受害者的身分來進行請求,如此一來不但可以獲得受害者的權限,而且在系統的相關紀錄中也很難發現可疑之處。

在進一步談到 CSRF 的攻擊手法之前,我要先談一下一般網站應用程式是如何識別使用者的身分。對於需要辨別使用者身分的網站而言,最常見的方法就是依靠帳號/密碼。凡使用者想要進行受限制的動作時,就必須先經過帳號/密碼的驗證。但是如果在每次進行受限制動作前都要輸入一遍帳號與密碼,我想沒有多少使用者可以忍受這樣的不便。所以所有的網站系統都會把使用者輸入且通過驗證的帳號資訊記錄下來,之後就不再進行驗證的動作了。然而因為 HTTP 協定的限制 (Stateless),所以如何紀錄這個驗證過的帳號資訊就成了棘手的問題。早期有些系統會將帳號本身紀錄在 Cookie 中,因為 Cookie 的特性就是瀏覽器在每次存取網站的同時會將內容傳回去,所以網站系統就可以從 Cookie 中獲得帳號的資訊。然而因為 Cookie 存放在使用者的電腦中,算是一個極不安全的環境,因此後來的網站系統都是在 Cookie 中存放一個隨機亂數產生的代號,網站系統再經由這個代號找出相對應的帳號資訊,這個代號我們通常稱之為 Session Token。Session Token 的概念與實作雖然很簡單,但是安全性卻依舊不足,所以為了提昇 Session 的安全性就必須採用其他補強措施。像是 Session Token 自動失效、定期更新 Session Token 的數值、加上檢查 Session Token 來源 IP 位址等方式,都可以用來增加 Session 的安全性 (主要是避免 Session Hijacking)。除了利用 Cookie 來紀錄 Session Token 外,其他像是把 Session Token 放在 URL 參數中,或是使用 Basic Authentication 的方式,雖然細節上有些不同,但是基本的原理卻都是一樣的。

偷取使用者身分比較有名 (傳統) 的手法正是前述的 Session Hijacking,CSRF 雖然跟 Session Hijacking 很類似,但是跟 Session Hijacking 不一樣的是 CSRF 並沒有真正控制整個 Session (例如取得 Session Token),而只是利用瀏覽器自動回傳使用者身分識別資訊 (如 Session Token) 的功能,讓發出的請求變成受害者的身分。所以 CSRF 利用了受害者的 Session,但是卻沒有直接進行控制,這也是為什麼 CSRF 又被稱為 Session Riding 的理由。雖然 CSRF 可以產生的破壞動作不像 Session Hijacking 那般不受限制,但是因為在 CSRF 中請求確實是由受害者的瀏覽器所發出,所以事後很難追蹤問題發生的來源,而且所有用來解決 Session Hijacking 的手法也幾乎沒有辦法避免 CSRF。此外因為進行 CSRF 攻擊時請求是由受害者的瀏覽器所發出,所以可以用來攻擊內部的 (對受害者而言) 網站系統,這點往往是 Session Hijacking 所做不到的。

CSRF 可能的攻擊情境之一可以用下列圖示加以說明:

CSRF 01

CSRF 02

CSRF 03

根據 OWASP 的文件,一個 CSRF 攻擊要成功有四個要素:

  1. 瀏覽器處理 Cookie 與 Basic Authentication 的行為 (Web browser behavior regarding the handling of session-related information such as cookies and http authentication information)。
    因為這部份是 HTTP 相關協定的規範,所以我們無法針對此點做任何防範。
  2. 駭客對於網址的知悉 (Knowledge by the attacker of valid web application URLs)。
    如果目標網站是一個公開的系統,駭客取得 URL 資訊並不是什麼困難的事情。但是對於內部私有系統而言,駭客必須透過社交工程或其他手法取得這些資訊。
  3. 網站系統的 Session 管理依靠瀏覽器所擁有的資訊 (Application session management relying only on information which is known by the browser)。
    嚴格來說,這點才是 CSRF 會造成破壞的真正元兇,而且所有的防範機制也都是針對此一要素。
  4. 可以觸發使用者瀏覽器發出請求的網頁元素 (Existence of HTML tags whose presence cause immediate access to an http[s] resources; for example the image tag)。
    駭客可以將需要假冒的請求放到某個網頁的 image 標籤中 (也就是 <img src=”…” />),如此一來當受害者瀏覽到這個網頁後瀏覽器就會自動發出請求。因為瀏覽器在發出請求前無法判別請求的資源是否確實為圖檔,所以無論如何都會造成請求訊息的傳送 (除非使用者關閉了自動下載圖片的功能,但是我想應該沒有使用者會這樣做吧)。當然駭客也可以利用別的方式誘騙使用者按下連結,但是採用 image 標籤的方式並不需要使用者的點選就可以自動執行,所以算是最為有效的手法。
    這個用來發動攻擊的網頁,通常是存放在另外一個不相干的網站系統之內。可能是受駭客控制的網站,也可能是駭客利用 XSS 等手法將假冒請求指令植入的無辜網站。如果這個無辜的網站恰巧正是目標網站本身,這種攻擊手法又稱之為 Stored CSRF,其產生的危害將更加地可怕。也就是說駭客利用 XSS 等手法將假冒的請求先植入目標網站中,因為前來瀏覽目標網站的使用者已經登入系統的可能性相對提高許多,所以 CSRF 成功的機會也隨之大幅提高。而且 Stored CSRF 因為攻擊網頁與假冒的請求屬於同一個網站,所以採用多個瀏覽器進行不同網站間瀏覽的保護方式並沒有什麼作用。事實上, Stored CSRF 對使用者而言幾乎是沒有什麼方法可以加以避免的。
    除了可以使用 XSS 手法植入假冒的請求外,如果網站系統允許使用者透過 URL 連結外部圖檔但是卻沒有檢查連結資源是否確實為圖檔,也很可能遭受這樣的攻擊。也就是說像 Web Mail 這類可以接受內嵌外部圖檔的訊息網站,很容易成為駭客用來發動 CSRF 的平台。

對 CSRF 有所了解後,在下一篇的文章中我們來談談如何避免 CSRF 的危害。

2010年7月6日 星期二

[技術分享] Clickjacking

前一陣子在一次偶然的機會中,被一位高手問到 (應該說是考到) 什麼是 Clickjacking,又要怎麼防備?老實說,雖然 Clickjacking 這個手法剛被提出時我就注意到相關的新聞,但是當時尚未公布實際的手法,再加上 Clickjacking 一直不像 SQL Injection、XSS 這些手法這麼普及 (OWASP Top 10 還排不上),所以後來我就一直沒有動力去研究 Clickjacking 這個手法。因此,只記得當時我真的是比穿黑衣還掉了滿身的頭皮屑還糗。不過話說回來,學習永遠不嫌晚,所以我趕緊惡補了一下,並透過這篇文章跟各位分享一下 Clickjacking 這個很危險卻還沒有被廣泛應用的攻擊手法。

Clickjacking,簡單來說就是將使用者在瀏覽網頁的點擊動作進行綁架,讓點擊動作產生非使用者所預期的行為。Clickjacking 最初公布的 例子,也是最著名的例子,就是利用隱形頁框 (invisible iframe) 的方式,讓受害者在不知不覺中”自己”修改 Flash 的安全設定,以利駭客可以遠端控制受害者電腦的攝影機與麥克風,進而進行遠端的監聽/監視。目前常見的資料將 Clickjacing 分為 frame-based clickjacking (又稱為 UI readressing) 與 plugin-based clickjacking 兩大類,但是在阿碼外傳上的 範例 使用修改 onclick 事件處理程序的方式,也可算是另外一種實現的手法。

針對 Clickjacking 的應付之道,可以從伺服器端與用戶端兩方面來談。在伺服器端比較常見的就是使用稱之為 framekiller 的 javascript 程式碼或使用 X-FRAME-OPTIONS 這個專門為了解決 Clickjacking 而新增的 HTTP 回應表頭。 雖然 X-FRAME-OPTIONS 在 Clickjacking 被發表沒多久後就由微軟所提出,但是因為這個機制需要瀏覽器的支援,所以初期多以 framekiller 這類技術為主。framekiller 比較大的限制就是需要 javascript 的執行能力,一旦使用者關閉 javascript 的執行功能時,framekiller 就無用武之地了。或許一般使用者不太會自行關閉 javascript 的執行功能,但是更大的問題在於 IE 可以透過 <IFRAME SECURITY=restricted> 的宣告方式將 javascript 的執行能力加以關閉,也就是說駭客並不需要透過使用者就可以輕易的關閉網頁執行 javascript 的能力。好在經過將近兩年的時間,目前大多數瀏覽器的最新版本都已經支援 X-FRAME-OPTIONS 表頭,唯一的例外是 Firefox…如果你不確定你的瀏覽器是否支援 X-FRAME-OPTIONS 表頭,你可以連到這個 網頁 進行測試,”正確”的結果應該是三個有紅色字樣描述的 iframe 頁框才有顯示資料,其他頁框則為空白。這樣聽起來,Clickjacking 目前似乎是不用太擔心才對,但是事實卻不是如此。根據一份由 Stanford University 與 Carnegie Mellon University 所公布的 研究 顯示,目前大部分網站對於 Clickjacking 的防護依舊存在著明顯的問題。除此之外,上述的作法只能防範 frame-based clickjacking,對於應付 plugin-based clickjacking 並沒有任何的幫助。

前面我提到 Firefox 目前依舊不支援 X-FRAME-OPTIONS 這個表頭,但是 Firefox 的愛用者可別千萬因此而感到失望,反而應該更為高興才是。因為目前客戶端的防範機制中,最為有名且免費的工具就是 NoScript,而它是 Firefox 的 Add-on。NoScript 除了支援 X-FRAME-OPTIONS 外,也可以自動偵測網頁是否存在 framekiller 程式碼並據此限制網頁是否可以被包含在 iframe 當中,因此即使在關閉 javascript 執行能力的情況下依舊可以提供防護。事實上,NoScript 雖然名稱叫做 NoScript,它也確實可以關閉 javascript 的執行能力,但是 NoScript 並不是依靠關閉 javascript 執行能力來防範 Clickjacking 的攻擊。即使在 javascript 可以執行的情況下,NoScript 依舊可以提供 Clickjacking 的防護,也就是說 NoScript 對於 Clickingjacking 的防護跟網頁是否能夠執行 javascript 是沒有關係的。這對不想關閉 javascript 執行能力的使用者來說 (應該大多數使用者都不想關閉 javascript) ,確實是一大好消息。如 NoScript 這類客戶端的防護機制,除了不需仰賴伺服器端的 (程式) 修改就可以運作外,更大的好處是可以同時防護 frame-based clickjacking 與 plugin-based clickjacking。NoScript 最大的問題在於僅作用於 Firefox,使用其他瀏覽器的使用者就必須另尋付費軟體來提供類似的防護了。

 

相關連結:

2010年6月4日 星期五

[技術分享] Tabnabbing - 釣魚攻擊新手法

Aza_Raskin之前我在分享有關釣魚攻擊的手法時,提到了 CEH 的分類。而根據 Aza Raskin 於日前所發表的網誌中,他提到了一種稱之為 Tabnabbing 的新攻擊手法。簡單來說,這種攻擊手法就是利用瀏覽器的頁籤功能,當使用者切換至其它頁籤時,將原先頁籤的內容導到另外一個假冒的網頁,當然,這個假冒的網頁會要求你輸入帳號/密碼。

網誌中提到的攻擊情境為:

  1. 使用者瀏覽你 (含有惡意程式) 的網頁。
  2. 利用程式偵測網頁是否已經失去焦點 (也就是切換到別的頁籤) 並持續一段時間。如果一失去焦點就執行攻擊,被使用者發現的機會相對增加不少。
  3. 將網址列的圖示 (favicon) 改為 gmail 的圖示,並將標題修改成相關的字樣。
  4. 當使用者發現到修改過標題的頁籤時,會以為這是 gmail 的畫面。而當看到畫面呈現登入選項時,將會輸入 gmail 的帳號/密碼進行登入。
  5. 你的程式取得使用者的 gmail 帳號/密碼之後,將畫面導回到真正的 gmail 網址。如果原先使用者已經成功登入過 gmail 的帳號,這樣的導向將會更加容易。

在上述的攻擊情境中,有一個比較麻煩的地方,就是如何讓使用者連到含有惡意程式的網頁。回到之前釣魚攻擊的分類中,有一種手法叫做跨網站腳本攻擊 (Cross-Site Scripting Attack) 正可以解決此一難題。透過跨網站腳本攻擊,可以在使用者平常存取的網站中植入我們所需的惡意程式碼,而不需要使用者連到我們所精心設計的網頁。

為了增加成功率,網誌中提到可以實際偵測使用者目前已經登入的網站,然後針對這些網站進行釣魚攻擊。另外,也可以在假冒的網頁上顯示登入逾期的訊息,更進一步降低使用者的疑慮。至於解決之道,Aza Raskin 認為避免使用帳號/密碼當作身分驗證機制是一個比較有效的解法。可惜的是,對於大部分的網站而言,帳號/密碼依舊是最常用、也是唯一的身分識別機制。

Aza Raskin 不只在網誌中說明了這種攻擊手法,而且該篇網誌也會確實執行上述的動作。只不過假冒的網頁是一個 gmail 登入畫面的截圖,而不是可以真正輸入資料的對話框。原本我以為這是他為了展示而不希望讀者真的上當才這樣做,不過他自己倒是解釋為因為太懶才這樣做。除了文字說明外,網誌上也提供了一段實際運作時的錄影片段。有興趣的讀者可以連結到 這裡 試看看囉。

 

相關連結:

2010年6月3日 星期四

[技術分享] 釣魚攻擊

FacebookTop 之前我提到有關釣魚攻擊的研究報告與防範之道,這次我想要針對釣魚攻擊本身做個解釋。釣魚攻擊英文是 Phishing,我沒有拼錯,確實不是 Fishing,據聞這可能是 Phreaking 與 Fishing 的合體字。釣魚攻擊 (原始) 指的是利用假冒成合法的通訊對象,以騙取對方機密資料的手法。常見的例子為透過電子郵件或即時通訊等方式,誘騙使用者進入一個外觀很像合法網站 (如 eBay) 的假網站,之後使用者輸入的帳號/密碼就會被這個假網站所記錄。比較簡單的假網站可能在取得帳號/密碼之後就將使用者導回真正的目標網站,而有些假網站的模擬程度就更高了。但是一般而言,除非有別的安全機制,不然只要取得使用者的帳號/密碼就已經足夠取得使用者所有的資訊,所以假網站通常並不需要很複雜的功能。

魚叉式釣魚攻擊與社交網站

早期的釣魚攻擊多屬於大量散發的形式,所以目標網站的選取除了具備高價值外,也需要具備足夠的使用者。但是現在已經有越來越多針對特定目標 (如某某公司的員工) 的釣魚攻擊,這類攻擊又稱為魚叉式釣魚攻擊 (Spear Phishing)。而因為目標網站必須具備高價值,所以釣魚攻擊主要以假冒拍賣網站、金流或財務服務網站為主。而隨著社交網站的盛行,這類網站也漸漸受到釣魚攻擊者的重視。這類網站本身或許沒有多少直接的金錢利益,但是因為使用者眾,所以可以取得不少珍貴的個人資料,此外找到名人的機會也大了許多。除此之外,因為大部分使用者會有重複使用密碼的習慣,所以透過社交網站取得的帳號/密碼,也可以用來當作入侵其他系統的基礎。

建立釣魚網站

在 CEH 的領域中,把建立釣魚網站分為三個步驟,分別為

  1. 註冊一個假的網域名稱。
  2. 建立一個與目標網站很像的假網站。
  3. 利用電子郵件 (或其他方式,如即時通訊) 的方式誘使更多使用者前往。

不管是在哪一個步驟,都有一個很重要的考量,那就是如何”假”的不會引起使用者的質疑,並一步步地走入惡意份子設計好的圈套。

註冊一個假的網域名稱

首先在第一個步驟上,釣魚攻擊者都會將假網站的網址精心設計,以期誤導使用者的判斷。常用的手法包含

  • 利用子網域的方式。例如使用 http://www.nokia.evil.com/ 可能會讓使用者誤認為這是屬於 nokia 的網站,實際上這卻是 evil.com 的網站。 因為網址的階層是由低到高,跟人類習慣的表達方式是相反的。
  • 利用數字進行視覺的混淆。例如使用 http://www.goog1e.com/ 來假冒是 http://www.google.com/

建立一個與目標網站很像的假網站

可以利用一些複製網站的工具來達成。除此之外,也有專門的工具可以用來製作假的釣魚網站。

利用電子郵件 (或其他方式,如即時通訊) 的方式誘使更多使用者前往

惡意份子會利用各種社交手法,誘使使用者點選連結以前往假冒的網站。常見的情況包含要求使用者因為帳號被停用而必須緊急進行密碼重置的動作,或是登入可以獲得好康贈禮等。除了誘使使用者點選外,這些訊息還必須想辦法隱藏真正的連結,手法包含:

  • 利用連結的顯示文字。例如使用 http://www.nokia.com/ 的方式讓使用者以為點選的連結會連到 www.nokia.com ,但是實際上卻是連到 www.evil.com。 這個方法適用於點選之前。
  • 利用圖片的方式加以連結,而圖片顯示足夠讓使用者產生信心的內容 (如知名品牌的 Logo)。這個方法適用於點選之前。
  • 利用短網址的服務,讓真正連結的網址消失。這個方法適用於點選之前。
  • 利用跳出視窗或 Javascript 的功能,將位置列 (Address bar) 隱藏起來。這個方法適用於點選之後。
  • 使用自動登入的功能。例如使用 http://www.google.com@www.evil.com 這樣的連結,實際上是利用 www.google.com 這個帳號登入 www.evil.com 的網站,而不是連結到 www.google.com 。目前新版的瀏覽器會針對這樣的連結方式產生警告訊息,並要求使用者加以確認。這個方法通常用於點選之後。

攻擊手法

釣魚攻擊除了上述的基本款之外,其實還有其他各式各樣不同的形式。同樣以 CEH 的資料為例,釣魚攻擊可分為下列幾種形式。必須特別注意的是,實際上的攻擊手法並不一定能夠如此明確的加以分類,甚至可能同時混用多種方式。

  • 中間人攻擊 (Man-in-the-Middle Attacks)
  • URL 混淆攻擊 (URL Obfuscation Attacks) - 這就是我們上述的基本款。
  • 跨網站腳本攻擊 (Cross-Site Scripting Attacks) - 利用跨網站腳本攻擊,攻擊者可以在不改變連結網址的情況下執行攻擊程式,並獲取所需的資訊。這個問題屬於目標網站本身的安全漏洞。
  • 隱藏攻擊 (Hidden Attacks) - 利用內插或修改合法網頁內容的方式,改變使用者的使用行為。例如修改登入框,並將登入資訊送到另外一個網站,而非原始的目標網站。這個問題同樣屬於目標網站本身的安全漏洞。
  • 客戶端的弱點 (Client-side Vulnerabilities)
  • 假冒式釣魚攻擊 (Deceptive Phishing)
  • 惡意程式為主的釣魚攻擊 (Malware-based Phishing)
  • DNS 為主的釣魚攻擊 (DNS-based Phishing) - 利用 DNS 快取汙染 (DNS Cache Poisoning) 或是修改 DNS 設定的方式。這種方法通常也歸類在中間人攻擊所用的手法。
  • 內容注射釣魚攻擊 (Content-injection Phishing)
  • 搜尋引擎釣魚攻擊 (Search Engine Phishing) - 透過電子郵件或即時通訊散布訊息有時候很容易引起使用者的忽略與懷疑,但是大多數的使用者不會懷疑搜尋引擎提供的資料。

如果以原始定義來看,有些攻擊手法歸類在釣魚攻擊似乎是有些牽強,然而這就是理論與現實的差異。現實中,惡意份子可不會管甚麼分類不分類,只要有效,就算是不倫不類也沒關係。而如果我們過於拘泥在文字遊戲上面,其實對問題的解決並不會有多大的幫助。

中間人攻擊 (Man-in-the-Middle Attacks)

假冒網站的做法,雖然大多時候有其效果,但是大多僅限於欺瞞警覺心不夠的使用者。對於細心的使用者,甚至是當電腦安裝具備偵測釣魚網站能力的工具時,這樣的做法在效果上就會大打折扣。在此情況下,中間人攻擊就可以派上用場了。所謂的中間人攻擊,就是在你的電腦與目標網站 (如eBay) 之間安插上一個受惡意份子控制的程式。而當你在進行網站瀏覽時,雖然你以為是與真正的網站進行溝通,實際上卻是與這個惡意程式溝通,也因此所有傳輸的資料都將被一覽無遺 (不管加密與否)。使用的手法其實也不複雜,但是技術含量卻較原始的手法高了些,常見手法如下:

  • 修改瀏覽器的快取伺服器 (proxy) 設定。至於如何修改,可以透過其他的惡意程式在使用者不知情的情況下加以修改,或者是假冒為 open proxy 讓使用者自行上當。
  • 利用 DNS 快取汙染 (DNS Cache Poisoning) 的攻擊手法,將合法網站的 DNS 紀錄指向釣魚網站的 IP 位址。
  • 除了 DNS 快取汙染外,也可以修改作業系統的 DNS 設定,並利用惡意 DNS 將合法網站指向釣魚網站的 IP 位址。
  • 在真正的伺服器上安裝通透性快取伺服器 (transparent proxy) ,以便攔截所有進出的資料。

就像所有的攻擊手法一般,釣魚攻擊也在不斷的進化與改變。但是新技術不見得比較有效,反而是那些基本且看似簡單的攻擊手法才是令人防不勝防,所以保持警覺心絕對是必須且最重要的自保法門。

2010年4月5日 星期一

[技術分享] CA 憑證申請過程簡陋而易遭濫用

39882 根據 Betanews 文章的揭露,資訊安全專家 Kurt Seifried 將在下個月的 Linux Magazine 講解有關 CA 憑證申請易遭濫用的問題。簡單來說,步驟如下:

  1. 找尋一個免費的 webmail 服務供應商。
  2. 註冊一個帳號,例如 ssladmin。
  3. 到 RapidSSL.com 購買憑證,記得使用上述註冊的 email 帳號作為申請驗證的帳號。
  4. 完成後續的申請步驟。
  5. 步驟完成後你將會獲得這個 webmail 網域的合法憑證。

好吧,嚴格來說整個過程跟 CA 機制沒有關係,而是在於申請的流程中,CA 憑證發放單位為了便宜行事而採用了簡單的驗證機制,也就是僅檢查 email 帳號。email 會被竊取,對於 webmail 的網域來說更方便,甚至連竊取都不需要。對這些 CA 憑證發放的單位而言,越簡單方便的申請流程不但可以減省成本,還可以順便增加收入,所以何樂而不為。但是這樣的機制卻因為過於簡化而容易遭到濫用,或許是 CA 憑證發放單位始料未及的事情,也有可能是其已知卻不想去面對的問題。事實上,很多廠商在設計業務或產品時,都一再忽略安全的重要性,因為這些東西對大部分的客戶是沒有 (直接的) 價值、甚至是根本感覺不到的。即便是在安全產業內,這種現象也是很普遍,畢竟賺錢這個終極目標,對身處任何產業的公司來說都是一樣的。

事實上,要確認一個申請者是否真的擁有一個網域並不是那麼容易的事情,尤其是當申請的人可能來自於世界上的任何一個角落。以 Google 的服務而言,除了需要網域的 email 信箱外,也需要在網站的根目錄放置一個特殊內容的檔案,才能完成確認的動作。當然,駭客也有可能完成這樣的事情,但是機會相對來說已經減少了許多,更何況當駭客已經可以放置檔案到網站的根目錄,可能他已經有辦法取得網站的憑證,此時還需要自己再去申請一個嗎?此外,透過要求申請者在 DNS 加上一筆特定的記錄以確認網域的擁有權,也可以達到類似的保護作用。很多事情不是做不到,只是看廠商有沒有心思於此。

 

相關連結:

2010年3月13日 星期六

[技術分享] RSA 1024-bit 私鑰在 100 小時內被破解

3-8-10-rsahardwarefaultattackgraphic

三位在密西根大學的學生於日前發表了一份有關破解 RSA 私鑰的論文,在論文中他們採用錯誤為主 (Fault-based) 的攻擊手法,以運行於 FPGA 上的 Linux 系統在 100 個小時之內成功地破解了 1024-bit 的 RSA 私鑰。Fault-based 的攻擊手法簡單來說就是想辦法讓攻擊目標產生錯誤,進而由攻擊目標的行為或輸出結果來找到隱含的秘密。在這次的攻擊手法中,三位學生利用改變系統電壓的方法,造成處理器運算錯誤而產生錯誤的結果。在收集到足夠的錯誤資料後,就可以利用這些資料進行破解私鑰的攻擊。1024-bit 的 RSA 依舊是目前 SSL 常使用的金鑰長度,不過還好這種攻擊手法需要先能夠取得實體環境的控制能力才行。除了硬體式的攻擊手法外,Fault-based 的攻擊方式也可以是軟體式的,亦即不需要取得實體環境的控制就可以進行攻擊。除此之外,許多攻擊手法也都會利用到 Fault-based 的觀念,想辦法讓系統產生錯誤並加以觀察,以找到可能有效的破壞管道。例如在登入頁面輸入一些特殊字元到使用者的帳號欄位中,觀察系統是否會產生錯誤以及相關的錯誤訊息,以便猜測系統是否存有 SQL Injection 之類的安全漏洞。所以如何做好 Fault Protection,不單只是產品穩定性的議題,同時也是安全性的議題。

 

相關連結:

2009年9月15日 星期二

[技術分享] 網頁掛馬攻擊 (Drive-by Downloads) 介紹

雖然有越來越多的廠商與產品試著去解決惡意程式所帶來的問題,但是不可否認惡意程式的威脅與影響依舊越來越大。除此之外,惡意程式也越來越有”創意”,讓這場官兵與強盜之間的遊戲更加精采。儘管惡意程式變化之多,我們仍舊可以將大多數惡意程式的行為(至少)分為兩個階段,第一個階段是感染 (Infection) 階段,第二個階段則是攻擊 (Attack) 階段。

在感染階段中,最重要的事項就是如何避免被發現。在此前提下,其次才是感染的速度與數量。而實際感染的途徑,也從早期的實體方式 (如磁碟片、光碟片等)演進到透過網路的方式。在網路的感染方式中,News Group、Email、IM、Web則陸陸續續被有心人士所利用。今天我們要談的是一種稱之為 Drive-by Downloads 的方式,簡單說來就是讓使用者在瀏覽網頁(或是閱讀HTML格式的信件)時,不知不覺地下載惡意程式並因而遭受感染。也許 Drive-by Downloads 這個名詞對許多人有些陌生,換個說法或許大家就比較清楚,這個說法就是網頁掛馬攻擊。聽起來也許很神奇,但是基本上所謂的”不知不覺”都還是得利用應用程式的漏洞加以遂行。只是跟傳統上利用作業系統漏洞加以感染相比較,現在會被加以利用的則包含了各式各樣的應用程式,尤其是像 Flash 、 PDF 、 影像播放器這類大量被應用在網際網路服務的相關軟體。此外,瀏覽器本身當然也是一個會遭受攻擊的明顯目標。

為什麼 Drive-by Downloads 會漸漸獲得流行呢?在 Drive-by Downloads 之前,Email 附件是主要的感染途徑之一。這些 Email 將惡意程式以附件方式加以夾帶,不但容易被郵件伺服器的防毒軟體偵測到,也會引起教育良好的使用者之疑心而加以忽略。所以,有心分子將腦筋動到了網站瀏覽的行為上。因為網站瀏覽的行為跟收取 Email 有一個本質上的差異,那就是大多網站瀏覽的行為是主動的,而不像收取 Email 是被動的,也因此大多數人在瀏覽網站時不會像收到 Email 一般持有戒心。如果再加上這些瀏覽的網站是”合法”的網站,我相信幾乎沒有人會加以懷疑,事實上也很難加以懷疑。

 

Web 與 IM 成為惡意程式的主要感染途徑

delivery method

Drive-by Downloads有下列幾種做法。首先有心分子可以想辦法先感染所謂的合法網站,然後利用 Drive-by Downloads 的方式讓這些網站的使用者在毫無警戒的情況下受到感染。在網站類型的選擇上,流量越大的網站,像是新聞網站以及 SNS 網站,對有心分子而言越是有利的目標。這種方式漸漸受到有心分子的重視,因為除了防範較為困難外,使用者在使用時幾乎不會有任何的警覺。使用的技巧則可能是 SQL Injection、Cross-Site Scripting (XSS) 等方式,目的就是讓使用者在觀看網站的同時連結或重導向到特定的(惡意)網址以進行感染的動作。而最新的技巧則為利用在合法網站刊登廣告,已達到相同的目的。

除了感染合法網站外,也可以搭配 Email 使用,讓使用者在開啟 Email 的同時連結到特定的(惡意)網址以便進行感染。雖然這個方式可能會引發使用者的戒心,但是對於傳統的防毒軟體(不管是伺服器端或用戶端)而言,要有效地加以偵測仍是力有未逮,也因此效果依舊比附件夾檔的方式來的更為有效些。

而另外一種誘使使用者連到特定網站的技巧就是利用搜尋引擎的結果,如果再搭配 Google Trend 的服務,效果將會更加明顯。在這種方式中,有心分子利用 Google Trend 服務找出熱門的搜尋關鍵字,然後自動產生特定的網站,並且讓這些網站(網址)出現在這些熱門關鍵字的搜尋結果中,以誘使使用者加以點擊並感染之。想當然爾,如何讓這些網站(網址)排在搜尋結果的前面,是有心分子要達成的目標。

一旦電腦被感染後,除了電腦上的資料可能被竊取外,更有可能因為成為僵屍網路的一員而產生危害他人的行為。身為網路的使用者,我們該如何避免遭受 Drive-by Downloads 的攻擊呢?有以下幾點是建議的做法:

  1. 第一法則依舊是維持系統在”最新”的狀態,也就是必須即時的更新。這裡的更新除了指作業系統外,更重要的是必須更新瀏覽器以及相關的外掛 (如 Flash 或 PDF 的 plugin)。因為要不知不覺得感染電腦,扣除設定不良的問題,幾乎還是要利用應用程式的漏洞才能達到目的。事實上,Flash 已經成為目前最容易被攻擊的外掛之一。也因為目前沒有一個機制可以同時更新這些項目,所以我們必須透過一些工具來達到目地,相關工具可以參考我之前的文章
  2. 使用具備偵測/攔阻惡意網址功能的瀏覽器。以目前各種瀏覽器的最新版而言,基本上都具備了這樣的能力,差別只在能力的高低。不過如果你還在使用 IE6 ,很可惜它並不具備這樣的能力。
  3. 使用防火牆、防毒軟體等對抗惡意程式的軟體,而維持這些軟體在最新的狀態,同樣是需要注意的重要事項。畢竟 Drive-by Downloads 雖然可以利用應用程式的漏洞而不知不覺地進行感染,但是感染後安裝/執行的惡意程式碼還是有可能被其他安全軟體偵測出。
  4. 減少使用管理者帳號的時機。對於企業用戶而言,僅開放一般權限給使用者可以大幅減少遭受攻擊後所造成的危害。
  5. 相較於傳統的攻擊手法,小心謹慎對於應付 Drive-by Downloads 的效用將會呈現遞減的現象。因為透過感染合法網站的方式,使用者幾乎是沒有任何加以質疑的機會。所以透過工具將會是比較可行的方式。

對於企業而言,除了上述事項外,還有其他的控制措施可以用來幫助對抗這類攻擊。有興趣的讀者可以參考 Twenty Critical Controls for Effective Cyber Defense: Consensus Audit Guidelines 這份文件。

 

相關連結:

2009年7月19日 星期日

[技術分享] DSGateway 驗證平台

之前 的文章中,我曾提到有關密碼的議題。雖然過了一年的時間,密碼依舊是我們每天在大量使用的驗證機制,而且在可見的未來並沒有跡象顯示這樣的情況會有任何轉變。方便性,這是所有其他驗證機制想要取代密碼的最大挑戰。所以雖然我們有個人憑證、Token這類”相當”安全的驗證機制,但是實際應用的系統依舊相當有限。

一家位於波士頓的公司 - Delfigo Security,推出了一項線上驗證的服務,名稱為 DSGateway 。此服務特別之處,在於它在原先的帳號/密碼驗證機制之外加上了其它的要素做為是否通過驗證的條件。當使用者輸入帳號/密碼之後,如果輸入資料正確,則原先的驗證伺服器可以將額外的資訊傳送到 Delfigo 的伺服器做進一步的判斷。這些額外資訊包含打字的特性 (Keystroke dynamics)、地理位置  (Geospatial parameters)、系統設定 (System parameters)等。而驗證的結果也不是通過與不通過這樣兩極化的判斷,而是一個稱之為 Confidence Factor (CF) 的數值,系統並可進一步根據此數值決定使用者的權限。整個基本的運作流程可以參考下圖。

雖然整個產品看起來複雜性不高而容易了解,不過卻有幾個重要的議題沒有提到。第一個當然就是此一驗證方式的準確性,尤其是透過瀏覽器取得打字特性,能有多精準的效果仍須實際的例子加以證明。另外一個更大的議題則是使用者的資料如何建立?又如何加以更新?這個議題關係到這樣的機制是否可以應用於提供大眾服務的系統,還是較適合用於內部使用的系統。

儘管如此,如果你想增加驗證機制的安全性,但是又不想造成使用者的不方便,DSGateway或許值得一試。

 

相關連結:

2009年7月10日 星期五

[技術分享] MAGEN – IBM讓你看不到你不該看的

這幾年資料外洩的議題相當夯,各式各樣的產品層出不窮,從 Application-Level Firewall、終端設備管控、文件加密,到列印管控等等,著實令人眼花撩亂。會有這麼多的產品產生,主要是因為資料有所謂的生命周期,而在每個周期內都有其必須注意的事項。另外而且因為資訊化程度的提高,資料已經是無所不在、無所不用了。所以資料外洩的問題是隨”時”、隨”地”都有可能發生的,也因此才會有這麼多看似強大,但是卻又無法完全解決問題的產品。

IBM 的研究家們於日前發表了一個稱為 MAGEN (MAsking Gateway for ENterprise) 的技術,該技術可以自動根據使用者的權限在資料顯示之前將不符合權限的內容”遮蓋”起來。根據 IBM 的說法,這樣的技術不需要修改其他應用程式,而是產生一張使用者權限所能存取資料的影像並將之顯示出來。如果這樣的說法屬實,那麼表示其實使用者的電腦依舊存有(至少存在記憶體內)完整的原始資料。也因此透過特定的技術,有心分子應該還是可以取得完整的原始資料並加以存取。另外一個問題就是如果輸出到印表機這類裝置,隱藏的效果是否依舊有效?

這個技術目前還在概念驗證的階段,距離實際的應用至少還需數年的時間。所以如果此技術確實可行,屆時上述的問題必然也一併加以解決了才是。應該是吧。

 

相關連結:

2009年6月18日 星期四

Alternate Data Streams (二)

前一篇文章中,我針對 ADS 做了基本介紹。在本篇文章中,我將繼續此一話題,並將介紹重點移至如何實際進行 ADS 的相關操作。篇幅有些長,但是因為大多是截圖的關係,所以在閱讀上應該是不會花費太多的時間。

  1. 首先我們建立一個空的目錄(D:\ads),並在此一目錄下進行測試。0001
  2. 我們產生一個一般的文字檔,內容是”Hello World”,大小為16位元組。0002
  3. 透過 type 指令確認檔案內容為”Hello World”。 0003
  4. 接下來我們使用下列指令產生 ADS 資料,其中 hello.txt:hidden.txt 表示將名為 hidden.txt 的 ADS 資料附掛在 hello.txt 上。檔案內容為 “I’m Hidden”。0004
  5. 檢查一下檔案,雖然時間變了,但是大小卻沒有變0005
  6. 查看原始檔案內容,同樣沒有任何變動。
    0006
  7. 使用 type 指令如法炮製,看看 ADS 內容是甚麼。很不幸的,系統顯示找不到這個檔案。難道是指令下錯了?0007
  8. 改用記事本試看看,沒有錯誤訊息。
    0008
  9. 筆記本顯示出我們原先輸入的內容,而且注意檔名正是 hello.txt:hidden (最後一個txt的副檔名被記事本自動隱藏了)。由此證明雖然 hello.txt 的檔案大小沒有改變,而且 type 指令也無法顯示,但是我們剛剛輸入的資料確實被儲存在 ADS 中。 事實上,使用其他應用程式也可以看到這個檔案的內容。00009
  10. 一個檔案可以擁有多個 ADS 資料,而且不需要同樣的類型。我們將一個執行檔 (calc.exe) 覆掛在 hello.txt 中,原先 hello.txt 已經有另外一個 ADS 資料,名稱為 hidden.txt 。 
    0010
  11. 雖然之前我們曾經使用 dir 指令時無法看到任何有關 ADS 的資訊,但是其實 dir 有一個參數 - /r 可以用來查看 ADS 資訊。透過 dir * /r 指令我們確認 hello.txt 有兩個 ADS 資料。不過很可惜的是, /r 參數在Vista 之前的 Windows 版本是不提供的。 0014
  12. 我們嘗試直接執行儲存於 ADS 內的檔案,系統出現錯誤訊息。 0011
  13. 上網查詢,可以找到程式啟動的方式必須透過 start 這個指令,執行後卻同樣出現錯誤。 如果你出現跟我一樣的錯誤,恭喜你,表示你的系統至少不是很舊的系統。0017

    0022
  14. 為了證明資料不假,我特定找了一個 Windows 2000 的系統,並將小算盤 (calc.exe) 覆掛在 xcopy.exe 的 ADS (ADS 名稱為 hidden.exe) 中。同樣的,直接執行會出現錯誤,但是使用 start 指令可以正確的呼叫出小算盤。
    0012
  15. 查看執行程序,可以看到 xcopy.exe 在執行中,卻看不到 calc.exe 在執行,可是實際上真正執行的程式是 calc.exe。此為一大問題,表示 ADS 的檔案就算被執行了,也無法從工作管理員中看到,而且不需要使用到 rootkit 的技術0013 
  16. 如果你以為只有舊系統才會有這個問題,新系統已經免疫了,先別高興得太早。我們先將一個名為 hfs.exe 的檔案附掛在 calc.exe 的 ADS 之中以備測試。0016
  17. 使用 start 指令依舊失敗,這次我們改用 runas 這個指令來啟動程式。0018

    0019
  18. hfs.exe 被正確啟動了,而且是在 Vista SP1 的環境下
    0020
  19. 唯一值得慶幸的是在工作管理員的顯示名稱為 calc.exe:hfs.exe ,而不再僅是 calc.exe 。 
    0021
  20. 當我們嘗試複製包含 ADS 資料的檔案時,ADS 資料也會被一併複製 (只要目的磁碟區也支援 ADS 的功能)。我們看到透過複製的指令 hello2.txt 包含與 hello.txt 相同的 ADS 資料。
    0015 

透過前面的例子,我們看到儲存於 ADS 的資料不但不容易被發現,而且可以被正常的讀取、修改、甚至是執行。雖然微軟也確實做了部分的修正,來避免原先 ADS 可能造成的損害,但是卻不是全面的。以我個人的看法,這樣部分的修改比原先不修改可能還來的更差。原因是這樣會造成更多不一致的現象(尤其是同一個系統內的不一致),而不一致往往造成使用者的混淆,甚至誤解,因而衍生額外的問題。

除了透過微軟內建的指令外,也有一些第三方的工具可以處理 ADS 的資料。像 Alternate Data Stream Tools for NTFS 這個工具可以掃描並列出系統中所有的 ADS 資料,算是一個很方便的小工具。

About