В марте 2020 года, когда весь мир привыкал к удаленной работе, в одном из главных инструментов для удаленного общения, клиенте для сервиса Zoom, была обнаружена уязвимость в установщике, позволяющая выполнять на компьютерах Apple произвольный код. Компания Zoom починила уязвимость… Почти. В августе 2022 года примерно там же была найдена еще одна дыра, которую можно было использовать в похожих целях. В этом посте мы расскажем про свежую проблему и попробуем объяснить, почему дыры в софте иногда находят в одном и том же месте несколько раз подряд. И что с этим делать.
Что за свежая уязвимость?
О новой проблеме в клиенте для веб-конференций Zoom известный исследователь Патрик Уордл рассказал на конференции DEF CON 30 в начале августа. Если совсем коротко, в системе автоматических обновлений клиента Zoom на компьютерах Apple было обнаружено несколько ошибок. Они теоретически позволяли получить так называемые права суперпользователя, с которыми потенциальный атакующий может делать на компьютере все что угодно. Для эксплуатации уязвимости, впрочем, злоумышленник уже должен иметь доступ к компьютеру — пусть и без особых прав. Но нельзя сказать, что это совсем уж нереальный сценарий: например, владелец может отойти и забыть заблокировать компьютер. Уязвимостью в теории могли воспользоваться и авторы вредоносной программы, которая иначе не могла бы нанести пользователю серьезного ущерба.
А подробнее?
Своевременная доставка и простая установка обновлений — важное требование для любой современной программы. В идеале установка программ вообще должна проходить незаметно для пользователя, но это не всегда возможно. Часто для завершения обновления программу нужно перезапустить, в некоторых случаях требуется ввести пароль пользователя, а иногда нужна и перезагрузка. Нас всех раздражают внезапно всплывающие напоминания о необходимости обновить программу, операционную систему, прошивку на смартфоне и планшете. Но это важно и необходимо: обновления закрывают прорехи в безопасности, которые иначе могут быть использованы против вас. В некоторых, особо серьезных случаях защититься от активных кибератак на какое-то уязвимое ПО необходимо как можно быстрее: день промедления может стоить потерянных данных.
Самый банальный способ обновить приложение на Mac OS ничем не отличается от первой установки программы: скачиваем файл с новой версией, запускаем, вводим пароль пользователя. В Zoom постарались эту процедуру упростить: клиент для конференц-звонков сам обращается к серверу, сам скачивает новую версию и сам устанавливает ее, не требуя от пользователя ввода пароля. К сожалению, этот процесс связи с сервером, скачивания и установки программ далеко не всегда удается реализовать правильно. 10 лет назад было распространено обращение к серверам без шифрования данных: а значит, потенциальный злоумышленник просто может подменить файл с обновлением на вредоносную программу. Внедрили шифрование — стало сложнее, но можно подменить файл уже после загрузки, когда он уже сохранен на диске, но еще не устанавливается.
В свежей (по состоянию на конец прошлого года, когда Патрик начал свое исследование) версии Zoom вроде бы все было сделано правильно. Клиент обращается к специальному серверу обновлений по защищенному каналу. Скачивает файл, удостоверяется в его подлинности, проверяя, что он подписан сертификатом производителя, устанавливает. Для установки у системы временно запрашиваются права суперпользователя, но так, чтобы владельцу компьютера не приходилось вводить пароль.
Цифровая подпись — это важно. Ведь по сути откуда-то из Интернета на компьютер пользователя скачивается программа и выполняется с максимальными привилегиями. Нужно удостовериться, что это действительно «та» программа. И просто так подменить загруженный файл не получится: как показано выше на слайде из презентации Патрика, подмена файла приводит к выводу сообщения об ошибке — цифровой подписи у ложного обновления нет, а подделать ее крайне трудно.
Увы, сам процесс проверки цифровой подписи нес в себе ошибку. Работал он так: запускалась системная утилита. Она выводила параметры цифровой подписи скачанного обновления, в том числе строку с данными о том, какая компания получила сертификат:
Zoom Video Communications, Inc. Developer ID Certification Authority Apple Root CA
Вывод утилиты обрабатывался, и если такая строка там присутствовала — то начиналась установка. Проблема была в том, что в вывод также попадало имя файла. И теоретически злоумышленник мог сделать вредоносное обновление с хитрым именем файла: вместо стандартного «ZoomUpdate.pkg» использовать «Zoom Video Communications, Inc. Developer ID Certification Authority Apple Root CA.pkg». И этого было достаточно, чтобы обмануть процедуру проверки: раз нужная строка есть, значит, файл легитимный, хотя уже и файл не тот, и «волшебные слова» написаны не там!
То есть атака могла выглядеть так: каким-то образом инициируем процедуру проверки обновлений (это не сложно), скачивается легитимный апдейт, мы его подменяем вредоносной программой и переименовываем так, чтобы успешно прошла сломанная проверка сертификата. Вредоносный файл запускается с привилегиями системы, компьютер взломан!
Но 20 декабря было выпущено очередное обновление клиента, которое сделало этот вариант атаки невозможным. Изменение было простое: файл принудительно переименовывался после загрузки. Но Патрик Уордл смог модифицировать атаку: если клиент начиная с версии 5.9.0 защищен, то давайте «обновим» клиент Zoom до любой более старой. Оказалось, что такое возможно: ведь у старого обновления был легитимный цифровой сертификат, а версия при установке не проверялась.
Почему это важно?
Исследование Патрика Уордла показывает, как важно защищать систему доставки и установки обновлений. Кроме того, история этого бага также дает понять, как часто разработчики программ пытаются решить проблему каким-то простым изменением, не анализируя ее детально. Сначала (еще до того, как Уордл сообщил о проблеме в Zoom) в декабре 2021 года сломали самый простой вариант атаки, с банальной подменой файла и обходом проверки сертификата. После сообщения об уязвимости, в апреле 2022 года, закрыли возможность «даунгрейда» — установки более старой и более уязвимой версии Zoom через стандартный механизм доставки обновлений. Только в июле 2022 года, через полгода после отчета исследователя, механизм проверки цифровых сертификатов починили.
Самое интересное, что и это не полностью решило проблему. Да, у нашего потенциального взломщика «отобрали» два простых способа атаки: через подмену файла с обновлением на вредоносный код и через «даунгрейд» до уязвимой версии. Но была еще одна проблема: файл обновления, запускаемый с привилегиями суперпользователя, мог быть модифицирован кем угодно, имеющим доступ к компьютеру! Достаточно было найти способ таки подсунуть установщику Zoom вредоносный файл в подходящий момент: после того, как была проверена цифровая подпись, но до того, как начнется установка. И такой метод действительно сработал. В результате в августе 2022 года, когда Патрик Уордл докладывал о своей работе на конференции DEF CON, через 8 месяцев после сообщения в Zoom о проблеме, уязвимость так и не была закрыта полностью! И только 17 августа, через пять дней после доклада Патрика, проблема окончательно была решена еще одним патчем. Впрочем, и это утверждение нуждается в независимой проверке.
О хакерах и разработчиках
Когда знакомишься с исследованием Патрика Уордла, невольно возникает вопрос: а почему так вообще выходит? Как в важном месте программы возникают такие детские уязвимости и почему даже после сообщения о проблеме их закрывают по восемь месяцев и с третьей попытки? Не хотелось бы без причины обвинять разработчиков в некомпетентности. Во всех программах время от времени находят ошибки и недочеты. А если все программисты ошибаются, проклятиями в их адрес проблему не решить: других разработчиков у нас все равно нет.
Возможно, причина кроется в том, что у «ответственных хакеров» (исследователей безопасности, сообщающих о своих находках производителю) и киберпреступников (использующих дыры в ПО для атак на пользователей и получения выгоды) другой набор приоритетов по сравнению с создателями ПО. Когда ты разрабатываешь программу, тебе важно сделать правильно сотни разных задач. Твой приоритет — чтобы пользователям было комфортно, удобно, чтобы (в случае Zoom) было хорошее качество связи, чтобы с клиентом работали десятки тысяч разных устройств — микрофонов, веб-камер, наушников, и все это на разных операционных системах, на компьютерах, планшетах, смартфонах, и старых, и новых. Хакеру достаточно найти одну ошибку в коде, которой можно воспользоваться для темных дел. И вот представьте, что вам сообщают об уязвимости. Да, необходимо ее закрыть, но желательно не сломать всю сложную систему из клиентского и серверного ПО. Протестировать ее в сотнях разных конфигураций. Естественно, разработчик пытается решить проблему минимальными изменениями. А их часто оказывается недостаточно.
Поэтому так: программы становятся безопаснее с каждым небольшим патчем. Нельзя просто так взять и решить абсолютно все проблемы, написать невзламываемую программу. Точнее, можно, но для этого придется начать с нуля. Но какие-то критические вещи все же желательно поддерживать в лучшем виде, и система доставки обновлений — это точно одна из них. Нам, пользователям, важно доверять тем программам, которые мы решили установить на компьютер. И в этом смысле история с уязвимостями в Zoom — позитивный пример, когда независимый исследователь и разработчик все-таки решили проблему. Это какой-никакой, но показатель качества ответственности разработчика.
А закончить эту историю хочется важным напоминанием: очень часто вредоносный код попадает на компьютер при первой установке программы. Важно проверять, что утилиты скачиваются из официального источника, использовать по возможности магазины приложений, и уж точно не скачивать программы на сомнительных веб-сайтах. Иначе есть вероятность, что ваши данные будут украдены уж совсем простыми методами взлома, без эксплуатации сложных проблем в официальном ПО.