
有許多活動可以用來檢測軟體裡的品質和安全問題。這些包括靜態分析來源程式碼,在品質保證階段動態測試應用軟體,並且動態監控上線階段防止潛在的攻擊。
以下是一些在應用過程中潛在品質和安全問題的例子。
例子1︰透過靜態分析程式碼來檢查品質問題
不必要的字串建構(Unnecessary String Construction):當程式傳一個java.lang.String 給字串的建構函式,這會造成浪費記憶體,兩個物件就其功能作用是相同。
例子2︰使用動態測試來檢查品質問題
資源鎖死(Deadlock)︰在重負載下運轉的資源,檢測程式是否陷入在等待這個在重負載下的分享資源。
例子3︰透過靜態分析程式碼來檢查安全問題
記憶體緩衝區溢位(Buffer Overflow)︰檢測在那裡使用端的輸入會影響導致記憶體緩衝區溢位。在典型的記憶體溢位攻擊,攻擊者會先送攻擊的資料給程式,讓程式將它存放在記憶體緩衝區中。然後攻擊者會覆寫回傳的功能指標,指向攻擊者之前傳送的放在記憶體緩衝區的攻擊資料,然後轉移程式的控制權到攻擊程式。
例子4︰使用動態測試來檢查安全問題
遺漏錯誤處理(Missing Error Handling)︰檢測應用系統在執行時,提供的程式執行堆疊蹤跡或者其他訊息豐富的錯誤訊息。當一個攻擊者要探尋一個網站的弱點時,應用系統所提供的訊息,會決定駭客是否要試圖做攻擊的次數。假如完整地呈現程式執行的路徑,會讓攻擊者看到程式執行個軌跡,讓攻擊者更容易設定攻擊成功的步驟。例如,程式執行堆疊蹤跡清單,可以讓攻擊者看清楚SQL查詢字串的指令及使用資料庫的類型及Web應用程式的版本,這些訊息可以讓攻擊者,準確知道應用系統的弱點在哪裡。
生產軟體品質檢測工具的公司也嘗試去擴充工具功能,來檢測軟體安全的問題。不過,軟體品質和軟體安全的要求目標,是不太可能相同的。品質的檢測工具是必須的,且最重要的是準確的。也就是說有太多的誤判,數百或許數千錯誤,開發者必須分別審核、分析、驗證或者拒絕的這些檢測出的瑕疵。品質的目標在檢測嚴重的品質瑕疵,儘可能迅速而有效的將專案推進到產品階段。
安全檢測工具也必須是準確的。不過,要很準確地找到問題,就必須要由程式碼的上下內容及執行的執行環境來決定。這在下面的例子裡說明︰
當軟體開發過程中有嵌入程式碼(Injection)的安全弱點的存在,或許被不注意執行一個存心不良的程式而引起一些不可接受結果。
在做程式碼安全檢測的過程中,檢測人員發現讀入一個環境變數,給函數當作傳入的參數,在表面上,檢測人員會假設環境變數是安全的不會被竄改的,所以檢測人員會認為這個檢測出的問題是誤報。在大部分的狀況下,環境變數不是安全的問題,環境變數是使用者自己控制的,使用者不會自己攻擊自己的軟體嗎? 不管如何?使用root去執行程式,使用這項的身分(root)相關的環境變數就有可能成為安全弱點的主要考量。
品質的工具應該是精準的,安全工具也應該是完整的,而且要完成地呈現它發現問題的分析路徑。工具的目標是要鑑定弱點所在。一個弱點應該要被定義它的嚴重等級,也就是當它發生時對組織所會造成的破壞程度。如果工具有可以客制化擴充的規則,可以強化它的安全檢查功能超越品質的工具。安全檢測演算法比找程式撰寫風格的檢查與鑑定錯誤更複雜精細,而且安全檢測工具必須進行他們以基本上不同模式檢查。在品質檢測的工具上加一點安全檢測的功能是沒有用的。
您心裡應該不用懷疑,軟體品質和軟體安全兩者是不相同的。軟體品質是累積的,軟體安全是絕對的。因此軟體安全檢測工具必須要找到每個可能的弱點,軟體安全檢測工具可以不用去涵蓋檢測品質的問題,為了要面對軟體安全現況的挑戰,組織必須要編制「軟體安全檢測問題的審核員」來因應。
最後,我們要瞭解到的軟體安全沒有特效藥— 僅一個解決方案能在一次解決每個軟體弱點的問題。唯一能夠達到「相對完整安全」是在軟體開發的生命週期(從需求到上線)的每個階段中,利用安全檢測工具來協助發現弱點問題、解決弱點問題。