В ядре Linux устранена следующая уязвимость:
ceph: исправлено чтение за пределами границ предварительной аутентификации в Snaptrace в ceph_handle_caps()
ceph_handle_caps() считывает snap_trace_len из проводного формата
ceph_mds_caps и безоговорочно использует его для создания поддельного
конечный указатель (snaptrace + snaptrace_len), который позже передается
ceph_update_snap_trace() в случае CEPH_CAP_OP_IMPORT:
Snaptrace = ч + 1;
snaptrace_len = le32_to_cpu(h->snap_trace_len);
р = snaptrace + snaptrace_len;
...
случай CEPH_CAP_OP_IMPORT:
если (snaptrace_len) {
...
если (ceph_update_snap_trace(mdsc, snaptrace,
snaptrace + snaptrace_len,
ложь, &область)) { ... }
ceph_update_snap_trace() затем декодирует структуру ceph_mds_snap_realm
из snaptrace с использованием ceph_decode_need(&p, e, sizeof(*ri), bad)
с предоставленным злоумышленником поддельным концом e == snaptrace + snaptrace_len. С snaptrace_len == 0xFFFFFFFF проверка привязки выполняется тривиально.
удовлетворено, ri = p читает sizeof(struct ceph_mds_snap_realm) мимо
законный msg->передний буфер и ri->num_snaps /
ri->num_prior_parent_snaps, затем езжайте дальше за пределы поля
чтение закодированных массивов привязок. Одиннадцать msg_version >= 2 .. msg_version >= 12 блоков декодера
над операционным переключателем каждый ловит этот OOB через свой
помощники ceph_decode_*_safe()/ceph_decode_need(), но они сидят
за hdr.version-gated if, поэтому вредоносный или скомпрометированный
MDS, который устанавливает msg->hdr.version = 1, достигает пути IMPORT с помощью
ни один декодер с контролем версии не подтвердил snap_trace_len.
shape присутствует с момента появления ceph_handle_caps().
Перед этим проверьте snap_trace_len на соответствие переднему буферу сообщений.
потребляя его, используя канонический ceph_decode_need()/ceph_has_room()
помощник. Помощник ограничивает длину вычитанием (n <= end - p,
охраняется end >= p), а не добавлением указателя, поэтому он безопасен для переноса
для длины u32, контролируемой злоумышленником, в 32-битных сборках, где
p + snap_trace_len может переполнить адресное пространство. Это соответствует
остальная часть пути декодирования ceph (например, в пуле_ns_len проверьте несколько строк
ниже), и существующая очистка goto bad уже покрывает этот выход
путь.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: ceph: fix pre-auth out-of-bounds read on snaptrace in ceph_handle_caps() ceph_handle_caps() reads snap_trace_len from the wire-format ceph_mds_caps header and uses it unconditionally to build a fake end pointer (snaptrace + snaptrace_len) that is later handed to ceph_update_snap_trace() in the CEPH_CAP_OP_IMPORT case: snaptrace = h + 1; snaptrace_len = le32_to_cpu(h->snap_trace_len); p = snaptrace + snaptrace_len; ... case CEPH_CAP_OP_IMPORT: if (snaptrace_len) { ... if (ceph_update_snap_trace(mdsc, snaptrace, snaptrace + snaptrace_len, false, &realm)) { ... } ceph_update_snap_trace() then decodes a struct ceph_mds_snap_realm from snaptrace using ceph_decode_need(&p, e, sizeof(*ri), bad) with the attacker-supplied fake end e == snaptrace + snaptrace_len. With snaptrace_len == 0xFFFFFFFF the bound check is trivially satisfied, ri = p reads sizeof(struct ceph_mds_snap_realm) past the legitimate msg->front buffer, and ri->num_snaps / ri->num_prior_parent_snaps then drive further out-of-bounds reads of the encoded snap arrays. The eleven msg_version >= 2 .. msg_version >= 12 decoder blocks above the op switch each catch this OOB through their ceph_decode_*_safe() / ceph_decode_need() helpers, but they sit behind a hdr.version-gated if, so a malicious or compromised MDS that sets msg->hdr.version = 1 reaches the IMPORT path with no version-gated decoder having validated snap_trace_len. The shape has been present since ceph_handle_caps() was introduced. Validate snap_trace_len against the message front buffer before consuming it, using the canonical ceph_decode_need() / ceph_has_room() helper. The helper bounds the length with subtraction (n <= end - p, guarded by end >= p) rather than pointer addition, so it is wrap-safe for the attacker-controlled u32 length on 32-bit builds where p + snap_trace_len could overflow the address space. This matches the rest of the ceph decode path (e.g. the pool_ns_len check a few lines below), and the existing goto bad cleanup already covers this exit path.
Характеристики атаки
Последствия
Строка CVSS v3.1