深入理解計算機系統》 練習題2.37答案
阿新 • • 發佈:2018-12-20
XDR庫中的安全漏洞
1)size_t是unsigned int
型的。
2)malloc的函式原型是void *malloc(unsigned int size)
。
如果第9行程式碼裡,ele_cnt * ele_size
的乘積結果超過了unsigned int
的範圍([0, ]),就會發生正溢位,乘積結果就會被截斷,結果為 乘積 mod 。
按照原文描述,malloc函式只會分配4096個位元組的空間用來複制,但由於ele_cnt還是很大,所以在4096個位元組都已經複製後,後面的那麼多位元組還會進行復制,但後面的位元組明顯都不是malloc函式分配的空間,所以就會在後面的複製發生錯誤。
這段程式碼有什麼改進?
uint64_t asize = ele_cnt * (uint64_t) ele_size;
void *result = malloc(asize);
假設會溢位,那麼雖然到了asize這步還不會溢位,因為在等式右邊已經先把兩個乘子強制型別轉換為uint64_t
了。
但是到了malloc函式時,由於此函式的原型設計,還是會被截斷,傳入malloc函式時發生溢位。
如何修改
uint64_t asize = ele_cnt * (uint64_t) ele_size;
unsigned int asize2 = ele_cnt * ele_size;
if (asize == asize2) {//執行分配 }
else { //丟擲異常}
檢測溢位,這裡用截斷來檢測。也可以用除法來檢測。見上一篇部落格。