2014-09-24 91 views
1

我已經看過這個question以及這些PDF文件'12,這個page,並且非常理解如果我這樣做printf(SOME_TEST_STRING)會發生什麼。但我不明白爲什麼確保通過確保緩衝區的大小vsnprintfvsprintf相比變得安全?vsnprintf爲什麼安全?

回答

1

我不知道是什麼問題,因爲你的問題基本上包含答案了。

通過傳送緩衝區大小爲vsnprintf您提供的功能,與你的緩衝區大小信息。該函數現在知道緩衝區的結束位置,並且可以確保它不會超過緩衝區的末尾。

vsprintf沒有關於緩衝區的大小,這就是爲什麼它不知道在哪裏的緩衝結束,不能防止緩衝區溢出的信息。

3

這是因爲vsnprintf有一個額外的size_t count參數vsprintf(和其他非n * sprintf方法)沒有。該實現使用它來確保寫入緩衝區的數據不會結束運行。

在緩衝區末尾運行的數據可能導致數據損壞,或者當被惡意利用時可用作buffer overrun攻擊。

2

「n」箇中vsnprintf()意味着需要輸出串的最大大小,以避免緩衝器溢出。這樣可以避免緩衝區溢出,但如果格式字符串來自未經處理的用戶輸入,則不會安全。如果你的用戶給你一個巨大的格式字符串,你會避免溢出目標字符串,但如果用戶給你%s,並且你沒有在編譯時在參數列表中傳遞一個C字符串,你仍然留下未定義的行爲。

5

在這些2箱子會發生什麼?

案例1

char buf[3]; 
vsprint(buf, "%s", args); 

案例2

char buf[3]; 
vsnprint(buf, sizeof buf, "%s", args); 

在案例1,如果你格式化字符串中有3或更大的長度,你有一個緩衝區溢出,vsprintf中可能會寫到內存超過buf數組的存儲空間,這是未定義的行爲,可能導致嚴重/安全問題/崩潰/等。

在情況2. vsnprintf知道將包含結果的緩衝區有多大,並且它將確保不會超過該緩衝區(而不是截斷結果以適合buf)。

+0

您對vs {,n} printf的調用缺少'buf'參數。 – 2014-09-24 07:52:02

+0

@nos,它與格式化字符串漏洞有什麼關係?維基百科:http://en.wikipedia.org/wiki/Uncontrolled_format_string – user1343318 2014-09-24 07:53:56

+0

@ user1343318它不,這是另一類潛在的問題。 – nos 2014-09-24 07:56:39