Съдържание

/google-mole-inside-teampcp/google-mole-inside-teampcp.png

Пълен курс по етично хакерство от нула до експерт

Хаквайте като black hat хакери. Тестване за проникване, Kali Linux, WiFi и уеб хакерство, както и хакерското мислене зад тях.

Полицията съобщава, че 21-годишен младеж близо до Пърт е помогнал за пробиването на хиляда компании и отнемането на 500 000 идентификационни данни. Жертвите не са направили нищо погрешно. Анализатор от Google е седял в техния чат почти от първия ден.

Австралийската федерална полиция повдигна обвинения на двама мъже от Западна Австралия на 26 август, след заповеди за претърсване на три имота. Общо четиринадесет престъпления между тях. Полицията оценява щетите на повече от хиляда организации, над 500 000 откраднати идентификационни данни и поне 300 гигабайта данни, като глобалните разходи за отстраняване на последиците възлизат на стотици милиони долари. Нито един от мъжете не е осъден и всичко, което полицията казва за тяхната роля, все още е твърдение.

Това, което не подлежи на оспорване, е казаното от единия от тях. От юни до ареста 21-годишният младеж е разговарял с Брайън Кребс и му е казал, че е спечелил около 20 000 долара от това.

За това как са проникнали написах още през април, когато пакетите все още са били отравяни:

  • → https://hackingpassion.com/pypi-supply-chain-attack-xinference-teampcp/

Атаката работи като цикъл. Проникване в конвейера за изграждане на един инструмент с отворен код, кражба на токените за публикуване на разработчиците, които го използват, използване на тези токени за отравяне на следващия инструмент и започване отначало. Направили са го със скенер за уязвимости, със скенер за инфраструктура, с библиотека за AI портал и с SDK за телефония, в този ред, за девет дни. Всеки кръг им е предавал ключовете за кръга след него.

На конференцията LABScon на 18 септември Остин Ларсен от Google Threat Intelligence заяви, че една от подставените самоличности на Mandiant е била добавена към вътрешния кръг на групата през март, точно когато е започнала кампанията по отравяне. Този вътрешен кръг е бил частен чат от около дванадесет души. Подставеното лице е прекарало месеци в изграждане на доверие с някого, който по-късно е бил поканен, и е дошло заедно с него.

Ларсен беше ясен относно ограниченията. Анализаторът не е пробивал нищо и не е насърчавал пробив, като е писал в този чат само толкова, колкото да не изглежда подозрително.

Подставеното лице е получило достъп до сървър, където групата е държала плячката си: потребителски имена, пароли и токени за достъп от всички тези жертви, чакащи да бъдат използвани за изнудване. Предупреждаването на всяка компрометирана компания една по една би отнело твърде много време, предвид техния брой. Затова те са отишли при доставчиците, при Amazon Web Services и Microsoft, и са ги помолили да отменят откраднатите идентификационни данни от източника. Стотици уведомителни имейли са били изпратени и много са върнали незабавен отговор.

Първият злонамерен код е работил в GitHub Actions, системата за изграждане, която компилира и публикува софтуер. GitHub маскира тайните в своите логове, така че токен, който преминава по време на изграждане, се появява като звездички. Скриптът е заобиколил това напълно. Той е прочел паметта на процеса-изпълнител директно чрез /proc/<pid>/mem и е извлякъл токените в чист текст. Маскирането е функция на показването, а стойностите са си стояли в паметта независимо от това.

От страна на Python са използвали друг трик. В отровената версия на библиотеката за AI портал е бил поставен файл, наречен litellm_init.pth. Python чете .pth файловете автоматично при стартиране на интерпретатора, така че техният код се е изпълнявал всеки път, когато Python процес е стартирал на тази машина, включително процесите, които никога не са импортирали библиотеката.

