資料來源:By Peter Wayner, InfoWorld, 2013/7/5
翻譯整理:叡揚資訊 資訊安全事業處
Web 上的恐怖事件已經越來越嚴重,起初僅 有幾個被盜用的信用卡號碼,現在則有數 百萬計的財務記錄暴露出安全漏洞,增加了許多 威脅。撰寫安全程式碼從很久以前開始就只是個 形式,且不是簡單的任務。即便極盡安全的程式 碼,架構師、工程師、稽核師和管理者必須設法 想像程式碼可能出錯的每一個可能面向。雖然無 法預料每一個攻擊者可能丟出的問題,但您必須 盡您所能來減少被攻擊的面向、修復漏洞,以及 防護任何潛在弱點所造成的問題。
以下17 個技巧,可協助開發者開發出更安全的程式碼。
攻擊者需要一條路徑來侵入您的機器,最簡單的路線是透過程式碼所開的門。如果您的軟體從網際網 路上輸入,就會有人試圖潛行過去偷取你的東西。解決的辦法是驗證傳入資料的大小和結構,而且決 不要相信的網際網路上另一端的人。
一般情況下,程式開發人員會提供更多的彈性和更少的作為。對程式開發人員來說,檢查每一個資料 的最後一個位元是耗時和疲憊的。資料傳輸語言像XML 和JSON,並沒有做很多工作來避免這些問 題。然而,輸入驗證是程式開發人員需要做的,以確保他們的程式碼安全。
在您要求客戶的郵寄地址時,問問自己,您是否真的會透過郵局送一封信給他們。如果電子郵件就足 夠,您可能要重新考慮是否需另儲存家庭或企業的地址。這些訊息需花費時間來處理,又佔用磁碟空 間,並成為吸引攻擊者的目標。 程式開發人員有時會迷戀囤積,儲存代表有朝一日至少有機會會用到該副本。這種直覺可以幫助軟體 除錯,但它卻留下了一些線索,讓任何人可以找到資料。資料庫中的每一列和每一個表是絕對必要的嗎?如果有疑問,請縮短內容格式,讓資料庫變小些,避免成為資料蒐集鼠的誘惑對象。
大家都知道密碼的問題,但沒有人知道一個更好的解決方案。一些公司已經使用N-因子身份驗證,在使用上需經過幾個不同的障礙。總是可以增加更特殊的硬體鎖定來增加密碼的安全性。不過成本是昂貴的,且比手機更容易弄丟。其他網站追蹤使用的IP地址登入。如果您存取系統來自未知地址,他們會發送一個禮貌的電子郵件通知,以防萬一。
這些選擇並非完美,但至少比依靠單一個密碼更好。重要的步驟是確認字串的長度與混合字元限制。
構建安全的程式碼不是只發生在程式碼編輯上:當經理提出草案需求,並與開發者討論,每個人都應該認真考慮每一個需求會產生的問題。 也許有一個炫麗的功能,但它是否會迫使您儲存機敏資訊,且需提高所需具備的資安要求?一個華而不實的功能,值得額外費力嗎?保護您程式碼、避免未來受漏洞威脅的正確時機點,是在需求文件尚且彈性、且客戶對於您提出的功能尚未展現強烈渴望的時候。
許多攻擊都需靠蠻力。這可能需要數萬億的迴圈執行,但電腦不在意。有些機器人抓取資料庫發送數以百萬計的查詢;其他則是萬億次的嘗試,直到找到正確的密碼。
關鍵是要逐步增加更多的延遲來影響這些機器人。您希望您的軟體須快到可支持合法的人,但卻要夠慢來影響攻擊的機器人。
一些登錄程式遇到錯誤的登入會延遲兩倍的登入時間。有些資料庫會依據IP來限制可查詢的數量。有些系統會故意發送一封電子郵件,讓您的請求慢下來。人們不會注意到這些額外的時間,但可影響惡意程式的行為。
加密往往未充分被使用,因為它增加了額外的步驟,使得除錯難度更高。它可能困難到難以在系統中發現錯誤,因為當資料是一堆難解數字也是艱難的。
處理資料的難度同時也是攻擊者的難度。資料儲存於資料庫前先鎖定個人資料可不用擔心底層資料庫、作業系統與虛擬軟體的不當行為。
適量的加密不需要降低其功能性。作者研究了一些不同的例子,在其書中有提到"Translucent Databases",可以提供有用的服務,同時保護個人資訊。另外,額外的保護本身也是個特點。
安全性往往與使用方便性互相抵觸。人們討厭登入到不同的系統部份,但統一登入到入口網站卻是危險的。這沒有簡單的方法來決定用戶可以多容易的瀏覽系統來完成他們的行為。您讓用戶越容易成為合法授權,同樣也讓攻擊者越容易侵犯系統。
它可以讓最敏感的作業隔離到一個單獨的系統,並要求人們要使用時需再次登入。一家銀行可能會提供一個具備確認狀況與存款功能的入口網站,但在提款功能上則需要較多的認證。
加密很難做得很好,即使是最好的理論和精心打造的程式碼一樣會有漏洞和後門。重建一有效的測試庫通常是一個錯誤,比加密問題本身嚴重。使用行之有效的測試庫在這一領域很重要。選擇更好的程式碼,這裡並不需自己發明演算法。
職業生涯早期,將您的程式碼切分到不同的模組和透過精心設計的API來進行溝通,是大家學習到的經驗。這對安全性來說更有價值,因為API更容易稽核彼此之間的調用,發現漏洞,並解決問題。模組可以被個別驗證,並將結果結合。
建立內部子模組往往是有道理的,同樣的想法在模組內也適用。部份是比整體更容易進行分析。
每個人都可以使用編輯器。如果企業投資於精心打造的安裝庫,應該也可以投資在程式碼稽核。這些可識別缺陷和提供改善產品程式碼的建議。
在一般情況下,更多人的查驗,可以發現更多的問題。外人也可以避免內部的政治僵局關係。他們往往不知道任何內部的情事,但他們的優勢是超越內部派別。
雖然不算完美,且不像人們聰明,但程式碼分析器還是值得的。畢竟,他們可以很勤奮,不會累,渴,餓,或無聊。
像馬里蘭大學 FindBugs的程式碼分析器工具,可以看到我們沒有想到的常見錯誤。這些許多錯誤很不安全,且有些可能是致命的。
開發人員喜歡超前思考,並提前方便給其他人可以存取的權限,包含未來可能需要的所有存取。雖然打開權限可以幫助處理未來許多瑣事,相對於「技巧1」提到的路障,往往造成通路權限濫用。良好的原則是給程式碼和使用者可以把工作完成的最小使用權限。
如果產生過多的額外特權請求造成管理者困擾,可能要重新思考資料的架構方式。是否保持太多的資訊?如果人們需要獲得比您可以給的更多權限,您可能儲存太多的資訊。
您是否持有信用卡號碼?有了此資訊之後就可能被竊。您會使用手機來追蹤人的位置嗎?這功能也會造成危險。
花費時間思考誰想要您的資料可以是一個有用的辨別前兆。如果您能想像一個威脅,假想攻擊的心態,來設計和建置您的系統,並提出一個反使用(antiuse)的情況來避免。
重要的是要認識到,沒有清單或模型是永遠完美。因為沒有考量到的威脅並不意味著您不必擔心它。這都只是個開始。
您可以很容易地懷疑那些登錄到您網站的使用者,但請記住,您也可能是被懷疑的對象。您是否為「真正的」、擁有用戶存款的銀行,或者您是一個釣魚網站,試圖竊取使用者所擁有的一切?
有些網站會向用戶證明網站的真實性。他們要求客戶上傳一些安全圖片或一組確認字碼,可以用它來證明他們是誰,這可以讓大家更安全。
跟隨產業的一些出版品是絕對必要的,InfoWorld只是其中的出版物,涵蓋了一些悲劇性的錯誤。好文章可以告訴您別人做錯了什麼,給您一個機會,避免發生同樣的錯誤。
當類似的攻擊者可能找上您時,了解過去發生了什麼事是一個很好的方式,同樣的攻擊者也在讀相同的文章,並思考更多的惡意的方式。一旦一個想法在那裡,您必須注意攻擊者可能會比您更超前想到下一步。
每日刊物是不陷入資訊泥鑿的第一步。更好的經驗是來自研究人員有足夠時間想想什麼地方出了錯後,閱讀這些研究人員撰寫的書籍和雜誌文章。包括哪些問題,良好的規則和方法可以避免未來會遭遇的問題。
投資一些時間和金錢在書本上,往往可以得到難以置信的收穫。採用廉價的方式獲得到知識,從最高薪顧問所出版的書,售價為200美元或300美元看起來似乎極其昂貴的,但可不是顧問每小時500元收費,並堅持至少提供20個小時授課長度。
您可以報名參加當地大學或嘗試免費線上課程。這些不同的方式,得到學習的資料往往沒有以書的形式經過內化。教授們通常會有最新出版的學術會議資訊,包括了豐富的註解與重點。即使您已經知道很多訊息,參與課程可以幫助您保持知道目前最新的發現與出版。