[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 安全技術 > 程序 > 正文
安全編程方法
http://magazine.nsfocus.com (2001-04-19 16:33:43)
    用下列好的編程習慣和安全軟件指導來寫軟件,在設計技巧、系統調用和庫調用上使用合適的信息,在Simson Garfinkle和Gene Spafford的《ractical Unix and Internet Securiy》一書的第23章裡有許多關安全編程和非安全編程技巧的信息。下面是其精髓所在.


檢查所有的命令行參數 
檢查所有的系統調用參數和返回代碼 
檢查環境參數,不要依靠Unix環境變量 
確定所有的緩存都被檢查過 
在變量的內容被拷貝到本地緩存之前對變量進行邊界檢查 
如果創建一個新文件,使用O_EXCL和O_CREATE標志來確定文件沒有已經存在 
使用lstat()來確定文件不是一個符號連接 
使用下面的這些庫調用: fgets(), strncpy(), strncat(), snprintf()    而不是其它類似的函數,可以說,只使用檢查了長度的函數. 
同樣的,小心的使用execve(),如果你必須衍生一個進程 
在程序開始時顯式的更改目錄(chdir())到適當的地方 
限制當程序失敗時產生的core文件,core文件裡有可能含有密碼和其它內存狀態信息. 
如果使用臨時文件,考慮使用系統調用tmpfile()或mktemp()來創建它們
  (雖然很多mktemp()庫調用可能有race condition的情況) 
內部有做完整性檢查的代碼 
做大量的日志記錄,包括日期,時間,uid和effective uid,gid和effe
  ctive gid,終端信息,pid,命令行參數,錯誤和主機名 
使程序的核心盡可能小和簡單 
永遠用全路徑名做文件參數 
檢查用戶的輸入,確保只有"好"的字符 
使用好的工具如lint 
理解race conditions,包括死鎖狀態和順序狀態 
在網絡讀請求的程序裡設置timeouts和負荷級別的限制. 
在網絡寫請求裡放置timeouts 
使用會話加密來避免會話搶劫和隱藏驗証信息 
盡可能使用chroot()設置程序環境 
如果可能,靜態連接安全程序 
當需要主機名時使用DNS逆向解釋 
在網絡服務程序裡分散和限制過多的負載 
在網絡的讀和寫裡放置適當的timeout限制 
如果合適,防止服務程序運行超過一個以上的拷貝 

不安全的編程方法


防止使用在處理字符串時不檢查buffer邊界的函數,如gets(),   strcpy(), strcat(), sprintf(),fscanf(), scanf(), vsprin   tf(), realpath(), getopt(), getpass(), streadd(),   strecpy(),和strtrns() 
同樣,避免使用execlp()和execvp() 
永遠不要用system()和popen()系統調用 
不要將文件創建文件在全部人可寫的目錄裡 
通常,不要設置setuid或者setgid的shell scripts 
不要假想端口號碼,應該用getservbyname()函數 
不要假設來自小數字的端口號的連接是合法和可信任的 
不要相信任何IP地址,如果要驗証,用密碼算法 
不要用明文方式驗証信息 
不要常識從嚴重的錯誤中恢復,要輸出詳細信息然中斷 
l  考慮使用perl -T或taintperl寫setuid的perl程序



測試程序安全
用cracker的方法來做軟件測試:


嘗試使程序裡的所有緩存溢出 
嘗試使用任意的命令行選項 
嘗試建立可能的race condition 
設計者做代碼重閱和測試 
讀所有的代碼,象cracker一樣思維來找漏洞 

使用這些應該可以提高軟件質量,減少代碼bug,特別是安全漏洞
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章

======
 

★  樊強制作 歡迎分享  ★