Задната вратичка за npm, която са разпространили, се нарича CanisterWorm, а името идва от начина, по който приема команди. Вместо да се свързва със сървър, тя запитва канистър в Internet Computer Protocol — част от код, живеещ в разпределена мрежа, което прави обичайните маршрути за сваляне от мрежата безполезни. Имплантът спи за пет минути след инсталацията, след това запитва този канистър на интервали от петдесет минути, изтегля какъвто и да е бинарен файл, към който сочи отговорът, записва го в /tmp/pglog, изпълнява го и отбелязва URL адреса в /tmp/.pg_state, за да не изтегля същото нещо два пъти. На диска се инсталира като потребителска услуга, наречена pgmon, което изглежда като инструмент за мониторинг на PostgreSQL.

Тя има и превключвател за изключване. Имплантът игнорира всеки URL адрес, съдържащ youtube.com. Насочете канистъра към връзка в YouTube и инфектираните машини утихват, без да бъде премахнат нито един файл, което изследователите разчитат като начин за приспиване на импланта.

През май червеят се върна във версия, която изобщо не се нуждаеше от откраднат токен. Някой е отворил pull request от форк към хранилището на TanStack и на този pull request е било позволено да записва в кеша за изграждане на основния проект. Те са отровили кеша в 11:29 UTC и са изчакали. Почти осем часа по-късно работният поток за издаване на версия се е стартирал отново, първо като повторно стартиране на задача отпреди два дни, а тридесет и четири секунди след това при обикновено обединяване (merge) от поддържащ разрабтчик. И двете стартирания са изтеглили отровения кеш обратно и това е поставило кода на атакуващия в официалната задача за издаване. Той е извлякъл токен от паметта на изпълнителя и го е обменил в собствената крайна точка на npm, което е означавало, че пакетите са излезли със собствения печат на npm — подписът, който трябва да удостовери къде е бил изграден даден пакет. Веригата за доставки ги е подписала като автентични, защото според нейните собствени правила те са били такива.

Собствената стъпка за публикуване на проекта никога не се е изпълнила. Тя е била пропусната, защото тестовете са се провалили. Зловредният софтуер е генерирал собствен токен чрез разрешението id-token — това, което даден работен поток използва, за да удостовери пред npm, че е този, за когото се представя — и е публикувал пакетите директно в регистъра: четиридесет и два пакета, осемдесет и четири версии, през шест минути разлика. Официалният процес по публикуване така и не е публикувал нищо.

Тази версия носи и превключвател за отмъщение. Веднъж на минута тя проверява дали откраднатите токени са били ротирани. В момента, в който бъдат ротирани, тя изпълнява rm -rf срещу домашната директория на машината, на която се намира. Почистването е това, което я задейства.

Тя се запазва на две места, които оцеляват след npm uninstall: .claude и .vscode, чрез куки за сесии на Claude Code и автоматизация на задачи във VS Code. Инструментите, които разработчиците използват за писане на код, са станали част от повърхността за атака и тази кампания ги целеполага съвсем нарочно.

Същият червей проверява езика на системата, преди да предприеме каквото и да е, и тихо прекратява работа, ако машината е настроена на руски език. По-ранна версия правеше обратното с проверка на часовата зона: ако часовникът показваше Иран, тя задействаше компонент с разширени привилегии, който изтриваше Kubernetes клъстери, а на машини без клъстер изтриваше файловете директно.

Докато самоличността под прикритие присъстваше в чата, аналитиците наблюдаваха как някой от основната група създава експлойт за уязвимост от тип нулев ден с помощта на AI модел. Целта беше популярен уеб базиран инструмент с отворен код за системна администрация, а грешката бе заобикаляне на двуфакторна автентификация. Това беше логическа грешка. Разработчик беше твърдо кодирал презумпция за доверие в кода, който прилага 2FA, така че при определени условия проверката се прескачаше. Все още бяха необходими валидни идентификационни данни за използването му, но след това вторият фактор преставаше да има значение. Изследователите взеха копие от експлойта, тестваха го, установиха, че работи с малки корекции, и предупредиха разработчика, за да може той да бъде отстранен чрез инсталиране на корекция за сигурност преди планираната масова атака.

