搜尋此網誌

顯示具有 Security 標籤的文章。 顯示所有文章
顯示具有 Security 標籤的文章。 顯示所有文章

2009年6月9日 星期二

百密可別一疏 - 如何做好全面的Input Validation

Social Web這兩三年很紅,紅的不只是其受一般使用者歡迎的程度,而且也絕對是駭客的新寵。我個人雖然不常使用Social Web,但是或多或少還是無法避免,Facebook是我使用的其中之一。Facebook除了官方的功能,還提供了許多第三方開發的應用程式,這也是Facebook這麼熱絡的原因之一。話說這天我收到一個朋友發出的應用程式使用邀請,接受邀請想加入後不得了,出現了惡名昭彰的SQL錯誤訊息。雖然直接秀出SQL是不被接受的行為,但是我可也沒放棄這個機會。我稍微看了一下,原來就是’這個符號沒有處理好,而’這個符號剛好對SQL語法而言有重大意義。但是我再仔細想了一下,Facbook因為是全球性的網站,個人資料有’這個符號應該也不是完全不可能,至少我就看過人名是有’這個符號的。而我個人資料有’這個符號是出現在家鄉的省份(T'ai-pei),難道這個欄位有免受檢查的特權?所以,為了測試我的想法,我又申請了一個帳號測試這個問題。我這次申請的帳號除了所在地區同樣帶有’外,連姓名也加上了’,測試結果顯示姓名的’被移除了。雖然移除不是一個好的選項(因為這樣姓名就變了),但是至少不會造成程式執行的錯誤。所以應用程式的開發者的確知道該檢查使用者輸入的資料,但是卻沒有檢查到所有該檢查的資料。所以,就有了今天的主題。

Facebook應用程式的錯誤訊息

farmgame_001

如果你從事過軟體開發的工作,或接觸過軟體開發的工作,不管有沒有實際的經驗,至少都聽過一個很重要的建議,那就是要記得檢查使用者輸入的資料。這個建議成為人人朗朗上口的推手,一個很重要的因素就是Web的流行。因為Web的特色就是使用者的輸入來源各式各樣,而且都是不可控制的。也因此有許多的攻擊方法,基本上都是利用忘了針對使用者輸入的資料做檢查而產生的漏洞。像是鼎鼎大名的SQL Injection、Command Injection、XSS、CSRF等,都跟這個問題有或多或少的關連。

這句話聽起來很簡單,而且很也容易懂,但是有兩個很重要的問題需要釐清。第一個問題是甚麼叫做好的檢查方式,或者說是足夠安全的檢查方式。第二個問題則是有哪些資料應該檢查。在這篇文章中,我想針對的是第二個問題加以討論。

所以,有哪些資料需要加以檢查?使用者輸入的資料,以Web的系統來說,大家通常最先想到的就是URL 參數(Get 方式)與Form Data(Get/Post 方式)。因為這是主要用來接收使用者資料的兩種方式。在Form Data有一個特別需要注意的地方,就是隱藏欄位也同樣需要檢查。雖然一般使用者在正常的使用中無法看到與修改隱藏欄位的存在與內容,但是駭客既不是一般的使用者,通常也不會用正常的使用方式,所以隱不隱藏對有心份子來說是沒有任何差別的。

除了這些顯而易見的資料外,其實還有一個地方也是在使用者的完全掌握之中,那就是Cookie。雖然Cookie一般存在檔案中、有時甚至存在記憶體中,所以不方便或不可能直接修改其數值。但是HTTP協定的問題就是在於傳送Cookie時是不做任何加密的動作,所以任何人都可以攔截Cookie的內容,甚至是修改Cookie的內容。說任何人當然是誇張了點,但是在技術上並沒有甚麼特別困難之處,只消一個Intercepting Proxy (如WebScarab)就夠了。

Okay,Cookie我們也檢查了,可以放心了嗎?還不夠!HTTP協定中還有一種資料也是在使用者的掌握中,那就是HTTP Header。雖然我們在大部分的情況下不會使用HTTP Header的資訊,也不會直接利用它來處理使用者的資料,但是這類問題的嚴重依舊不可忽視。

使用者可以直接控制的資料都檢查過了,天下應該太平了。是的,只不過這已經是過去的美好時光。在現在的Web環境下,Web應用程式已經不再是一個單一的系統,而是由各式各樣的Widgets、Mashups等小元件所共同組成。這些小元件的特色就是由不同的人所開發,開發的語言甚至可能不同,種種得不同都代表了這些元件不受主要網路服務提供者的管理與潛在的安全問題。此外,分享的內容也由原先單純的文字,演化到圖片、網誌、影片等各種形式,而這些分享的方式與內容,也可能造成安全的危害。所以,光檢查使用者輸入的資料已經不再足夠,而是要檢查所有透過不是由你(的程式)所直接控制的資料來源所取得的資料。這些資料包括(但不侷限於)從其他網站所獲取的資料、檔案(尤其是使用者上傳的檔案)、資料庫的資料(這是一個特例,即使資料庫是”自己的程式”所維護,也需要加以檢查)、E-mail等。

回到Facebook應用程式的例子,我們發現其實T’ai-pei那串文字並不是使用者自行輸入的。我原先輸入的是Taipei,但是系統對應出來的選項卻是T’ai-pei。也或許因為這個字串是由系統產生的,所以應用程式的開發者就假設這個資料是安全的,所以也就認為不需要檢查。很可惜的是,這樣的假設是不成立的,所以就出現了這樣的錯誤。

有問題資料的乃是系統產生的字串

farmgame_002

2009 CWE/SANS Top 25 Most Dangerous Programming Errors中所公布的第一個錯誤正是不適當的輸入驗證(Improper Input Validation),而其對於哪些資料需要加以驗證有下列文字加以說明

“Understand all the potential areas where untrusted inputs can enter your software: parameters or arguments, cookies, anything read from the network, environment variables, request headers as well as content, URL components, e-mail, files, databases, and any external systems that provide data to the application. Perform input validation at well-defined interfaces.”

在SANS公布的內容中,針對如何加以檢查也有完整的說明,有興趣的讀者就請自行參考了。

相關連結:

2009年2月28日 星期六

新聞:趕流行的攻擊者

根據 McAfee Avert Labs 提供的消息指出,有攻擊者利用 Google Trends 的功能,找出目前最流行的100個查詢關鍵字。之後則針對排行在這些關鍵字前面的網站,找尋目標網站進行複製的動作。複製之後,要如何讓自己出現在關鍵字的查詢結果畫面中?當然不是靠買 Google 的廣告。靠的是利用大量被控制的網站,將假網站的連結注入這些被控制的網站中。

因為 Google 搜尋引擎的排行方式,有一大部分的比重來自於其他網頁連結過來的數量,所以大量被控制的網站注入假網站的連結,表示這個假連結的排行就可以急速衝高。除非使用者本身是查詢一些如破解軟體或非法下載的關鍵字,所以會因為預期這些網站不懷好意而多加小心,否則一般使用者對於 Google 的搜尋結果(尤其是前幾筆的資料)通常不會加以懷疑。再加上網頁已經複製的跟原來網站一模一樣,使用者很容易就陷入了陷阱。陷入陷阱之後呢?當然就是任人宰割了。

當然, Google 不可能放任這類的問題發生。因為這個問題不但對使用者產生安全上的威脅,也使得 Google 搜尋結果的有效性受到很大的干擾。即使沒有危害使用者的行為發生,光後者就足以讓 Google 抓狂了。因為這樣就不需要跟 Google 買廣告,跟駭客買可能還比較實在。便宜,而且又是出現在搜尋結果,而不是會被很多人自動忽視的廣告區。所以 Google 同時透過自動跟手動的方式把這類網站從搜尋結果中加以移除。不論如何,多保持警覺性依舊是最基本、也是最有效的防範之道。

相關連結:

2008年7月24日 星期四

Linux之父強烈反擊

被尊稱為Linux之父的Linus Torvalds前一陣子針對PaX Team的指控做出了反擊,PaX Team指控Torvalds與其他人對於程式的Bug沒有針對其安全性危害做出分類與警告。Torvalds則認為找出Bugs已經足夠,並不需要特別去強調安全性的問題。其他跟安全不相關的Bugs,數量甚至更多,也同樣需要加以修正,而過於強調安全性的Bugs其實並無助於解決所有的Bugs。他以為目前很多以做安全為名的人,誇大了安全的議題,甚至只是利用發現安全性的弱點來增加自己的知名度。他也提到了OpenBSD過於強調安全性,並且用了很不好聽的形容詞去描述其開發團隊-a bunch of masturbating monkeys(一群自己爽的猴子)。

對此,OpenBSD的相關成員倒是不想把問題擴大,所以自己打了一些圓場。最後,甚至說其實他們跟Torvalds雖然表面上看法有些不同,不過其實真正的想法是一致的。對我而言,有沒有一致並不重要,因為每個產品本來就有他不同的定位。所以,重點不在對開發者而言安全是不是最重要的,而是客戶對安全的需求是甚麼?或許用比較正式的說法,是Stakeholder(利害相關者) 對於安全的需求是甚麼?所謂的利害相關者,可能是使用者,也可以是付錢的客戶,也有可能是使用者的頂頭上司。所以只要是有關的人都算是利害相關者,而對需求有較強烈的影響的人就是重要的利害相關者。

當然,每個人對於自己用盡心力而誕生的產品無不抱以無限的期望與關愛。但是別忘了,沒有一個產品可以適用於所有的人。如果一個產品真的這麼不堪,市場自然會有一些機制加以淘汰。Linux擁有其支持者,OpenBSD也同樣有死忠的粉絲。並不能用支持者的多寡就決定誰對誰錯,只能說誰的方向是比較符合多數人的需求,而且是過去的需求。Torvalds對於Linux乃至於OSS的貢獻無庸置疑,但是用了不堪的言語來反擊他人的指控,我想只能說他畢竟還是一個人類。人類都有其脆弱的一面,這是無法避免,更不能因為這樣就說他是不好的。就像所有的安全機制一樣,再好的安全機制總有它無能為力的時候。如果我們在規劃乃至於使用時不能夠知道各安全機制的適用與不適用時機,終究是無法發揮其真正的功效。

我本身對於Linux有多年的使用經驗(從Kernel 0.x版就開始接觸了),也一直很肯定所有OSS作者的貢獻,對Torvalds那更不用說了。我想這樣的事件不會減少他的影響(或許還可以稍微增加),不過我還是期望他能夠少引起一些不會有結果的爭端。有時候,軟體的支持者跟宗教或政治的支持者沒有甚麼兩樣,除了理性以外,更是充滿了感性的一面。聰明的人,還是避免無謂的口水之爭才是上策。

原文出處:
Torvalds attacks IT industry 'security circus'

2008年7月5日 星期六

你準備好降落傘了嗎? - 談雲端運算的安全議題

延續之前的熱潮,雲端運算(Cloud Computing)持續成為熱門的話題。之前我們看到在推廣雲端運算時可能遭遇到的問題,其中有多項議題與安全相關。在一份Gartner所發表的研究報告中,特別針對雲端運算所面臨安全上的議題做了一個完整的整理,共包含下列七項:

1. 特權使用者的管理 (Privileged User Access) - 特權使用者(如Windows的Administrator或是*nix的root)因為擁有幾乎絕對的權力,所以在使用上必須經過嚴密的管控。舉例來說,這些人員在進入公司前可能經過較為嚴格的背景調查。但是一旦將運算及資料都交付到服務供應商,這些系統的特權使用者將不再直接受公司管理,如何確保服務供應商能夠有效管理特權使用者將是一個很重要的議題。

2. 法規的遵守 (Regulatory Compliance) - 雖然公司透過服務供應商的服務執行公司營運的活動,但是遵守法規的責任仍舊屬於公司本身,而不是服務供應商。因此必須確保服務供應商的作業方式能夠符合法規要求,甚至在必要時加以稽核。

3. 資料所在的位置 (Data Location) - 這部分其實跟法規的遵守有關係,不過比較著重在有關資訊處理的隱私保護上。事實上,每個國家或地區對於隱私權的保護有不同的規範。所以如何確保資料處理能夠符合資料收集地點的法規以及
資料處理時所在位置當地的法規,是一個必須絕對遵守的要求。有些隱私權保護的規範,甚至會限制資料在未經授權前不可傳送至其他的國家或地區。

4. 資料的隔離 (Data Segregation) - 因為服務供應商同時提供服務給許多客戶,各個客戶間的資料是否已被有效的隔離,以避免資料被其他客戶看到而產生資料外洩的疑慮。

5. 回復能力(Recovery) - 雖然雲端運算之一的特點就是分散式的處理,所以不會因為單一設備的問題而中斷服務。但是再怎麼強調不中斷的系統,終會有服務中斷的機會。當發生問題時,服務與資料的回復能力,也是必須加以考量的。

6. 支援調查的能力(Investigation Support) - 因為服務供應商同時提供服務給許多客戶,再加上同一個客戶的服務可能在任意地方被執行,所以如果一但有法律調查上的需求時,這些可能交互混雜的使用紀錄是否能夠有效地的被取出並加以追蹤,將可能是一個複雜的問題。

7. 永續的使用性(Long-Term Viability)
- 即使雲端運算的系統可以提供長時間不中斷的服務,但是服務供應商本身卻不見得會永續經營。服務供應商可能退出市場、被併購或是客戶主動希望轉換平台,這個時候原先的資料是否能夠完整的取出甚至轉換到新的平台,就是一個很重要的議題。

這些問題除了透過SLA來規範服務供應商所應該具備的服務水準外,服務供應商更必須主動(或是被動)提出更為透明的資訊,以便讓使用者能夠完整了解服務供應商內部的管理與運作模式。當然,如果能夠有一些公正的第三方針對服務供應商作認證,我相信對使用者而言可以省下不少事情。不過我想,以目前的時機點而言,這樣的規範要產生並順利被推廣,應該是八字還沒一撇。雲端運算這樣的運作模式,對原先IT環境產生了不少本質上的衝擊,在資訊安全方面也是一樣。

原文出處:
Gartner: Seven cloud-computing security risks
Assessing the Security Risks of Cloud Computing (付費文件)

2008年5月6日 星期二

資訊安全是一場笑話? - Security榮登有史以來最失敗技術的榜首

前幾天不小心瞄到一篇文章,標題是"Tech's all-time top 25 flops" (有史以來最失敗的25項技術 )。第25名是PS/2。注意是PS/2,而不是PS2!PS/2是一種電腦系統,不過後來大家比較熟悉的是其定義的介面。幾年前還有一些PS/2介面的鍵盤跟滑鼠,只是現在大概都改用USB介面了吧。
文章很長,一時好奇心起想看看第一名是甚麼東西(其實是英文不太好)。不看還好,一看真的倒吸一口氣,竟然是"Security"!作者的解釋是因為自從有電腦以來,雖然大家不斷試著改善安全的問題,但是安全的問題卻只是越來越嚴重,所以相信電腦可以安全加以使用是一件不切實際的事情。他的建議就是面對電腦是不安全的這件事吧。(原文為Now that we've built a digital world on an insecure foundation, the solutions for security are really hard – maybe too hard. We may just need to live with the fact that computer technology is largely unsecure, so caveat utilisator.)

身為資訊安全專家,怎麼可能忍受這樣的論點。其實對於安全,本來就是一件無法完全達成的任務。就像政府有再好的執法系統,也不可能完全消滅犯罪行為。但也不能因為無法消滅犯罪行為,就完全捨棄執法系統。事實上,安全本來就不是也無法達成完全的安全,只能盡量依據各種不同的環境需求去達成可以接受的安全防護等級。所以重點在於目前的安全防護對個人/組織是否足夠,又應該如何加以不斷改進與因應新的安全威脅。各位可以自行想想看,如果你正在使用的電腦連防毒軟體都沒有,你敢上網嗎?

大約在10年前,我看過一句話"Security is not a destination, but the journey",這句話正可以很明白的點示出安全本身就是一個不斷演化的過程。所以我要說的是"資訊安全不是一場笑話,至少目前還不是。"

原文出處:
Tech's all-time top 25 flops

About