<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Git嚴(yán)重漏洞,遠(yuǎn)程執(zhí)行代碼,Mac和Windows通殺!

          共 4405字,需瀏覽 9分鐘

           ·

          2024-05-29 16:03

          不得了了,家人們!

          就在這幾天,Git爆出了一個嚴(yán)重漏洞,編號CVE-2024-32002,一個可以遠(yuǎn)程執(zhí)行代碼的RCE漏洞!

          攻擊者精心準(zhǔn)備一個Git項(xiàng)目,只要你嘗試去Clone它,你的電腦就能執(zhí)行攻擊代碼淪陷。

          比如下面這個GitHub上面的項(xiàng)目:

          你可以執(zhí)行一下下面的命令:

          git clone --recursive [email protected]:amalmurali47/git_rce.git

          不出意外的話,你的電腦將會彈出計(jì)算器程序:

          能讓你彈計(jì)算器,就能執(zhí)行其他更危險(xiǎn)的操作,比如給你種木馬等等。

          Git是我們程序員基本離不開的工具,這波漏洞操作,屬實(shí)是對程序員定向打擊了。

          接下來我們來理一理這個漏洞的工作原理是怎么樣的。

          在介紹攻擊原理之前,得先來了解幾個東西。

          1、Git 鉤子

          在Git里面有一個HOOK的機(jī)制,就是鉤子的意思。不過這個HOOK不是咱們二進(jìn)制安全攻擊中的那個HOOK。

          Git中的鉤子是一些腳本,這些腳本在Git的特定事件發(fā)生時自動執(zhí)行。鉤子允許你在Git操作的不同階段執(zhí)行自定義操作,如代碼格式化、測試運(yùn)行、通知發(fā)送等。

          Git 設(shè)計(jì) hooks(鉤子)的初衷是為了讓用戶能夠在特定的 Git 事件發(fā)生時自動執(zhí)行自定義腳本或操作。這些鉤子提供了一種機(jī)制,可以在 Git 操作的各個階段插入用戶自定義的邏輯,以便實(shí)現(xiàn)更強(qiáng)大的自動化和定制化流程。

          Git鉤子分為服務(wù)端和客戶端鉤子,在咱們程序員使用的Git客戶端中,有下面這幾個鉤子:

          • pre-commit:在提交之前運(yùn)行。可以用來檢查代碼格式、運(yùn)行單元測試等。
          • prepare-commit-msg:在提交信息編輯器打開之前運(yùn)行。可以用來自動生成提交消息模板。
          • commit-msg:在提交信息編輯器關(guān)閉之后運(yùn)行。可以用來驗(yàn)證提交消息的格式。
          • post-commit:在提交完成之后運(yùn)行。可以用來發(fā)送通知或執(zhí)行其他后續(xù)任務(wù)。
          • pre-rebase:在變基操作之前運(yùn)行。可以用來檢查變基前的狀態(tài)。
          • post-checkout:在 git checkout 命令執(zhí)行之后運(yùn)行。可以用來設(shè)置特定文件的狀態(tài)。
          • post-merge:在合并操作完成之后運(yùn)行。可以用來重新編譯項(xiàng)目或執(zhí)行其他合并后的任務(wù)。

          那這些鉤子腳本是存放在哪里的呢?就是在那個神秘的.git目錄下。

          大家可以去看一下自己電腦上,不管是從GitHub克隆的項(xiàng)目,還是從公司的git服務(wù)器克隆的項(xiàng)目,你們的代碼目錄下,都有一個叫.git的文件夾,它的目錄結(jié)構(gòu)大致是下面這樣的:

          當(dāng)我們創(chuàng)建一個新的Git項(xiàng)目時,執(zhí)行完git init后,git就會為我們創(chuàng)建一個.git目錄。

          而我們剛才說的鉤子腳本,就放在.git/hooks里面,git默認(rèn)為我們提供了一些鉤子腳本的示例。

          你可以在這里面添加一些自己的腳本程序,這樣當(dāng)你在執(zhí)行對應(yīng)的git命令操作時,對應(yīng)的腳本程序就會得到執(zhí)行。

          要注意,.git目錄下的內(nèi)容,是git程序自己在維護(hù),不會受到Git項(xiàng)目里的內(nèi)容的影響。你在上傳代碼的時候,.git目錄也不會被傳到服務(wù)器上去。

          所以,正常情況下,你從服務(wù)器克隆一個項(xiàng)目的時候,只是把項(xiàng)目拉到本地,不用擔(dān)心執(zhí)行惡意的HOOK腳本,因?yàn)?git目錄是你本地的git客戶端程序創(chuàng)建的,除非你手動去把鉤子腳本放到里面去,否則里面是不會有惡意鉤子腳本的。

          但是,我要說但是了,這一次漏洞的操作就很騷,騷在哪里呢?騷就騷在,它巧妙的利用了一個特性,把攻擊腳本給寫到.git目錄下面去了!

          這是怎么辦到的呢?這需要了解另一個Git的知識。

          2、子模塊

          子模塊是嵌套在一個 Git 倉庫中的另一個 Git 倉庫,可以讓你在一個項(xiàng)目中包含其他項(xiàng)目,比如某個開源項(xiàng)目要依賴于其他的開源項(xiàng)目。

          在這種情況下,主項(xiàng)目下面會存在一個.gitmodules文件,里面會記錄該項(xiàng)目包含的其他Git項(xiàng)目的信息。

          其中,path指定子模塊存放的位置,url指定子模塊的Git倉庫地址。

          我們在執(zhí)行g(shù)it clone克隆項(xiàng)目的時候,如果指定了一個遞歸的參數(shù):--recursive,就會在拉取主項(xiàng)目之后,然后根據(jù)這個文件中的內(nèi)容,遞歸的去拉取所依賴的其他子模塊,然后放到對應(yīng)的文件目錄位置。

          不僅主項(xiàng)目有一個.git目錄來記錄項(xiàng)目相關(guān)的信息,子模塊也有。你去上面這個path目錄下去看,會發(fā)現(xiàn)這里也有一個.git,不過這個.git不是一個文件夾,而是一個文件,里面記錄了這個子模塊對應(yīng)的真正的.git目錄的位置。

          這個位置一般在主項(xiàng)目.git目錄下的modules文件夾下面。

          3、符號鏈接

          接下來了解與這個漏洞相關(guān)的第三個知識點(diǎn):符號鏈接。

          在 Git 中,符號鏈接(symbolic link,簡稱 symlink)是指向另一個文件或目錄的特殊類型的文件。符號鏈接本身不包含文件的內(nèi)容,而是包含指向目標(biāo)文件或目錄的路徑。當(dāng)訪問符號鏈接時,系統(tǒng)會自動重定向到其指向的目標(biāo)。

          簡單理解的話,這玩意兒有點(diǎn)像快捷方式。

          4、漏洞成因

          好了,了解了上面這些知識背景,接下來,就要說說這個漏洞的成因了。

          剛才說過,鉤子腳本位于.git目錄中,而這個目錄是與項(xiàng)目本身的內(nèi)容無關(guān)的,它的內(nèi)容是git客戶端在維護(hù),除非你手動放置腳本程序到hooks目錄中,否則項(xiàng)目中的內(nèi)容是不會跑到.git目錄中的。

          而這次漏洞就采用了一個騷操作:

          攻擊者準(zhǔn)備一個Git項(xiàng)目,在這個Git項(xiàng)目中,又依賴一個子項(xiàng)目。當(dāng)采用--recursive參數(shù)的時候,遞歸去拉取對應(yīng)的子項(xiàng)目,放到對應(yīng)的位置。

          就像上面這樣,它指示git,把url中的項(xiàng)目拉下來放到A/modules/x目錄中。

          然后騷操作來了:在這個項(xiàng)目下,有一個名字叫a的符號鏈接,并且讓它指向了.git目錄。

          因?yàn)閃indows和Mac平臺的文件和目錄名稱是大小寫不敏感,注意這點(diǎn)很重要,導(dǎo)致在放置子模塊到A/modules/x的時候,實(shí)際上就是放到了.git/modules/x目錄下去了。

          Git項(xiàng)目內(nèi)容寫到.git目錄下了!事情就出在這里了!.git目錄是git程序的私家花園,被項(xiàng)目內(nèi)容闖了進(jìn)來!

          你可能會問,一定要大小寫不一樣嗎,我直接在.gitmodules文件里面指定讓它寫到小寫的a/modules/x路徑下不行嗎?

          還真不行,我試過了,git直接報(bào)錯了:

          看來,git基本的檢查工作還是做了的,只是疏漏了大小寫不一樣的情況。

          繼續(xù)我們剛剛的分析,.git目錄這個git程序的私家花園,被人給闖進(jìn)來了。

          而且關(guān)鍵是它闖進(jìn)來的位置是在.git/modules/x下面,前面說過,這個目錄下面,是子模塊所屬的.git目錄,然后這個闖進(jìn)來的家伙,還按照.git目錄的結(jié)構(gòu),里面放置一個hooks文件夾,里面放上相關(guān)的鉤子腳本,等下git clone完成的時候,就會去執(zhí)行這里的腳本程序了。

          克隆完成之后的整個目錄結(jié)構(gòu)變成了這樣:

          我用procmon抓了一下執(zhí)行下面這條克隆命令到彈出計(jì)算器進(jìn)程中間的過程

          git clone --recursive [email protected]:amalmurali47/git_rce.git

          大家從進(jìn)程的父子關(guān)系樹和進(jìn)程的命令行參數(shù),就能看到這條攻擊鏈路了:

          最后總結(jié)一下:

          1、攻擊者精心構(gòu)造了一個Git項(xiàng)目,這個項(xiàng)目依賴一個子項(xiàng)目,并且指定了這個子項(xiàng)目存儲的路徑為A。

          2、在這個Git項(xiàng)目下,有一個名為a的符號鏈接,指向了.git目錄。

          3、子項(xiàng)目里面構(gòu)造了一個hooks目錄,攻擊腳本存放在里面。

          4、最后,遞歸克隆項(xiàng)目的時候,因?yàn)槟夸洿笮懖幻舾械脑颍禹?xiàng)目實(shí)際上被寫到了.git目錄下。

          5、相關(guān)的克隆動作,觸發(fā)了post-checkout鉤子的執(zhí)行,而現(xiàn)在的hooks目錄下,被寫入了攻擊者的惡意鉤子腳本,于是就執(zhí)行了這個惡意腳本。

          Windows:

          Mac:

          以上就是本次漏洞的大致過程了。

          本次漏洞受影響的版本有:

          • v2.45.0
          • v2.44.0
          • <=v2.43.3
          • <=v2.42.1
          • v2.41.0
          • <=v2.40.1
          • <=v2.39.3

          趕緊來執(zhí)行g(shù)it --version看看你的版本有沒有在上面的范圍里,是的話趕緊升個級吧!

          溫馨提示:陌生人發(fā)來的Git項(xiàng)目鏈接,不要隨意去克隆,小心被攻擊哦~


          ·················END·················

          瀏覽 143
          1點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          1點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产成人免费高清视频 | 曰本伊人 | 日本亚洲免费在线视频 | 日韩视频一二三区 | 囯产精品久久久久 |