軟體安全
1、軟體安全問題
- 軟體安全與軟體質量和可靠性緊密相關又相互區別,
- 防御性程式設計(也稱安全程式設計):是一個軟體設計與實作流程,目的是使生成的軟體即使在面臨攻擊時仍然能夠繼續作業,
- 撰寫安全的程式代碼需要關注一個程式執行的各個方面、執行的環境以及處理的資料型別,
- 意味著程式需要驗證所有這些假設,所有可能的失敗都能安全且完美地得到解決
- 關鍵是絕不假定任何事情,而是檢查所有可能的假設,并處理任何可能的錯誤狀態
2、處理程式輸入
-
兩個關鍵點:輸入的長度+輸入的含義和解釋
-
輸入的長度和緩沖區溢位
- 程式員經常假設輸入資料的最大長度——>導致緩沖區溢位,危害程式執行
- 測驗階段難以識別緩沖溢位的漏洞
- 針對緩沖區溢位撰寫安全程式代碼,應認為任何輸入都存在危險
-
程式輸入的解釋
- 程式輸入資料可分為文本和二進制兩種形式
- 心臟出血OpenSSL漏洞,沒有檢查二進制輸入值導致
- 注入攻擊
- 命令注入
- SQL注入
- 代碼注入
- 跨站點腳本攻擊
- XSS反射
-
驗證輸入語法
- 程式僅接受已知的安全資料,才更有可能保持安全
- 比較方法:正則運算式,由一系列描述允許的輸入變化的字符構成的模式即明確對其編碼
- 多重編碼:資料在HTML中或者在一些其他結構化的編碼中允許字符的多重表示
- 字符規范化:轉換成單一的、標準的、最小的表示形式;輸入的資料與可接受的輸入值的一個單一表示進行比較
-
輸入的fuzzing技術
- 是一種軟體測驗技術
- 使用隨機產生的資料作為程式的輸入進行測驗;也能依據一些模板隨機產生輸入
3、撰寫安全程式代碼
-
演算法的正確實作
-
保證機器語言與演算法一致
-
資料值的正確解釋
-
記憶體的正確使用
- 如果一個程式沒有正確管理這個程序,后果可能是堆區的可用記憶體逐步減少,即產生記憶體泄漏,
-
組織共享記憶體競爭條件的產生
- 當多個行程或執行緒通過競爭來獲取對一些資源的未加控制的訪問時,會導致竟爭條件的發生,
- 如果我們選擇了不正確的同步原語序列,就有可能造成各種行程或執行緒的死鎖
4、與作業系統和其他程式進行互動
-
環境變數
- 環境變數是每個行程從其父行程中繼承的能夠影響行程運行方式的一系列字串值
- 環境變數提供的可以進入一個程式的另一個路徑是未確認的資料,因而需要進行驗證,
- 常見用法,本地用戶經常利用這些環境變數獲取對系統的更大權限,
-
使用合適的最小特權
- 特權擴大:比本來為攻擊者分配的權限高,可能修改系統并持續擁有高特權,
- 最小特權:每個程式都應該使用完成其功能所需的最小特權
- 確認:在提高組優先級的同時也提高用戶優先級,還是僅提高組優先級,
- 保證任何特權程式僅能修改所需的檔案和目錄
-
系統呼叫和標準庫函式
-
阻止共享系統資源的競爭條件產生
- 常用的技術是在共享的檔案上設定一個鎖,保證每個行程輪流訪問
- 最早也是最常用的技術是使用一個檔案鎖(lockfile),
-
安全臨時檔案的使用
- 臨時檔案必須是唯一的,不能被其他人訪問,
- 安全臨時檔案的產生和使用更需要使用隨機的臨時檔案名,
-
與其他程式進行互動
- 應十分小心,任何對于程式間資料流規模和解釋的錯誤假設都可能導致安全漏洞
- 保護多個程式間資料流的機密性和完整性問題
- 從安全的角度講,檢測和處理程式互動中產生的例外和錯誤也很重要,
5、處理程式輸出
- 從程式安全的角度講,輸出和預想的形式相符合是很重要的,
- 程式必須區分哪些輸出是允許的,并且過濾掉任何不可信資料,保證只有有效的輸出被顯示,
不同的字符集允許對元字符的不同編碼方式,這會改變對有效輸出的解釋,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/245787.html
標籤:其他
上一篇:面試題---集合框架篇
