Mozilla: Armag Add-on

До сих пор ни одно предсказание конца света на памяти человеческой цивилизации не сбылось. Обещанный Армагеддон так и не случился. Но 3 мая 2019 года случилось событие, получившее название Armag Add-on — тотальная неработоспособность дополнений в браузере Mozilla. Дополнения — неотъемлемая часть экосистемы современных браузеров, позволяющая пользователям в разумных пределах менять внешний вид, поведение и автоматизировать некоторые действия, которые им регулярно приходится выполнять, поэтому проблема затронула всех пользователей браузера с корректными настройками даты и времени на устройствах и была сразу осознана как высокоприоритетная.

Жалобы на происходящее переполнили соцсети, несмотря на сравнительно малую долю пользователей Mozilla в современную эпоху. Помимо главного сообщения об ошибке в трекере Mozilla завели ещё, по крайней мере, 50 дубликатов. Пострадали и пользователи Tor — Tor Browser строится на основе Mozilla, и устаревший сертификат в обоих продуктах был один и тот же. В результате стало невозможно использовать плагин NoScript, который требуется для работы в Tor с высоким уровнем безопасности. Инструкции подчёркивали, что все решения для обхода случившейся проблемы — временные и должны быть отключены впоследствии, так как ослабляют проверку валидности дополнений. В обсуждении бага командой Mozilla довольно быстро прозвучало, что баг должен быть исправлен как можно быстрее, пусть и высокой ценой.

Окончательное исправление заняло несколько дней — 7 мая был выпущен релиз версии 66.0.5, полностью решивший проблему. Технический анализ за авторством Эрика Рескорлы (Eric Rescorla), технического директора Mozilla и автора последней версии протокола TLS 1.3, опубликовали только 9 мая. Полный протокол (как обычно называют публикации в таком жанре, post mortem) ожидается ещё через несколько дней, уже не в авральном режиме.

Современные системы установки (и обновления) ПО в большинстве своём требуют криптографической защиты устанавливаемых программ. В Mozilla эта практика внедрена начиная с 2015 года из-за распространения дополнений, несущих в себе вредоносный код. Подпись позволяет установить или автора кода, или хотя бы факт компрометации сертификата, а потом отозвать сертификат при необходимости.

Как положено, при проверке валидности дополнения строится цепочка доверия, проверяется корректность всех подписей и сроков действия сертификатов, которые использованы для построения цепочки. Как правило, отключить эту проверку нельзя из соображений безопасности. Почти все сертификаты авторов дополнений были подписаны одним и тем же сертификатом Mozilla, который и истёк в ночь с 3 на 4 мая. Когда сертификат истёк, с точки зрения браузера всё выглядело очень плохо: в систему пытаются внедриться дополнения с неверной электронной подписью, то есть явно поддельные, и разрешать это ни в коем случае нельзя. С точки зрения пользователей происходящее выглядело как внезапная неработоспособность всех дополнений и невозможность установить новые. Ситуацию усугубило то, что дата устаревания пришлась на выходной день — скорее всего, это замедлило реакцию со стороны Mozilla. С другой стороны, так как подпись не проверяется непрерывно, то проблема не наступила у всех пользователей совсем одномоментно, а была размазана во времени.

Сразу по обнаружению проблемы разработчики браузера предприняли две контрмеры: остановили подпись новых дополнений истёкшим сертификатом, и выпустили временное обновление, которое остановило процесс регулярной валидации подписей, чтобы минимизировать ущерб для тех, до кого перепроверка ещё не дошла. Напрашивался и следующий шаг: перевыпустить истёкший сертификат и подписать все дополнения заново. Перевыпуск сертификата занял разумное время, а вот подписание всех 15 тысяч дополнений потребовало бы долгого срока. Вместо этого было решено сдвинуть даты для проверки валидности подписи, чтобы заставить заработать уже отключённые дополнения. Второй путь потребовал выпустить и каким-то образом передать клиентам новый сертификат с точно таким же именем пользователя и ключом, которые были у истекшего.

Тут проявилась ещё одна архитектурная проблема: чтобы проверить подпись под дополнениями, используется ещё одно дополнение — системное. Но оно тоже не могло быть провалидировано, поэтому первоначальный план — доставить новый сертификат и запустить валидацию — не мог сработать в таком виде. Но, к счастью, сертификаты, использованные для подписи дополнения, можно сохранять в самом дополнении. Тогда они могут быть использованы для построения цепочки доверия (которая всё равно должна завершиться корневым сертификатом, так что зловреды здесь не пройдут). И перевыпущенный сертификат, добавленный в системное дополнение, выполнил свою работу.

Новый сертификат был перевыпущен к концу суток (по московскому времени) 4 мая, и через канал, обеспечивающий Mozilla возможность получать некоторые данные от пользователей, которые на это согласились (так называемые studies) обновление начало доставляться на машины пользователей. Мы не знаем, сколько времени заняло тестирование всех сборок для всех поддерживаемых операционных систем, и сколько — распространение уже выпущенного обновления на компьютеры конечных пользователей — в отчёте Рескорлы идёт речь о нескольких часах на каждый из этапов.

Осталось несколько категорий пользователей, для которых трюк разработчиков не сработал. Это отключившие studies или встроенную в браузер систему телеметрии, а также пользователи Firefox для Android, пользователи старых версий Firefox, ещё несколько категорий — но всё-таки для основной массы пользователей проблема оказалась решена.

Из забавных деталей стоит отметить, что функциональность DNS-over-HTTPS, встроенная в браузер, работать продолжила. Впрочем, она и не была завязана на устаревающий сертификат. Да и в целом последствия катастрофы оказались умеренными: настройки и данные большинства дополнений остались нетронутыми после восстановления работоспособности, хотя в некоторых случаях потери и последовали, а, например, настройки тем пришлось восстанавливать явным образом. Возможно, пострадали пользователи, которые попытались удалить и переустановить обновления явным образом.

Вопрос, который в очередной раз поднимается в связи с инцидентом — насколько можно доверять конечным пользователям. Будь у пользователей возможность выразить доверие уже присутствующим в системе дополнениям, паника была бы гораздо меньше. Баланс удобства и безопасности всегда достигается нетривиально, и в этот раз ущерб можно будет измерить по изменениям доли Mozilla на рынке барузеров.

Истечение сроков действия сертификата электронной подписи и необходимость его своевременной ротации — непрекращающаяся головная боль, масштабы которой только усугубляются при увеличении доли https. Обычно эту проблему удаётся решить с помощью мониторинга или (для пользователей Let’s Encrypt) автоматической системы обновления сертификатов. Мы надеемся, что промах Mozilla станет уроком всем, кто записывает сроки перевыпуска сертификатов в календаре вместо использования автоматической системы напоминания. А ещё в качестве увлекательного чтения нас ждёт большой отчёт о планируемых изменениях в процессах в самой компании Mozilla.


Автор:  Дмитрий Белявский (ТЦИ)

Возврат к списку