今天在fortify代碼掃描的時(shí)候檢測(cè)出一個(gè)HOT,漏洞類(lèi)型是Buffer Overflow,元兇是sprintf。
1
sprintf(aTmp, "16.2f", TransAmt);
其中aTmp是20位字符數(shù)組,TransAmt為double型金額字段,值不確定。
理論上來(lái)說(shuō),是TransAmt按照格式16.2f寫(xiě)進(jìn)aTmp的時(shí)候,有可能產(chǎn)生越界的錯(cuò)誤。我一開(kāi)始考慮將aTmp長(zhǎng)度放長(zhǎng)后,double應(yīng)該可以順利拷進(jìn)aTmp,嘗試將aTmp的長(zhǎng)度分配到50,100,200,還是消除不掉這個(gè)HOT,因?yàn)椴幻靼资莇ouble所表示的浮點(diǎn)數(shù)的長(zhǎng)度有可能超過(guò)200位還是fortify認(rèn)死理,而銀行又強(qiáng)制規(guī)定代碼掃描不能有HOT(-。-),所以將sprintf替換成snprintf。
1
snprintf(aTmp, sizeof(aTmp), "16.2f", TransAmt);
需要注意的一點(diǎn)是,第二個(gè)參數(shù)的值。網(wǎng)上有人提到寫(xiě)成snprintf(buf, 10, "%10s", p)其實(shí)是不對(duì)的,因?yàn)檫@里的長(zhǎng)度,是包括結(jié)束符0x00的,也就是說(shuō),既然需要按照%10s格式化,那么這里的第二個(gè)參數(shù)必須寫(xiě)成11而不是10。
相似的,strcpy等不帶長(zhǎng)度的字符串操作函數(shù),如果不注意寫(xiě)法,往往會(huì)有Buffer Overflow的隱患。這時(shí)候,一般來(lái)說(shuō)以strncpy等類(lèi)似的帶長(zhǎng)度參數(shù)的函數(shù)替換就可以避免漏洞的產(chǎn)生。
另外,在網(wǎng)上查這個(gè)問(wèn)題的時(shí)候,看到一個(gè)關(guān)于sprintf和snprintf的自拷貝的問(wèn)題。
1
sprintf(buf, "%s world\n", buf);
因?yàn)槲易约河袝r(shí)候也會(huì)有這種寫(xiě)法,但也是不太確定會(huì)不會(huì)有問(wèn)題。既然網(wǎng)上已經(jīng)有明確的研究了,那我就直接拿結(jié)論。
關(guān)于這兩個(gè)函數(shù)的自拷貝問(wèn)題,在不同的編譯器上,結(jié)果不同。編譯器可以有不同的策略,有的簡(jiǎn)單的把原先的值抹去,有的會(huì)保留。因此,一般來(lái)說(shuō),我們應(yīng)該盡量避免這種寫(xiě)法。
posted on 2010-02-09 23:25
RayRiver 閱讀(2134)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
C/C++