Большинство разговоров о вредоносных артефактах ML ограничиваются рассолом. Это понятно: вызов __reduce__ в torch.load является каноническим примером, о котором все читали. Но рассол — не единственный формат файлов в ваших моделях/...
Большинство разговоров о вредоносных артефактах ML ограничиваются рассолом. Это понятно: вызов __reduce__ в torch.load является каноническим примером, о котором все читали. Но Pickle — не единственный формат файла в каталоге models/, который передает загрузчику что-то исполняемое, и сама история Pickle имеет больше крайних случаев, чем предполагает сводная версия.
Вот несколько механизмов, описанных достаточно подробно, поэтому они будут полезны независимо от того, запускаете ли вы когда-нибудь сканер.
Керас: слой Lambda
Keras позволяет вам определить слой как произвольный Python, вызываемый через Lambda. Этот вызываемый объект должен пережить сериализацию, поэтому он сохраняется в конфигурации модели как объект маршаллированного кода. Когда load_model реконструирует модель, он запускает ее.
Это не подвиг. Это документированное поведение функции, которую используют люди. Но это означает, что файл .keras представляет собой формат, содержащий код, точно так же, как и Pickle, и конвейер, который рассматривает .h5 как «безопасную альтернативу Pickle», ошибочен.
Здесь есть вторая ловушка для любого, кто занимается созданием инструментов: очевидный способ проверить маршалированный BLOB-объект — это его демаршалинг, а marshal.loads на ненадежных входных данных сам по себе небезопасен. Тип большого двоичного объекта может