Експлойтът съдържаше CVSS оценка за критичност, която моделът просто беше измислил. Той беше пълен с обучителни docstring документации и коментари, обясняващи стъпка по стъпка логиката на скрипта като в уроци за начинаещи. Разполагаше с изпипано меню за помощ и спретнат клас за ANSI цветове. Това беше учебникарски Python – от вида, който се появява в данните за обучение на модели и почти никога в експлойт, написан от професионален атакуващ.

Чарли Ериксен, изследовател в Aikido, който следи тази кампания отблизо, обясни защо това се случва точно сега. Преди съществуваше пропаст между прочитането на дадено изследване и превръщането му в мащабна операция. Трябваше да разберете документа, да адаптирате кода, да го изчистите от грешки, да изградите инфраструктура около него и да повторите това за всяка нова цел. Езиковите модели затвориха по-голямата част от тази пропаст, а това, което остава, са хора, които могат да нанесат сериозни щети без дисциплината, която преди се изискваше за достигането до такова ниво.

Този анализ беше публикуван на 11 май. Google написа, че има висока увереност, че експлойтът е изграден с AI модел – за първи път компанията заявяваше това писмено – и не съобщи името на никоя група. Отне време чак до миналата седмица, за да се разбере кой стои зад това и че компанията е знаела, защото е чела техния чат.

След как кодът на червея стана публичен, те го превърнаха в състезание. Хиляда долара в Monero за този, който проведе най-голямата операция срещу веригата за доставки с него, оценявана въз основа на седмичния и месечния брой изтегляния на пакетите, които сте успели да отровите, като псевдонимът ви във форума и доказателството за достъп служеха за входен билет. Наградата никога не е била основната цел и самите те го заявиха, наричайки я „трофей за участие“, докато обявяваха, че ще купят всеки полезен достъп, осигурен от участниците. Ларсен описва групата като равнопоставена общност от индивидуално квалифицирани злонамерени субекти с един ясен център на тежестта, а състезание като това е начинът, по който такава общност набира нови членове.

Групата се разпадна заради пари. Въпреки целия този достъп, изнудването едва носеше приходи. Затова те поканиха други групи и им предложиха откраднатите идентификационни данни срещу дял от печалбата. Един от тези партньори беше ShinyHunters, които взеха данните, проведоха свои собствени кампании за изнудване и не върнаха нищо. След това ShinyHunters изпратиха на Ларсен пълния дневник от чат сървъра на групата, самоинициативно, без да знаят, че в него вече има наблюдател. Предателството беше толкова явно, че TeamPCP забеляза, премести данните си на нов сървър, сви вътрешния си кръг и изхвърли предателите. Самоличността под прикритие загуби достъпа си в същия момент.

Към онзи момент това вече нямаше значение, защото следата беше напълно разкрита.

Ларсен откри най-активния псевдоним на групата в изтекла база данни с потребители от хакерски форум, регистриран с Gmail адрес. Той търси този адрес в по-стари архивни форуми и попадна на според от 2019 г., в който същото лице изисква възстановяване на сума от продавач на пиратски ключове за Office към PayPal профил, свързан с семеенโดмейн. И когато групата премести откраднатите си идентификационни данни на нов сървър, този сървър се архивираше в Google Drive на същия този профил. Неговата реакция беше: „Няма начин“. Защо той би изпращал целия този откраднат материал в Drive, който сочи директно към самия него. Сигналът беше предаден на ФБР и заинтересован агент беше на линия в рамките на броени минути.

Кребс работи от другата страна и стигна до същото име. Стари псевдоними във форуми, свързани от едни и същи данни за контакт, още два имейл адреса, повторно използвана парола в множество профили, IP адрес в Пърт, който с години е обслужвал семейни Synology и QNAP устройства за съхранение под тяхната собствена фамилия, профил във Facebook на брат, описващ членовете на семейството, иโดмейн, регистриран от бащата. И след това детайлът, който свързва всичко: профил за програми за възнаграждаване за открити уязвимости (bug bounty) в HackerOne, регистриран с пълното му лично име, използващ същия псевдоним, който множество компании за киберсигурност вече бяха маркирали като алиас на тази група. Това същото лице е регистрирало компании в Австралия. Една от тях се казва OPSEC Express.

