В ядре Linux устранена следующая уязвимость:
NFSD: сохранять сетевую ссылку на время существования /proc/fs/nfs/exports fd. Запись процедуры /proc/fs/nfs/exports создается при инициализации модуля.
и сохраняется на протяжении всего срока службы модуля. Exports_proc_open()
захватывает текущее пространство имен сети вызывающего абонента и сохраняет
это svc_export_cache в seq->private, но не имеет ссылки
в пространстве имен. Если пространство имен впоследствии будет удалено
(например, уничтожение контейнера после того, как открыватель выполняет setns() для
другое пространство имен), nfsd_net_exit() вызывает nfsd_export_shutdown()
который освобождает кеш.
Последующие чтения на все еще открытом диске
разыменуйте освобожденный кэш_деталь, пройдя по освобожденной хеш-таблице. Удерживайте ссылку на сеть структур в течение всего времени существования открытой
дескриптор файла. Это предотвращает запуск nfsd_net_exit() --
и, таким образом, не позволяет nfsd_export_shutdown() освободить кеш
-- пока открыт любой экспортный раздел. cache_detail уже хранит
его сетевой указатель (cd->net, установленный функцией cache_create_net()), поэтому
Exports_release() может получить его без дополнительных настроек для каждого файла.
хранение.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: NFSD: Hold net reference for the lifetime of /proc/fs/nfs/exports fd The /proc/fs/nfs/exports proc entry is created at module init and persists for the module's lifetime. exports_proc_open() captures the caller's current network namespace and stores its svc_export_cache in seq->private, but takes no reference on the namespace. If the namespace is subsequently torn down (e.g. container destruction after the opener does setns() to a different namespace), nfsd_net_exit() calls nfsd_export_shutdown() which frees the cache. Subsequent reads on the still-open fd dereference the freed cache_detail, walking a freed hash table. Hold a reference on the struct net for the lifetime of the open file descriptor. This prevents nfsd_net_exit() from running -- and thus prevents nfsd_export_shutdown() from freeing the cache -- while any exports fd is open. cache_detail already stores its net pointer (cd->net, set by cache_create_net()), so exports_release() can retrieve it without additional per-file storage.