Разработчики репозитория Python-пакетов PyPI опубликовали план перехода на обязательную двухфакторную аутентификацию для пакетов, входящих в категорию критически важных. Важность определяется по числу загрузок и изменение будет применено к учётным записям сопровождающих и владельцев проектов, связанных с 1% пакетов, лидирующих по числу загрузок за 6 месяцев. С учётом, что в настоящее время репоизторий PyPI включает более 350 тысяч пакетов, двухфакторная аутентификация будет применена примерно для 3500 пакетов. Для проверки попадание учётной записи в список подотовлена специальная страница. Точная дата включения обязательной двухфакторной аутентификации пока не определена, предполагается, что это произойдёт в ближайшие месяцы.
В отличие от перехода на двухфакторную аутентификацию проектов RubyGems, NPM и GitHub, в PyPI будет внедрена более жёсткая схема проверки, подразумевающая использование по умолчанию аппаратного токена с ключами доступа. В качестве причины применения токенов и протокола WebAuthn упоминается более высокая безопасность по сравнению с генерацией одноразовых паролей (TOTP).
Токены можно будет получить бесплатно – компания Google выступила спонсором инициативы и выделила для проекта 4000 ключей Titan. Каждый сопровождающий может подать заявку на бесплатное получение двух токенов с интерфейсом USB-C или USB-A. Второй токен отправляется в качестве резервного на случай поломки или потери основного, чтобы минимизировать риск потери доступа к репозиторию и избавить разработчиков от необходимости прохождения через сложную процедуру восстановления доступа.
К сожалению, токены могут быть отправлены только в Австрию, Бельгию, Канаду, Францию, Германию, Италию, Японию, Испанию, Швейцарию, Великобританию и США. Сопровождающие из других стран должны приобрести совместимые со спецификацией FIDO U2F токены самостоятельно, например, подходят токены Yubikey и Thetis. В качестве альтернативы также предусмотрена возможность применения вместо токена аутентификации на базе одноразовых паролей, используя приложения, поддерживающие протокол TOTP, например, Authy, Google Authenticator и FreeOTP.
Инициатива не обошлась без инцидента. Автор пакета Atomicwrites, насчитывающего 6 млн загрузок в месяц и 38 млн за 6 месяцев, не пожелал переходить на двухфакторную аутентификацию и для исключения своего пакета из списка критически важных попытался сбросить счётчик загрузок. Для сброса он вначале удалил пакет, а потом загрузил новую версию.
Ожидалось, что подобная манипуляция лишь сбросит счётчик, но к удивлению разработчика из репозитория были удалены и все старые версии, что привело к проблемам у зависимых от библиотеки проектов, которые некоторые разработчики сравнили с инцидентом в результате удаления пакета left-pad в NPM.
Проблема усугубилась тем, что после удаления автор atomicwrites не смог загрузить старые версии, восстановить которые удалось лишь на следующий день после вмешательства администраторов PyPI. После произошедшего автор пакета принял решение прекратить разработку atomicwrites и перевести пакет разряд устаревших. В качестве причины упоминается то, что он развивает проект как хобби в свободное время и появление дополнительных требований, усложняющих работу, не стоят времени, затрачиваемого на бесплатное сопровождение пакета с такой популярностью. Автор atomicwrites утверждает, что он бы предпочёл просто писать код для развлечения, а заботы о дополнительной защите от захвата злоумышленниками можно взвалить на себя когда за это платят.
Библиотека atomicwrites содержит около 200 строк кода и предлагает функции для атомарной записи файлов. В качестве замены можно использовать штатные вызовы os.replace и os.renamе (операция сводится к записи в файл с временным именем и переименованию в целевой файл после готовности).