macOS: как исправить ошибку «Malware Blocked» в Docker Desktop
После обновления macOS или Docker Desktop иногда появляется сообщение: «“com.docker.socket” was not opened because it contains malware». Это не настоящая малварь — это ложное срабатывание XProtect из-за несоответствия подписи кода в уже установленных вспомогательных бинарниках. Лечится заменой файлов на корректно подписанные из свежего бандла Docker.app.
Почему так происходит
Docker Desktop устанавливает два привилегированных хелпера в /Library/PrivilegedHelperTools/:
com.docker.socketcom.docker.vmnetd
При обновлении Docker эти файлы иногда остаются от старой версии с отозванным или невалидным сертификатом. XProtect это замечает и блокирует запуск.
Исправление: заменить бинарники
Шаг 1. Полностью завершаем Docker Desktop. Проверяем в Activity Monitor, что не осталось процессов docker или com.docker.*.
Шаг 2. Останавливаем системные службы Docker:
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.vmnetd.plist 2>/dev/null
sudo launchctl bootout system /Library/LaunchDaemons/com.docker.socket.plist 2>/dev/null
Шаг 3. Удаляем заблокированные бинарники:
sudo rm -f /Library/PrivilegedHelperTools/com.docker.vmnetd
sudo rm -f /Library/PrivilegedHelperTools/com.docker.socket
Шаг 4. Копируем корректно подписанные версии из бандла приложения:
sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/PrivilegedHelperTools/
sudo cp /Applications/Docker.app/Contents/MacOS/com.docker.socket /Library/PrivilegedHelperTools/
Шаг 5. Перезагружаем Mac.
Важно: именно перезагрузка, а не просто перезапуск Docker. XProtect кэширует вердикт о плохой подписи, и без ребута он сохраняется.
После перезагрузки запускаем Docker Desktop — ошибка должна исчезнуть.
Проверка подписи
Перед запуском можно убедиться, что новые бинарники подписаны корректно:
codesign -vvv /Library/PrivilegedHelperTools/com.docker.socket
codesign -vvv /Library/PrivilegedHelperTools/com.docker.vmnetd
Если подпись валидна, вывод будет содержать valid on disk и satisfies its Designated Requirement.