Тормозит Mac OS? — Catalina проверяет любой неподписанный код через интернет при запуске +25



Многие пользователи после перехода на Catalina начали жаловаться на тормоза. Западные коллеги выяснили в чем причина: MacOS отправляет хеш любого неподписанного кода на сервера Apple.

Это создает серьезные задержки в выполнении, что можно легко проверить:

echo $'#!/bin/sh\necho Hello' > /tmp/test.sh && chmod a+x /tmp/test.sh
time /tmp/test.sh && time /tmp/test.sh

Результаты удивляют:

$ time /tmp/test.sh && time /tmp/test.sh
Hello

real    0m1.417s
user    0m0.001s
sys 0m0.003s
Hello

real    0m0.003s
user    0m0.001s
sys 0m0.002s

Почему так происходит? Apple довольно давно использует механизм Notarization — с его помощью пользователи могут быть уверены, что программа, подписанная валидным Developer-ID не содержит зловредных компонентов. То есть помимо того, что приложение подписано, Apple его еще и автоматически проверит на элементы malware.
Что интересно, в будущем Apple вообще планирует запретить запуск не прошедших нотаризацию программ. Цитата:
Important

Beginning in macOS 10.14.5, software signed with a new Developer ID certificate and all new or updated kernel extensions must be notarized to run. Beginning in macOS 10.15, all software built after June 1, 2019, and distributed with Developer ID must be notarized.

Сейчас, видимо, в целях обкатки, любой новый неподписанный код, который вы запускаете, отправляется на сервера AAPL. Это легко проверить, запустив любой сетевой анализатор и увидев обращения к домену api.apple-cloudkit.com. Нужно отметить, что передается не сам код, а хеш-сумма. Проверить это можно двумя способами — сравнить обьем данных, передаваемых по сети, для скриптов разного размера; а также посмотрев на содержимое самого демона, ответственного за пересылку данных (otool -tV /usr/libexec/syspolicyd). Тем не менее, при медленном интернет соединении задержки могут составлять секунды — пользователь из Китая пишет о задержке в 5.47 секунд.

С одной стороны Apple можно понять — она заботится о безопасности пользователей, правда, вместе с тем превращая процесс любой разработки на их платформе в ад.

Но я хочу процитировать слова разработчика, который первым обратил внимание на проблему:
Подобное поведение операционной системы свидетельствует о серьезных проблемах в ее дизайне, когда два метода из низкоуровневого системного API (например exec и getxattr) выполняют синхронные сетевые обращения прежде чем вернуть результат.

Ссылки:

lapcatsoftware.com/articles/catalina-executables.html
news.ycombinator.com/item?id=23275922
sigpipe.macromates.com/2020/macos-catalina-slow-by-design

Теги:




