安全編程:初始化那些你忽略掉的東西
對于黑客來說,特權(quán)提升漏洞是令他感到非常興奮的事情,而有時候這種漏洞的來源僅僅是因為開發(fā)者忘記將內(nèi)存緩沖區(qū)中的垃圾數(shù)據(jù)進(jìn)行初始化。此話怎講?
我想,現(xiàn)在每個人都應(yīng)該熟悉 SecureZeroMemory 函數(shù)的使用,它用來擦除包含敏感信息的緩沖區(qū),但是在將緩沖區(qū)的內(nèi)容寫入另一個位置之前,你還必須將其清零。例如,請考慮以下二進(jìn)制格式:
下面是一段想文件中寫入數(shù)據(jù)的例子:
在上面的代碼中,你有沒有看到隱藏在其中的安全問題?
如果輸入的注釋內(nèi)容的長度短于 255 個字符,則在空終止字符之后的字節(jié)由未初始化的堆棧垃圾組成。這段堆棧垃圾數(shù)據(jù)中,可能包含你不打算泄漏到文件中的有趣信息。
當(dāng)然,它不會包含你已經(jīng)識別為高度敏感的信息,例如密碼,但它仍然可能包含雖然不太敏感,但對于尋找它的人來說仍然有價值的信息。
例如,根據(jù)編譯器決定放置局部變量的位置,你可能會將帳戶名泄漏到這些未使用的字節(jié)中。
有人告訴我,一家公司很久以前的網(wǎng)絡(luò)軟件也有一個類似的Bug。
他們使用了一種非常先進(jìn)的”更改密碼”的算法,其細(xì)節(jié)并不重要。設(shè)計是只在網(wǎng)絡(luò)上傳輸高度加密的數(shù)據(jù)。這樣,在網(wǎng)絡(luò)上并捕獲數(shù)據(jù)包的黑客就不會看到任何有價值的東西。
但是他們的客戶端中有一個錯誤:當(dāng)它向服務(wù)器發(fā)送加密密碼時,它忘記了清空”更改密碼”數(shù)據(jù)包中未使用的字節(jié)。在那些未使用的字節(jié)中,你猜對了,是純文本密碼的副本。
總結(jié)
道高一尺魔高一丈,我們必須小心行事。
寫代碼的同時,也將自己帶入到黑客角色問自己:”這段代碼會不會有安全漏洞?”