В браузерном дополнении, устанавливаемом при использовании платформы для проведения web-конференций Cisco WebEx, выявлена показательная уязвимость, позволяющая при открытии в браузере специально оформленной страницы выполнить код на уровне операционной системы с правами текущего пользователя. Платформа WebEx получила большое распространение в корпоративной среде и насчитывает более 20 млн пользователей.
Уязвимость вызвана наличием предопределённого идентификатора, позволяющего передать дополнению команды. В частности, команды можно передать через запрос специально оформленно страницы, обращение к которой может быть скрыто от пользователя путем применения блоков iframe. Так как дополнение реализовано в виде надстройки над нативным кодом, вызываемым при помощи API nativeMessaging, атакущие могут добиться выполнения вызовов nativeMessaging от имени дополнения и организовать выполнение произвольного кода на уровне системы.
Эксплоит достаточно прост и сводится к выполнению передачи сообщения WebEx с любой страницы, названной
«cwcsf-nativemsg-iframe-43c85c0d-d633-af5e-c056-32dc7efc570b.html» (название принципиально, так как является идентификатором, позволяющим выполнить действия на стороне дополнения). Для выполнения кода используется команда GpcInitCall, позволяющая вызвать функцию из нативного компонента. Например, в подготовленном для платформы Windows эксплоите осуществляется обращение к библиотеке «MSVCR100.DLL» и вызов функции «_wsystem()». В качестве примера приведён запуск калькулятора после открытия в браузере подготовленной атакующими web-страницы.
В дополнении подобная функциональность используется для передачи события «launch_meeting», в результате которого управление передаётся установленному в систему коммуникационному клиенту WebEx (разделяемая библиотека «atmccli»). Передаваемые в составе события «launch_meeting» команды вызывают обработчики, реализованные в виде функций, экспортируемых библиотекой «atmccli». Так как имя библиотеки и команда передаётся в составе запроса, атакующий имеет возможность вместо «atmccli» указать любую системную библиотеку, а вместо команды — любую экспортируемую этой библиотекой функцию. Подобные возможности оставались бы особенностью внутреннего кода дополнения, если бы не наличие скрытого идентификатора, позволяющего передавать команды с внешних ресурсов.
var msg = { ... GpcComponentName: btoa("MSVCR100.DLL"), GpcInitCall: btoa("_wsystem(ExploitShellCommand);"), ExploitShellCommand: btoa("calc.exe"), } document.dispatchEvent(new CustomEvent("connect", { detail: { token: "token" }})); document.dispatchEvent(new CustomEvent("message", { detail: { message: JSON.stringify(msg), message_type: "launch_meeting", timestamp: (new Date()).toUTCString(), token: "token" } }));