Комментарии (27):

  1. KYuri
    /#21656072

    Что будет, если «api.apple-cloudkit.com» заблокировать на роутере?
    Или DNS по имени «api.apple-cloudkit.com» будет возвращать «0.0.0.0»?

    • drsmoll
      /#21656176

      Интересно что отвечает api.apple-cloudkit.com, на запрос с хешем? Потом поднять свой локальный сервер, который быстро будет отвечать — «ОК».

      • kwolfy
        /#21660412

        Думаю, что на деле все сильно сложнее. Наверняка "ок" еще подписывается приватным ключем не говоря уже об ssl

    • hollow1
      /#21656240

      Если прям на маке поставить фаервол и заблокировать все сетевые запросы от демона syspolicyd то запросы отправляться не будут. Думаю, если на роутере заблокировать, то примерно то же самое.

      • Lsh
        /#21657550

        Можно ли просто прибить демон?
        (не пользуюсь macOS, мимо проходил)

        • hollow1
          /#21659122

          В macOS системные демоны лучше не прибивать. Один раз я прибил kerberos демон, при том что его вообще не использую, компьютеру помог только хард резет — иначе система просто уходила в бесконечную загрузку.

          • HellishGyp
            /#21662168

            Ну, как следует из названия демона, от отвечает за авторизацию. Не стоит его прибивать :)

            • DMGarikk
              /#21662320

              kerberos обычно не используется в локальной авторизации

  2. solderman
    /#21656190

    Интересно, а на iPad так же? А то мой свежий air3 периодически перестает реагировать на тач, при том, что видео и звук например продолжаются без лагов. После обновлениея всего проблема несколько нивелируется, потом снова прогрессирует.

    • aamonster
      /#21656320

      А на ipad-то это зачем? Как на него попадёт неподписанный код?
      Так что, думаю, у вас другая проблема.

  3. tasiziso
    /#21656494

    Эппл вроде предупреждала об этом на WWDC 2019
    developer.apple.com/videos/play/wwdc2019/703/#
    So when a user downloads your stapled software and double-click it to launch it, the gatekeeper will perform a verification. It'll check the local ticket and it will also reach out to the Notary Service via CloudKit to check for a ticket also.

    • hollow1
      /#21656500

      И правда, но пока в документации не отразила видимо.
      Да и в принципе решение спорное.

  4. masai
    /#21657002

    Этот механизм можно обойти, если добавить терминал и IDE в Developer Tools в настройках безопасности. Правда, появляется этот пункт, похоже, только после установки Xcode.


    Что интересно, в будущем Apple вообще планирует запретить запуск не прошедших нотаризацию программ.

    А почему в будущем? В цитате упоминается 10.15, то есть уже вышедшая Catalina.

  5. Tarik02
    /#21657546

    Очень странно, попробовал провернуть такое у себя:
    tarik02 : ~ echo $'#!/bin/sh\necho Hello' > /tmp/test.sh && chmod a+x /tmp/test.sh
    tarik02 : ~ time /tmp/test.sh && time /tmp/test.sh
    Hello
    /tmp/test.sh 0,00s user 0,01s system 87% cpu 0,009 total
    Hello
    /tmp/test.sh 0,00s user 0,01s system 81% cpu 0,011 total
    tarik02 : ~ echo $'#!/bin/sh\necho Hello2' > /tmp/test.sh && chmod a+x /tmp/test.sh
    tarik02 : ~ time /tmp/test.sh && time /tmp/test.sh
    Hello2
    /tmp/test.sh 0,00s user 0,00s system 75% cpu 0,007 total
    Hello2
    /tmp/test.sh 0,00s user 0,00s system 78% cpu 0,007 total
    tarik02 : ~ echo $'#!/bin/sh\necho Hello3' > /tmp/test2.sh && chmod a+x /tmp/test2.sh
    tarik02 : ~ time /tmp/test2.sh && time /tmp/test2.sh
    Hello2
    /tmp/test2.sh 0,00s user 0,01s system 78% cpu 0,010 total
    Hello2
    /tmp/test2.sh 0,00s user 0,00s system 80% cpu 0,008 total
    tarik02 : ~ echo $'#!/bin/sh\necho Hello3' > /tmp/test3.sh && chmod a+x /tmp/test3.sh
    tarik02 : ~ time /tmp/test3.sh && time /tmp/test3.sh
    Hello3
    /tmp/test3.sh 0,00s user 0,00s system 80% cpu 0,008 total
    Hello3
    /tmp/test3.sh 0,00s user 0,00s system 76% cpu 0,008 total


    При этом, попробовал для разных запусков отключить интернет, или подключить более медленный. macOS Catalina 10.15.4

    • hollow1
      /#21657574

      У некоторых тоже не воспроизводится, тут может быть ряд причин, в том числе описанных в комменте выше от masai. Надо смотреть каждый случай отдельно :)

      • Tarik02
        /#21657638

        Да, Xcode установлен и приложение терминала включено тут. Но я тестировал это в iTerm2 (хотя попробовал отключить приложение отсюда и протестить в приложении терминала). Возможно, нужна перезагрузка, или что-то ещё где-то отключить.


        Изображение

        • atercygnus
          /#21661990

          Расскажите тому, что за MacOS никогда не работал: я верно понимаю, что любое неподписанное приложение можно будет запихнуть в Dev Tools, и обойти запрет? То есть пираты не останутся в накладе?

          • Tarik02
            /#21662020

            Да, но нет. Чтобы приложение появилось в том списке, что на скрине, нужно как минимум перейти в настройки, найти нужный пункт, разблокировать настройки, введя пароль, выбрать приложение и дать ему разрешение. Называть это поведение уязвимостью, это словно называть уязвимостью присутствие режима администратора в Windows, или root в Windows/macOS.

            • atercygnus
              /#21662166

              Я имею ввиду, что то, что придумали в Apple, это защита от malware, а не от пользователей, которые пользуются пиратским ПО?

              Это не помешает пиратить под MacOS?

              • Tarik02
                /#21662180

                Судя по моему опыту, пока что не мешает. Теоретически, они смогут блокировать код по хешу, но я очень сомневаюсь в эффективности такого решения. По моему, легко обойти. Начиная от временного отключения интернета, заканчивая маленьким патчингом бинарника.

                • atercygnus
                  /#21662296

                  А разве нельзя сделать такой бинарник малвари, чтобы её хеш совпал с хешем какого-нибудь подписанного приложения?

                  • Tarik02
                    /#21662908

                    Нет, нельзя. Хеш — односторонняя функция. Если бы можно было, то вся современная криптография, включая криптовалюты, накрылась бы медным тазом. (Вообще можно, но для этого нужно нереально большое количество времени. Например, в большинстве криптовалют подбирают число, которое нужно добавить к данным, чтобы их хеш содержал хотя бы 30 нулей в бинарной записи, при том, что весь хеш (на примере sha256) содержит 256 бит. Подбор каждого следующего подходящего хеша усложняется примерно с экспоненциальной сложностью.).

                    • alsoijw
                      /#21663096

                      Можно, поскольку хеш короче данных. Только для этого нужно контролировать более одной программы.

                      • Tarik02
                        /#21663108

                        Тут как повезет. Файлы в оригинале небольшие, используется md5. Если хотя бы одно условие не соблюдается — повторить такое будет сложно.

  6. Tarik02
    /#21657636

    del

  7. surfman246
    /#21671496 / +1

    А никого не смущает, что вообще ОС отсылает эти данные? Что даже простой скрипт нельзя запустить, что бы аппле об этом не узнало!

    • alsoijw
      /#21679056

      Те кого смущает уже перешли на linux/bsd. Остальным всё равно.