← На главную

Zoom вместо AJAX грузил картинку с localhost — получилась уязвимость

21.06.2026 01:35 · hackernews

Разработчики массово не понимают CORS — и это приводит к уязвимостям вроде той, что недавно нашли у Zoom. Крис Фостер объясняет, в чём проблема.

Безопасник Джонатан Лейтшух обнаружил, что Zoom держит веб-сервер на http://localhost:19421. Когда пользователь переходит по Zoom-ссылке, сайт посылает запрос на локальный сервер и тот запускает нативное приложение. Но обычный AJAX-запрос браузер не пропустил бы из-за CORS. Поэтому Zoom пошёл на хитрость: вместо XMLHttpRequest сайт загружает с локального сервера картинку. А код ошибки или статус сервер кодирует в размерах изображения. Браузер не блокирует загрузку изображений с localhost, поэтому обход срабатывает. Но вместе с Zoom-сайтом такую картинку может загрузить любой другой сайт в интернете. Это и есть уязвимость.

Фостер отмечает, что в статье Лейтшуха есть неточность — будто Chrome игнорирует CORS-заголовки на localhost. На самом деле Chrome их учитывает, как и любой другой браузер. И это легко проверить: фронтенд на одном порту, бэкенд на другом — классический сценарий кросс-доменных запросов к localhost, который прекрасно работает с правильными заголовками.

Правильная реализация выглядела бы так: локальный сервер на localhost:19421 должен отдавать REST API с заголовком Access-Control-Allow-Origin: https://zoom.us. Тогда Javascript только с домена zoom.us мог бы с ним общаться. Дополнительно стоило бы повесить Content Security Policy, которая запрещает встраивать страницу Zoom в iframe, чтобы сайты не могли незаметно открывать встречи в фоне. А уж решение открывать камеру и микрофон без явного диалога — это вообще плохой UX, к безопасности не относится.

И это не единичный случай. Фостер сталкивался с непониманием CORS у разработчиков любого уровня. На Stack Overflow полно советов вроде «поставь Access-Control-Allow-Origin: *» — и люди копируют их как есть, даже не думая о последствиях. Другие компании тоже попадались на той же уязвимости, что и Zoom. Разработчики хотят просто заставить код работать и обходят same-origin policy целиком, но потом получают громкие проблемы. Фостер не уверен, виновата ли сложность самого CORS или нехватка образования, но текущий подход явно не работает.

Читать оригинал →