В ядре Linux устранена следующая уязвимость:
net: nexthop: увеличить вес до u16
В сетях CLOS, поскольку сбои каналов происходят в различных точках сети,
Веса ECMP задействованных узлов корректируются для компенсации. С высоким
разветвление задействованных узлов и общее большое количество узлов,
весовое соотношение (не)ECMP, которое мы хотели бы настроить, не вписывается в
8 бит. Вместо, скажем, 255:254 мы могли бы настроить что-то вроде
1000:999.
Для этих развертываний 8-битного веса может быть недостаточно. С этой целью в этом патче увеличьте вес следующего перехода с u8 до u16. Увеличение ширины целочисленного типа может оказаться сложной задачей, поскольку код по-прежнему компилируется, типы могут больше не проверяться, а числовые вылезают ошибки.
Чтобы предотвратить это, преобразование было выполнено в два этапа. Сначала тип был изменен с u8 на одночленную структуру, что аннулировало все виды использования поля. Это позволило пройти их поочередно. one и проверить правильность типа.
Затем конструкцию заменили на
снова ванильный u16. Это должно гарантировать, что ни одно место не будет пропущено.
UAPI для настройки членов группы следующего перехода заключается в том, что атрибут
NHA_GROUP содержит массив записей struct nexthop_grp:
структура nexthop_grp {
__u32 идентификатор; /* идентификатор следующего перехода — должен существовать */
__u8 вес; /* вес этого следующего перехода */
__u8 resvd1;
__u16 resvd2;
};
Поле resvd1 в настоящее время проверено и должно быть равно нулю. Мы можем
снимите это требование и перенесите старшие биты веса в
зарезервированное поле:
структура nexthop_grp {
__u32 идентификатор; /* идентификатор следующего перехода — должен существовать */
__u8 вес; /* вес этого следующего перехода */
__u8 вес_высокий;
__u16 resvd2;
};
Такое разделение полей было выбрано в случае, если существующее пользовательское пространство
делает предположения о ширине поля веса и обходит любые
проблемы с порядком байтов.
Поле веса в настоящее время кодируется как значение веса минус один, потому что вес 0 недействителен. Этот же трюк невозможен для нового Weight_high, поскольку ноль должен означать фактический ноль. При этом: - Старое пользовательское пространство гарантированно будет иметь значение Weight_high, равное 0, поэтому настройка 8-битных весов по мере необходимости.
При сбросе nexthops с помощью 16-битный вес, будут отображаться только младшие 8 бит. Но настройка такого nexthops подразумевает наличие пользовательского пространства, знающего о расширении в первое место. - Новое пользовательское пространство, взаимодействующее со старым ядром, будет работать только до тех пор, пока оно пытается настроить 8-битные веса, где старшие биты равны нулю. Старое ядро будет отклонять попытки настройки весов >8 бит.
Переименование зарезервированных полей, поскольку они выделены для какой-либо цели, обычно
сделано в линуксе. Тот, кто касается зарезервированного поля, делает это самостоятельно.
риск. nexthop_grp::resvd1 в настоящее время используется как минимум
strace, однако они содержат собственную копию заголовков UAPI, а преобразование
должно быть тривиально. Предусмотрен помощник для расшифровки веса из
два поля.
Принудительное преобразование кажется предпочтительнее, чем отступать и введение анонимных союзов или что-то в этом роде.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: net: nexthop: Increase weight to u16 In CLOS networks, as link failures occur at various points in the network, ECMP weights of the involved nodes are adjusted to compensate. With high fan-out of the involved nodes, and overall high number of nodes, a (non-)ECMP weight ratio that we would like to configure does not fit into 8 bits. Instead of, say, 255:254, we might like to configure something like 1000:999. For these deployments, the 8-bit weight may not be enough. To that end, in this patch increase the next hop weight from u8 to u16. Increasing the width of an integral type can be tricky, because while the code still compiles, the types may not check out anymore, and numerical errors come up. To prevent this, the conversion was done in two steps. First the type was changed from u8 to a single-member structure, which invalidated all uses of the field. This allowed going through them one by one and audit for type correctness. Then the structure was replaced with a vanilla u16 again. This should ensure that no place was missed. The UAPI for configuring nexthop group members is that an attribute NHA_GROUP carries an array of struct nexthop_grp entries: struct nexthop_grp { __u32 id; /* nexthop id - must exist */ __u8 weight; /* weight of this nexthop */ __u8 resvd1; __u16 resvd2; }; The field resvd1 is currently validated and required to be zero. We can lift this requirement and carry high-order bits of the weight in the reserved field: struct nexthop_grp { __u32 id; /* nexthop id - must exist */ __u8 weight; /* weight of this nexthop */ __u8 weight_high; __u16 resvd2; }; Keeping the fields split this way was chosen in case an existing userspace makes assumptions about the width of the weight field, and to sidestep any endianness issues. The weight field is currently encoded as the weight value minus one, because weight of 0 is invalid. This same trick is impossible for the new weight_high field, because zero must mean actual zero. With this in place: - Old userspace is guaranteed to carry weight_high of 0, therefore configuring 8-bit weights as appropriate. When dumping nexthops with 16-bit weight, it would only show the lower 8 bits. But configuring such nexthops implies existence of userspace aware of the extension in the first place. - New userspace talking to an old kernel will work as long as it only attempts to configure 8-bit weights, where the high-order bits are zero. Old kernel will bounce attempts at configuring >8-bit weights. Renaming reserved fields as they are allocated for some purpose is commonly done in Linux. Whoever touches a reserved field is doing so at their own risk. nexthop_grp::resvd1 in particular is currently used by at least strace, however they carry an own copy of UAPI headers, and the conversion should be trivial. A helper is provided for decoding the weight out of the two fields. Forcing a conversion seems preferable to bending backwards and introducing anonymous unions or whatever.
Характеристики атаки
Последствия
Строка CVSS v3.1