Двама разследващи, които не работеха заедно, в крайна сметка стигнаха до един и същ псевдоним, използван от 2019 г.: sheepstealing.

21-годишният младеж е израснал между Южна Африка и крайбрежно предградие и е разговарял открито с този журналист в продължение на месеци. Той е бил бездомен, току-що е излязъл от програма за детоксикация, бил е чист от два месеца и е търсил какво да прави и с кого да общува, когато се свързва отново със стари контакти от зловредната сцена. Неговите собствени думи: „Blackhat дейността е забавна, има награди и стимули да се учиш и израстваш с екипа си, а без квалификация никой работодател дори няма да отдели време да те изслуша“. Той заяви, че е спечелил около 20 000 долара и че никога не е ставало дума за парите. На въпроса дали нещо от това го е подготвило за законна работа, той отговори „не“. Той също така каза, че човек като него се нуждае от помощ, която затворът не може да предостави, а две седмици преди ареста заяви, че е готов да се предаде.

Едно от обвиненията се откроява. Редом с компютърните престъпления стои обвинение за неизпълнение на заповед по 3LA – австралийският закон, който може да ви задължи да предадете паролите си. Паролите така и не са предоставени. Това еднолично обвинение носи максимално наказание от десет години, което е повече от самите обвинения за незаконно проникване в компютърни системи. Обвинението за пране на пари за суми над 100 000 долара носи двадесет години.

Eriksen твърди, че червеят е най-хубавото нещо, случвало се на сигурността на веригата за доставки, защото е наложил промени, които областта е искала без успех. В края на юли GitHub въведе тридневен период на изчакване (cooldown) за Dependabot, така че новопубликуваните версии на пакети да не се изтеглят в билдовете в момента, в който се появят, което дава време на скенерите и поддържащите лица да забележат отровено издание. Python и няколко JavaScript екосистеми добавиха същата идея. Сплотен екип от хора на двадесет и няколко години успя за няколко месеца да постигне това, което години лекции по конференции не можаха.

Ако поддържате пакети или управлявате пайплайни за изграждане (build pipelines), конкретните уроци са:

  • → Фиксирайте (pin) вашите зависимости и вашите действия към хеш на комит (commit hash), никога към таг на версия, защото таговете могат да бъдат презаписани с force-push
  • → Включете период на изчакване (cooldown), така че новите издания да изчакват, преди да попаднат във вашите билдове
  • → Третирайте кеша за изграждане (build cache) като ненадежден вход и никога не позволявайте на pull request от форк да пише в него
  • → Приемете, че маскираните тайни са четими в паметта на процеса, и ограничете обхвата на токените за изграждане, така че изтичането да донесе минимални ползи
  • → Следете разрешението id-token, защото това е нещо, което позволи на зловредния код да публикува без стъпка за публикуване
  • → Ротирайте внимателно на машина, която подозирате, защото wiper-ът се задейства при ротация
  • → Проверете .claude и .vscode във вашите хранилища, защото там вече живее устойчивостта (persistence)

Следата, която даде име на тази група, беше изградена от WHOIS записи, стари публикации във форуми и повторно използван имейл адрес, а не от експлойти. Изпълнете whois срещу домейн, който притежавате, и картографирайте неговите поддомейни, и ще видите точно колко от този тип следа се намира в публичните записи. Моят пълен курс Ethical Hacking Complete Course Zero to Expert ви превежда оттам стъпка по стъпка: разузнаване, сканиране, експлоатация и анализ на трафика, практически, от първия ви ден без опит с Linux или хакване.

→ Присъединете се към моя пълен курс по етично хакерство

Хакването не е хоби, а начин на живот.

Australian Federal Police | TanStack | Google Threat Intelligence