W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
當(dāng)一個變量可能被多個線程使用時,應(yīng)當(dāng)使用原子操作或加鎖操作。
// Bad
char g_somechar;
void foo_thread1() {
g_somechar += 3;
}
void foo_thread2() {
g_somechar += 1;
}
對于可以使用原子操作的,應(yīng)當(dāng)使用一些可以確保內(nèi)存安全的操作,如:
// Good
volatile char g_somechar;
void foo_thread1() {
__sync_fetch_and_add(&g_somechar, 3);
}
void foo_thread2() {
__sync_fetch_and_add(&g_somechar, 1);
}
對于 C 代碼,C11
后推薦使用 atomic 標(biāo)準(zhǔn)庫。
對于 C++代碼,C++11
后,推薦使用 std::atomic
。
關(guān)聯(lián)漏洞:
高風(fēng)險-內(nèi)存破壞
中風(fēng)險-邏輯問題
競爭條件經(jīng)常出現(xiàn)在信號處理程序中,因為信號處理程序支持異步操作。攻擊者能夠利用信號處理程序爭用條件導(dǎo)致軟件狀態(tài)損壞,從而可能導(dǎo)致拒絕服務(wù)甚至代碼執(zhí)行。
free
時,通常會出現(xiàn)另一個信號爭用條件,從而導(dǎo)致雙重釋放。即使給定指針在釋放后設(shè)置為NULL
,在釋放內(nèi)存和將指針設(shè)置為NULL
之間仍然存在競爭的可能。// Bad
char *log_message;
void Handler(int signum) {
syslog(LOG_NOTICE, "%s\n", log_m_essage);
free(log_message);
sleep(10);
exit(0);
}
int main (int argc, char* argv[]) {
log_message = strdup(argv[1]);
signal(SIGHUP, Handler);
signal(SIGTERM, Handler);
sleep(10);
}
可以借由下列操作規(guī)避問題:
關(guān)聯(lián)漏洞:
高風(fēng)險-內(nèi)存破壞
中風(fēng)險-邏輯問題
TOCTOU: 軟件在使用某個資源之前檢查該資源的狀態(tài),但是該資源的狀態(tài)可以在檢查和使用之間更改,從而使檢查結(jié)果無效。當(dāng)資源處于這種意外狀態(tài)時,這可能會導(dǎo)致軟件執(zhí)行錯誤操作。
當(dāng)攻擊者可以影響檢查和使用之間的資源狀態(tài)時,此問題可能與安全相關(guān)。這可能發(fā)生在共享資源(如文件、內(nèi)存,甚至多線程程序中的變量)上。在編程時需要注意避免出現(xiàn)TOCTOU問題。
例如,下面的例子中,該文件可能已經(jīng)在檢查和lstat之間進(jìn)行了更新,特別是因為printf有延遲。
struct stat *st;
lstat("...", st);
printf("foo");
if (st->st_mtimespec == ...) {
printf("Now updating things\n");
UpdateThings();
}
TOCTOU難以修復(fù),但是有以下緩解方案:
關(guān)聯(lián)漏洞:
高風(fēng)險-內(nèi)存破壞
中風(fēng)險-邏輯問題
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: