Недавно ИБ-исследователь Масато Кинугава (Masato Kinugawa) рассказал в своем блоге, как ему удалось создать работающую цепочку из нескольких уязвимостей (и эксплоитов для них), ведущую к удаленному исполнению произвольного кода в «настольной» версии мессенджера Discord.
Первую проблему эксперт обнаружил во фреймворке Electron, который используется десктопной версией Discord. Хотя сам Discord не является опенсорсным приложением, код JavaScript, который использует Electron, сохраняется локально и может быть извлечен и исследован. Именно так исследователь выяснил, что для одной из настроек (contextIsolation) в Electron для Discord было установлено значение false, и это обстоятельство позволяло внешнему JavaScript-коду влиять на код внутренний, к примеру, функцию Node.js.
«Подобное поведение опасно, так как Electron позволяет JavaScript-коду за пределами веб-страниц использовать Node.js независимо от nodeIntegration, что в итоге может привести к удаленному выполнению произвольного кода, даже если для nodeIntegration установлено значение false», — пишет Кинугава.
Так как теперь исследователю понадобился способ выполнения JavaScript в приложении, это привело его к обнаружению XSS-бага в iframe, используемом для отображения видео в чате (срабатывает, если в чат вставляют ссылку, например, из YouTube). Таким образом Кинугава добрался до Sketchfab, решения предназначенного для просмотра 3D-контента. Sketchfab внесен в белый список Discord и может быть встроен в iframe, а при этом можно эксплуатировать DOM XSS-баг.
Однако этот баг позволял исследователю выполнять JavaScript в iframe, но не выполнить код в самой десктопной версии Discord. В итоге, пытаясь развить свою атаку дальше, Кинугава обнаружил способ обхода ограничений в Electron, связанный с событием will-navigate. Данная уязвимость получила идентификатор CVE-2020-15174. В сочетании с двумя другими багами, описанными выше, она наконец позволила специалисту осуществить RCE-атаку на Discord.
Эксперт передал результаты своих изысканий в официальную программу bug bounty Discord, и в настоящее время разработчики уже отключили встраивание Sketchfab и добавили песочницу для iframe. Масато Кинугава получил от Discord вознаграждение за обнаруженные уязвимости в размере 5000 долларов США, а также получил еще 300 долларов от авторов Sketchfab за обнаружение XSS.