Linux代碼淬火工具

來源:互聯網
上載者:User
介紹用來提高Linux應用程式安全性和可靠性的開源工具和代碼追蹤技術。
一、原始碼檢查工具
在軟體開發過程中,我們可以利用源碼檢查工具來找出常見的編程錯誤以及安全性漏洞。這些工具用起來並不複雜,下面介紹splint和flawfinder這兩款源碼檢查工具的使用方法。
splint是一款靜態原始碼檢查工具,能對原始碼進行全面的分析。對於沒有注釋的原始碼,可以使用-weak選項:
splint -weak *.c -I./inc
其中,./inc是標頭檔所在的子目錄。此外,Splint還支援標準檢查模式(選項-standard),若要進行中等強度檢查則使用選項-checks,若使用選項-strict則進行最嚴格的檢查。
flawfinder也是一款用來尋找原始碼錯誤的靜態分析工具。通過該工具提供錯誤訊息,開發人員可以更快的找到錯誤所在。請看下面的例子:
$ flawfinder test.c
test.c:11: [2] (buffer) char:
Statically-sized arrays can be overflowed. Perform bounds
checking, use functions that limit length, or ensure that
the size is larger than the maximum possible length.
$
本例中,flawfinder給出了一個提示,指出靜態尺寸的數組可能被惡意利用的潛在危險。
除了上面介紹的splint和flawfinder這兩款工具外,還有RATS(一款安全審計工具)以及ITS4(靜態漏洞掃描工具)等工具可用。但需要
注意的是,雖然這些工具能夠分擔一部分工作,但卻無法完全替代人類。因為工具在發現漏洞的同時,也可能遺漏安全性漏洞。

二、代碼跟蹤技術
我們知道,strace工具通常是用來追蹤系統調用的,實際上,它還可以作為間接的原始碼審計工具。從系統調用的角度來跟蹤應用程式的執行,可以讓我們瞭解到Linux應用程式的底層操作,藉助這些低層操作我們可以更好的理解我們的原始碼。
在下面的例子中,有多處違反了我們前面討論的代碼淬火原則,現在我們展示如何利用strace來進行調試。
#include <unistd.h>
#include <fcntl.h>
#define MAX_BUF 128
int main()
{
int fd;
char buf[MAX_BUF+1];
fd = open( "myfile.txt", O_RDONLY );
read( fd, buf, MAX_BUF );
printf( "read %s\n", buf );
close( fd );
}
我們注意到,上面的代碼的第11行,即:fd = open( "myfile.txt", O_RDONLY
);
試圖開啟一個稱為myfile.txt的檔案,但事前並沒有檢查該檔案是否業已存在。在這種情況下執行該程式的話,會導致無法預測的結果:
$ gcc -o bad bad.c
$ ./bad
read @?8Z@
$
看看,這樣的結果是你沒料到的吧。所以,先讓我們利用strace來看看到底發生了什麼。注意,下面的輸出已經作了刪減,但重要的資訊都保留下來了:
$ strace ./bad
execve("./bad", ["./bad"], [/* 20 vars */]) = 0
uname({sys="Linux", node="camus", ...}) = 0
...
open("myfile.txt", O_RDONLY) = -1 ENOENT ( No such file or
directory)
read(-1, 0xbfffef20, 128) = -1 EBADF (Bad file descriptor)
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,
-1, 0) = 0x40017000
write(1, "read \300\357\377\2778Z\1@\n", 14read /à???8z@
) = 14
close(-1) = -1 EBADF (Bad file descriptor)
munmap(0x40017000, 4096) = 0
exit_group(-1) = ?
$
執行程式後,我們看到用來啟動該程式的系統調用是execve();不久又調用了open(),該系統調用對應於代碼中的第11行。並且我們看到系統調用
open()的右邊的傳回值是-1,並指出錯誤"ENOENT ( No such file or
directory)",即不存在這個檔案或目錄。換句話說,這是在告訴我們需要先建立檔案。此外,系統調用read()也以失敗而告終,它的錯誤是非法
的檔案描述符,因為open調用失敗了。
strace工具不僅用來協助理解有原始碼的程式的行為,而且也對於沒有原始碼的程式也同樣有效。因為,透過對系統調用的觀察,我們能夠在二進位層級來理解程式的行為。

三、小結
古人云,工欲善其事,必先利其器。藉助於上文介紹的代碼淬火方面的編碼知識,用來提高Linux應用程式安全性和可靠性的調試工具,相信讀者能夠更快更好開發出安全可靠的高品質軟體來。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.