Съдържание

Пълен курс по етично хакерство от нула до експерт
Хаквайте като „black hat“ хакери. Тестове за проникване, Kali Linux, хакване на WiFi и уеб приложения, както и хакерският начин на мислене зад всичко това.
9,3 от 10 за уязвимост в Signal. След затваряне на разговора микрофонът може да остане активен за отсрещната страна, възможно е и камерата. Затварянето беше правилното действие. Пълна опашка от 256 събития, намираща се там от 2020 г., го отхвърли.
Натиснахте бутона за затваряне и доколкото знаехте, разговорът беше приключил. Оставихте телефона и продължихте да разговаряте с човека, който беше в стаята с вас. Вашият телефон може и да не е прекратил обаждането. Връзката, която предаваше гласа ви, все още можеше да е отворена, ако лицето от другия край искаше това.
Всичко, което това лице трябваше да направи, беше да изпрати към телефона ви поток от малки съобщения — повече, отколкото кодът за обработка на повиквания можеше да поеме. Докато те се натрупваха, сигналът за вашето затваряне така и не успя да премине. Звукът от вашия микрофон продължаваше да се предава, а възможно и видеото.
Уязвимостта е регистрирана като CVE-2026-113380, а в записа на CVE е оценена с 9,3 от 10. Тя се намираше в RingRTC — компонентът на Signal, който отговаря за гласовите и видео обажданията, като този компонент е вграден в приложението за Android, в приложението за iPhone и в настолното приложение. Частта с микрофона е сигурна. При камерата е възможно: както в записа на CVE, така и в анализа към него се посочва „възможно“, но нито един от тях не показва реално настъпване на това.
Signal е приложението, което избирате, когато даден разговор трябва да остане поверителен. Само за Android то има над 100 милиона изтегляния, а страницата му в магазина обещава криптирани гласови и видео обаждания. Това криптиране се запази непокътнато през целия случай. Човекът, който можеше да злоупотреби с тази уязвимост, вече беше в разговора с вас: контакт, който ви се обажда, или някой, на когото вие се обаждате.
Вътре в кода за обработка на повиквания всяко обаждане се управлява от краен автомат — част от кода, която знае в какво състояние е обаждането: звънене, свързване, свързано, прекратяване. Всичко, което се случва по време на разговор, се превръща в събитие — малко съобщение, което указва, че нещо се е променило. Отсрещната страна е изпратила нови данни, мрежата се е сменила, качеството на видеото е спаднало, някой е натиснал бутон. Тези събития постъпват в опашка и се обработват последователно, по реда на постъпване.
Преди отстраняването на уязвимостта тази опашка имаше място за точно 256 събития. Един ред в кода на Signal задаваше този лимит:
Вашето затваряне беше още едно събитие в същата тази опашка и не получаваше никакъв приоритет пред останалите събития. Другият участник в обаждането също можеше да изпраща събития в нея — колкото си поиска, без ограничение за скоростта. Така атакуващият поддържаше опашката пълна. Когато натиснахте затваряне, Signal се опита да добави вашето затваряне към опашката, не намери свободно място и върна грешка. Кодът, който прекратяваше обаждане, започваше с тези три реда:
Въпросителният знак в края на всеки ред е начинът, по който езикът Rust казва: ако тази стъпка се провали, спри тук и върни грешката обратно. Вторият ред се провали, защото опашката беше пълна, така че функцията спря точно там. Стъпките след нея — затваряне на връзките и прекратяване на обаждането — никога не се изпълниха.
А изчакването на третия ред нямаше ограничение във времето. Ако обработката на обаждането блокираше, кодът продължаваше да чака безкрайно и обаждането можеше да остане полузатворено толкова дълго, колкото трае това.
Концептуалният зловреден модел за доказване на уязвимостта (PoC), приложен към CVE — малък демонстрационен скрипт, показва проблема като модел с 5000 фиктивни събития, натрупващи се преди затварянето в неограничена опашка. Собственият код на Signal беше по-строг от този модел. Опашката спираше на 256 и щом се запълнеше, вашето затваряне биваше отхвърляно веднага.
Същото нещо се случваше и едно ниво по-дълбоко. Всяко обаждане има и връзка — каналът, който пренася звука и картината, като тази връзка изпълнява собствен краен автомат със своя опашка от 256 елемента. Кодът ѝ за изключване работеше по същия начин, така че препълнена опашка на връзката можеше да блокира затварянето и там.
Оценката 9,3 се дължи на това колко малко се изискваше от атакуващия. Обикновен акаунт в Signal и проведен разговор с вас — това беше всичко. Не беше необходимо телефонът ви да е компрометиран предварително и нямаше нищо, върху което да трябва да кликнете. Единственото необходимо действие от ваша страна беше просто да участвате в разговора, поради което оценката определя вашата роля като пасивна. Пълният ред с оценката гласи:
CISA, американската агенция за киберсигурност, също я разгледа. Тя не откри признаци за атаки, не смята, че тази уязвимост може да бъде автоматизирана, и въпреки това оцени щетите като тотални.
Кодът за обаждания на Signal имаше подобна уязвимост и преди. През септември 2019 г. Натали Силванович от Google Project Zero изследва как Signal решава кога едно обаждане е свързано. Тя установи, че обаждащият се може да изпрати съобщение, което кара обаждането да се свърже самостоятелно. След това обаждащият се можеше да чува какво се случва около човека, на когото е звъннал, преди този човек да е вдигнал. Signal коригира уязвимостта в приложението още същия месец.
Тя публикува пълните си констатации в блог публикация през януари 2021 г. Нейната отправна точка беше бъгът в Group FaceTime от януари 2019 г. Той позволяваше на обаждащия се да принуди обаждането да се свърже и да подслушва човека от другия край, без този човек да предприема каквото и да било действие.
Тя тества седем приложения за разговори и откри подобни грешки в пет от тях. Една от тях, в Google Duo през септември 2020 г., работеше почти точно по същия начин като настоящата. Тя изпрати толкова много съобщения с данни, че опашката, необходима на приложението за изключване на видеото, се препълни и видеото остана активно по-дълго, отколкото трябваше.
След корекцията си от 2019 г. Signal замени стария си код за установяване на повиквания с нова библиотека за обаждания, като в същата публикация в блога тя отбеляза, че новата библиотека използва по-строг краен автомат. Именно в тази библиотека беше открита новата уязвимост. Първата версия на нейния модул за управление на обажданията, написана през февруари 2020 г., вече съдържаше опашката от 256 събития. Препълнената опашка отхвърляше затварянето и там, а изчакването също нямаше ограничение във времето. В онази първа версия затварянето се наричаше EndCall вместо Terminate, но преминаваше през същата опашка по абсолютно същия начин.
Корекцията за сигурност през септември 2026 г. беше написана от Джим Густафсон, същият инженер от Signal, който написа първия модул за управление на обажданията през 2020 г.
Номерът на CVE беше издаден от MITRE — организацията, която разпределя тези номера, по искане на лице извън Signal. Той беше създаден в 04:25 UTC на 20 октомври и беше публикуван по-малко от секунда по-късно. Около час след това акаунт в GitHub на име Imahian качи анализа онлайн, заедно с онзи демонстрационен скрипт, написан на Python. Скриптът не съдържа мрежов код и не взаимодейства със Signal.
Докладът не посочва лицето, което стои зад него, не дава дата на откриване и не споменава дали за грешката някога е било съобщено на Signal. Същият профил е публикувал около 300 доклада за CVE. Същата сутрин той добави още един, за уязвимост в уеб пощата Roundcube, чиято корекция за сигурност се беше появила предния ден.
Самите Signal никога не са наричали това проблем със сигурността. Корекцията беше въведена на 4 септември с commit съобщението Ensure calls terminate completely in corner cases, а списъкът с промени на библиотеката не споменава нищо за уязвимост. Когато The Register, CyberInsider и Malwarebytes попитаха Signal относно дефекта, никой от тях не получи отговор до момента на публикуването. Дали профилът зад CVE сам е открил грешката, или я е забелязал, четейки публичната корекция на Signal, нито един източник не посочва.
Сега, когато натиснете бутона за затваряне, телефонът ви задава отделен флаг – проста стойност „да“ или „не“ в кода. Обаждането проверява тази стойност след всяко обработено съобщение, независимо колко е пълна опашката. Пълната опашка вече не може да задържи прекъсването на разговора. Новият код го заявява в един коментар:
Чакането също вече има ограничение. Нова стойност в кода, TERMINATE_TIMEOUT, дава на повикването пет секунди за коректно прекратяване. След това обаждането се прекъсва принудително.
Корекцията за сигурност засяга 12 файла и добавя 691 реда, като част от нея са нови тестове. Един от тях се нарича hangup_with_saturated_call_fsm_queue. Той умишлено запълва опашката на обаждането, докато тя спре да приема нови събития, натиска бутона за затваряне и след това проверява дали връзката е прекъсната и дали вече не излиза аудио. Signal тества същността на тази атака в собствения си код на 4 септември, 46 дни преди съществуването на CVE.
Коригираната версия на библиотеката, 2.72.0, излезе на 4 септември 2026 г. След това тя все още трябваше да стигне до приложенията. Това са първите версии с корекцията за сигурност и датата, на която всяка от тях беше готова в публичния код на Signal:
- → Android
8.27.0в бета версия на 10 септември, първа пълна версия8.28.4на 23 септември - → iPhone
8.30, 22 септември - → Desktop
8.29.0, пусната на 1 октомври
Корекцията беше в изданията на телефонните приложения през септември. Колко бързо магазините за приложения са я разпространили, не е публично известно. Десктоп приложението остана уязвимо до 1 октомври. Обществеността разбра на 20 октомври. Няма публични данни тя да е била използвана при атака.
За да проверите вашата версия, отворете Signal. На телефона ви това е в Настройки на Signal > Помощ > Версия. В десктоп приложението е в Помощ > Относно в Windows и Linux или Относно Signal Desktop на Mac. Нуждаете се от поне:
- → Android:
8.27.0 - → iPhone:
8.30 - → Desktop:
8.29.0
Ако сте под тази версия, актуализирайте през магазина за приложения. В Windows или Mac затворете и отворете отново десктоп приложението, за да приложи обновяването. В Debian или Ubuntu то се обновява през APT:
Един навик от доклада важи и за други приложения за разговори: след като затворите, проверете дали индикаторът за повикване на екрана ви е изчезнал.
От февруари 2020 г. до септември 2026 г. бутонът, който прекратява разговор в Signal, зависеше от това другата страна да остави място за него в опашка от 256 съобщения.