我已經看過這個question以及這些PDF文件'1和2,這個page,並且非常理解如果我這樣做printf(SOME_TEST_STRING)
會發生什麼。但我不明白爲什麼確保通過確保緩衝區的大小vsnprintf
與vsprintf
相比變得安全?vsnprintf爲什麼安全?
1
A
回答
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
)。
相關問題
- 1. 這爲什麼不安全?
- 2. 爲什麼Generics.Collections.TObjectList.List不安全?
- 3. __caller__爲什麼不安全?
- 4. 爲什麼CopyOnWriteArrayList安全?
- 5. 爲什麼我的安全iframe被報告爲不安全?
- 6. 爲什麼「strcat」被視爲「不安全」?
- 7. 爲什麼認爲加密更安全?
- 8. 爲什麼在visual studio 2013/2015下發生vsnprintf崩潰?
- 9. 爲什麼肥皂是安全的?爲什麼不使用HTTPS?
- 10. 爲什麼「example.it」安全並且「www.example.it」不安全?
- 11. 爲什麼grunt允許全球安裝?
- 12. 爲什麼scanf比getchar更安全?
- 13. 爲什麼我的cookie不安全?
- 14. 爲什麼內聯JS塊不安全?
- 15. 爲什麼ASP.NET比ASP Classic更安全?
- 16. 爲什麼MAVLink協議不安全?
- 17. 爲什麼coffeescript需要全局安裝?
- 18. 爲什麼這個線程安全?
- 19. 爲什麼在JavaScript中eval不安全?
- 20. 爲什麼ConcurrentHashMap.putifAbsent是安全的?
- 21. 爲什麼會話ID cookie不安全
- 22. 爲什麼Django函數django.views.static.serve()不安全?
- 23. 爲什麼C#中的ArrayList不安全?
- 24. 爲什麼suhosin.executor.allow_symlink存在安全問題?
- 25. 爲什麼Rabin Cryptosystem比RSA更安全?
- 26. AddWithValue sql注射安全嗎?爲什麼?
- 27. 爲什麼同步安全的整數?
- 28. SimpleDateFormat - 不安全,但爲什麼?
- 29. 爲什麼vapply比sapply更安全?
- 30. 爲什麼是安全的弦
您對vs {,n} printf的調用缺少'buf'參數。 – 2014-09-24 07:52:02
@nos,它與格式化字符串漏洞有什麼關係?維基百科:http://en.wikipedia.org/wiki/Uncontrolled_format_string – user1343318 2014-09-24 07:53:56
@ user1343318它不,這是另一類潛在的問題。 – nos 2014-09-24 07:56:39