Отворили сте архив в 7-Zip, а кодът, който му позволява да поеме контрол над машината ви, е стоял там от 2018 г. Той беше тихо коригиран на 25 юни. Не бяхте уведомени какво точно е отстранено до три седмици по-късно.
На 15 юли инициативата Zero Day Initiative изложи подробностите в бюлетин за сигурност ZDI-26-444, проследяван като CVE-2026-14266. В него се описва уязвимост в 7-Zip, която позволява на атакуващ да стартира зловреден код в момента, в който отворите компрометиран архив. Преди този ден единственото, което разработчиците на 7-Zip бяха споделили по въпроса, беше съобщение при версията от юни, което не обясняваше нищо.
7-Zip може да отваря .xz файлове – формат, който много програми използват за намаляване на размера на файловете. Някои от тези файлове се пакетират в повече от една стъпка. Данните първо преминават през верига от филтри, например delta или BCJ филтър, и след това се компресират допълнително чрез основната LZMA2 компресия.
За да отвори такъв файл, 7-Zip заделя единичен блок памет и разархивира данните в него. Програмата следи колко байта е записала там до момента. В кода тази променлива се нарича outWritten.
Всеки път, когато разархивира следващата част, кодът трябва да съобщи на декодера колко свободно място остава в този блок. Това трябва да бъде размерът на блока минус вече запълнената част. Тук обаче е допусната грешка. Програмата е подавала пълния размер при всяко преминаване, сякаш блокът е все още празен.
Можете да видите грешката на този ред във файла C/XzDec.c, във функцията MixCoder_Code:
destLenOrig е целият размер. Вече запълнената част, outWritten, никога не се изважда от него. Така при следващ ход, когато блокът е вече наполовина пълен, декодерът все още има разрешение да запише цял блок данни, което води до записване извън границите му. Писането след края на заделения блок представлява препълване на буфера в купчината (heap buffer overflow).
Версия 26.02 добавя липсващото изваждане:
Сега декодерът получава точно оставащото свободно пространство и спира с грешка, ако броят на байтовете премине границата на блока. Тази проверка за безопасност се задейства само когато има верига от филтри. Ето защо нормален .xz файл е безопасен, но специално манипулиран такъв не е. Това са същите „XZ фрагментирани данни“ (XZ chunked data), за които се споменава в бюлетина за сигурност.
Манипулиран .xz файл умишлено подготвя този сценарий. Той използва верига от филтри и размери на частите, които принуждават декодера да пише на няколко стъпки, така че последният запис да излезе извън границите на блока памет. Зловредният код се изпълнява със същите права, с които разполага потребителят, отворил файла. Не получавате предупреждение и не се изисква допълнително кликване. Самото отваряне на архива е достатъчно за активирането му.
Този ред код не е нов. Той се появява за първи път в началото на 2018 г., когато 7-Zip пренаписва своя xz декодер, за да може да разархивира в няколко нишки едновременно. Версията преди пренаписването не съдържа тази уязвимост. Версията веднага след него обаче я има и тя остана там до коригирането ѝ – повече от осем години без знанието на потребителите.
Именно тази последна подробност обяснява защо оценката на риска е важна. Няколко сайта определиха тази уязвимост като „критична“. Организацията Zero Day Initiative, която откри и оцени проблема, му даде оценка 7.0, което означава „висока“ степен на опасност, но не и „критична“. Нито един източник не му е поставил оценка над 9. Два фактора ограничават риска. Атакуващият не може да ви достигне директно по мрежата – той трябва първо да достави файла на компютъра ви и да ви накара да го отворите с уязвима версия на 7-Zip. Освен това оценката включва висока сложност на атаката, което означава, че трябва да се напаснат фактори извън контрола на атакуващия, за да може препълването да се превърне в работещ код.
Странното в случая е как разработчиците на 7-Zip реагираха на проблема. Корекцията за сигурност беше внедрена във версия 26.02 на 25 юни. Бележката за промените в тази версия гласи единствено:
- Коригирани са някои грешки в кода.
Този ред не посочва CVE идентификатор, не споменава XZ и по никакъв начин не подсказва, че някоя от тези грешки позволява на външен файл да поеме контрола над компютъра ви. В предходната версия 26.01 същият разработчик беше посочил ясно CVE идентификатора и засегнатия компонент – препълване на буфера в NTFS модула. Този път информацията беше спестена. Тъй като 7-Zip няма функция за автоматично обновяване, единствените защитени потребители на 25 юни бяха тези, които случайно са инсталирали програмата наново.
Това не е първият случай на тихо отстраняване на уязвимост в 7-Zip. В края на 2024 г. програмата коригира уязвимост за заобикаляне на защитата Mark-of-the-Web (CVE-2025-0411. Описанието на промените разкриваше поведението, но без да назовава CVE идентификатора, а киберпрестъпници вече бяха започнали да използват уязвимостта срещу цели в Украйна, преди тя да стане публично известна.
Реакцията на WinRAR през същата седмица прави ситуацията още по-интересна. Пет дни след корекцията в 7-Zip, WinRAR пусна версия 7.23 на 30 юни. Тя отстраняваше собствено препълване на буфера в кода за възстановяване на RAR архиви, но описанието съдържаше и следния ред:
- Обновена е библиотеката 7z.dll до версия 26.02.
WinRAR 7.23 включва в себе си коригираната библиотека на 7-Zip 26.02. В рамките на една седмица два от най-използваните архивни инструменти за Windows отстраниха препълвания на буфера. Единият от тях просто пренасяше корекцията на другия. WinRAR също не спомена CVE идентификатора на 7-Zip. Потребителите трябваше сами да сравняват номерата на версиите, за да разберат какво се случва.
Важно е да изясним едно нещо, тъй като съкращенията могат да доведат до объркване. Това не е задната вратичка в xz от 2024 г. Тогава ставаше въпрос за злонамерен код, умишлено вмъкнат в Linux библиотеката xz-utils с цел компрометиране на SSH сървъри. В настоящия случай става дума за случайна грешка с паметта в собствения код за декомпресиране на 7-Zip. Различен софтуер, различна ситуация.