簡體   English   中英

如何修復fprintf漏洞?

[英]How to fix fprintf vulnerability?

在我的代碼中,我使用了fprintf。 我使用flawfinder檢查代碼是否存在漏洞,我得到了:

358:[4](格式) fprintf :如果格式字符串可能受到攻擊者的影響,則可以利用它們。 使用常量作為格式規范。

有人可以向我解釋一下格式規范使用常量實際意味着什么嗎? 有沒有安全版的fprintf

問題是fprintf通過檢查格式字符串來確定應該獲得多少個參數。 如果格式字符串與實際參數不一致,則您具有未定義的行為,可以表現為安全漏洞。

如果提供的字符串可能會受到程序用戶的影響,那么問題尤其嚴重,因為他可以專門設計字符串以使程序執行不良操作。

C標准中沒有安全版本的fprintf C ++流避免了這個問題,代價是沒有格式字符串,並且使用了更詳細的語法來指定格式化選項。

一個常量字符串,如字符串文字中所示。

fprintf(someFile, "%s", someStringVariable);

不是喜歡

fprintf(someFile, someStringVariable);

這意味着它要你寫:

fprintf(out, "foo %s", some_string);

而不是你有什么,我猜是這樣的:

const char *format = "foo %s";

/* some time later */

fprintf(out, format, some_string);

原因是擔心format可能來自用戶輸入或其他東西,惡意用戶可能提供格式foo %s%s%s以引發他們可能能夠利用的未定義行為。

顯然,如果您在n種不同的格式字符串中進行選擇,所有這些字符串都是代碼中的字符串文字,並且都使用相同的格式說明符,但是您在運行時選擇哪一個,那么遵循此建議有點尷尬並且不會使你的代碼更安全。 但是你可以有n函數而不是n字符串,每個函數用不同的字符串文字調用fprintf

如果你正在從配置文件中讀取格式字符串(這是從頭開始實現國際化的一種相當粗略的方式)那么你基本上沒有運氣。 linter不信任您的翻譯人員使用正確的格式代碼來提供給調用的參數。 可以說你也不應該:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM