В предоставената в ядрото на Linux реализация на мрежовия протокол TIPC (Transparent Inter-process Communication) е открита критична уязвимост (CVE-2021-43267), която позволява отдалечено да се изпълни произволен код с привилегии на ядрото чрез изпращане на специално оформен мрежов пакет. Опасността се смекчава от факта, че за атаката е необходимо явно да се включи поддръжка на TIPC в системата (зареждане и настройка на модула на ядрото tipc.ko), която не се активира по подразбиране в неспециализирани дистрибуции на Linux.
Протоколът TIPC се поддържа от версия на ядрото на Linux 3.19, но кодът, който води до уязвимостта, е включен в ядрото 5.10. Уязвимостта е отстранена в ядрото 5.15.0, 5.10.77 и 5.14.16. Проблемът се проявява и все още не е решен в Debian 11, Ubuntu 21.04/21.10, SUSE (в още непуснатата версия SLE15-SP4), RHEL (за сега не се уточнява дали е направено бэкпортване на поправка за уязвимостта) и Fedora. Актуализирана версия на ядрото вече е издадена за Arch Linux. Дистрибуции с ядро по-стари от 5.10, като Debian 10 и Ubuntu 20.04, не са засегнати от проблема.
Протокол TIPC първоначално е разработен от компания Ericsson и е предназначен за организиране на междупроцесно взаимодействие в клъстери, активирайки се главно на възлите на клъстера. TIPC може да работи както над Ethernet, така и над UDP (мрежов порт 6118). В случай на работа над Ethernet, атака може да бъде извършена от локалната мрежа, а при използване на UDP — от глобалната мрежа, ако портът не е защитен от защитна стена. Атаката може да бъде извършена и от непривилегирован локален потребител на хоста. За активиране на TIPC е необходимо да се зареди модулът на ядрото tipc.ko и да се настрои свързването към мрежовия интерфейс с помощта на netlink или утилитата tipc.
Уязвимостта се проявява в функцията tipc_crypto_key_rc и е причинена от липсата на адекватна проверка на съответствието между посочения в заглавката и фактическия размер на данните при обработка на пакети с тип MSG_CRYPTO, използвани за получаване на ключове за криптиране от други възли в клъстера с цел последващо декриптиране на съобщения, изпращани от тези възли. Размерът на копираните в паметта данни се изчислява като разлика между стойностите на полетата за размера на съобщението и размера на заглавката, но без да се отчита действителният размер на предаваното в съобщението наименование на алгоритъма за криптиране и съдържанието на ключа. Подразбира се, че размерът на наименованието на алгоритъма е фiksiran, а за ключа допълнително се предава отделен атрибут с размер, като атакуващият може да посочи стойност в този атрибут, която да се различава от фактическата, което би довело до записване на остатъка от съобщението извън выделения буфер. struct tipc_aead_key { char alg_name[TIPC_AEAD_ALG_NAME]; unsigned int keylen; /* в байтове */ char key[]; };

Източник: opennet.ru
