Dešimt metų viduje: kaip Kinijos APT grupė gyveno Linux sistemoje per PAM ir OpenSSH užpakalines dureles
Dešimt metų viduje: kaip Kinijos APT grupė gyveno Linux sistemoje per PAM ir OpenSSH užpakalines dureles
Kai Sygnia komanda pradėjo analizuoti pažeidimą, kurį vėliau pavadins Operation Highland, ankstyviausi artefaktai buvo datuoti 2016 metais. Tai buvo ne naujas įsilaužimas — beveik dešimt metų nepastebėto buvimo izoliuotame kritinės infrastruktūros tinkle. Velvet Ant — Kinijos APT grupė, kurią Sygnia seka per kelis incidentus — neišnaudojo jokios pažeidžiamybės ir nepaliko akivaizdžių pėdsakų. Ji pakeitė pačias programas, kurios nusprendžia, kas gali prisijungti.
Velvet Ant pakeitė teisėtus PAM modulius ir OpenSSH dvejetainius failus užpakalinių durų kopijomis. Ne nauja kenkėjiška programa, kurią gali aptikti skeneriai, — o patikimų sisteminių komponentų modifikacija, kuriais operacinė sistema pasitiki pagal nutylėjimą. Slaptažodžiai buvo keičiami — užpakalinės durys liko. Sesijos buvo nutraukiamos — grupė grįždavo. Įprastos reagavimo į incidentus priemonės neveikė, nes pats autentifikacijos mechanizmas dirbo užpuolikų naudai.
Tai ne pirmas kartas, kai Velvet Ant taiko šią taktiką. 2024 metais Sygnia užfiksavo tą pačią grupę, piktnaudžiaujančią F5 BIG-IP įrenginiais nuolatiniam prieigos palaikymui. Tada — CVE-2024-20399 išnaudojimą Cisco NX-OS sistemoje, siekiant įdiegti užpakalines duris tiesiai į Nexus komutatorius. Kaskart aptikus vieną placdarmiją, grupė traukdavosi giliau — į mažiau kontroliuojamą infrastruktūrą. Operation Highland — kitas žingsnis: giliau jau nebėra kur. Tai pats autentifikacijos sluoksnis.
KAS YRA PAM IR KODĖL TAI SVARBU
PAM (Pluggable Authentication Modules) — tai Linux posistemė, per kurią vyksta beveik kiekvienos paslaugos autentifikacija: SSH prisijungimas, sudo, su, vietinė konsolė. Kai serverio komandinėje eilutėje įvedate slaptažodį, jį tikrina būtent PAM. Esminis modulis — pam_unix.so — atsakingas už standartinį slaptažodžio tikrinimą pagal /etc/shadow.
OpenSSH — standartinis SSH paketas kiekviename Linux serveryje: sshd kaip serverio demonas, ssh kaip klientas, scp failų perkėlimui. Abu komponentai — PAM ir OpenSSH — yra nuotolinio administravimo pagrindas. Jei užpuolikas juos valdo, jis valdo viską: kas gali prisijungti, ką mato prisijungęs, kokie veiksmai įrašomi. Ir visa tai nepalieka nė eilutės įprastuose žurnaluose.
Svarbus kontekstas: pam_unix.so ir OpenSSH dvejetainių failų pakeitimas reikalauja root teisių tiksliniame serveryje. Tai ne pradinio įsiskverbimo technika — tai įsitvirtinimo technika, taikoma jau gavus root prieigą. Todėl Velvet Ant tiek daug jėgų skyrė pirmiems dviem etapams: gauti pradinę prieigą, pasiekti izoliuotą segmentą, gauti root — ir tik tada keisti autentifikacijos failus. Gynybos požiūriu tai reiškia: kontroliuoti, kas ir kada gauna root, ne mažiau svarbu nei stebėjimas po fakto.
TIKROJI ATAKOS GRANDINĖ
Tikslinis tinklas neturėjo tiesioginės interneto prieigos — užpuolikai turėjo tiesti kelią etapais. Pirmajame etape Velvet Ant įsitvirtino interneto pusėje esančiuose serveriuose. Ten buvo įdiegta modifikuota GS-Netcat versija — įrankis iš viešo Global Socket Toolkit rinkinio. Dvejetainis failas buvo pavadintas auditdb ir padėtas į /usr/sbin/ — tarp teisėtų sisteminių įrankių. Kad slaptų nuo procesų sąrašų, įrankis perrašydavo savo argv[0] reikšmę į [khubd], imituodamas teisėtą branduolio procesą. Nuolatinis veikimas buvo užtikrintas per systemd vieneto failą naujesnėse sistemose arba įterptą eilutę į /etc/init.d/ scenarijus senesnėse — abiem atvejais maskuojantis kaip Chrome paslauga.
Lygiagrečiai buvo įdiegtas SOCKS5 tarpinis serveris Perl kalba — viešo ssspl projekto adaptuota realizacija — srautui tunelinti ir šoniniam judėjimui. Procesas maskavosi kaip smbd -D. Kiekvienas pavyzdys naudojo unikalų failo pavadinimą, proceso pavadinimą ir klausymosi prievadą — kad būtų sunkiau koreliuoti duomenis tarp pažeistų serverių.
Antrajame etape grupė perėjo per IT tinklą į izoliuotą kritinės infrastruktūros segmentą. Tam panaudojo pažeistą nginx serverį: jo konfigūracija buvo pakeista taip, kad įeinančios užklausos tam tikru URL būtų perduodamos į backend serverį, kur FastCGI apvalkalas (fcgiwrap) vykdė specialiai sukurtą dvejetainį failą uptime. Tas failas užmegzdavo SSH ryšį su serveriu izoliuotame segmente ir ten vykdydavo scenarijus — pagal HTTP POST užklausoje perduotus parametrus. Tiesioginės prieigos prie izoliuoto tinklo nereikėjo: komandos keliaudavo per paprastas HTTP užklausas.
Trečiajame — ir pagrindiniame — etape užpuolikai perėmė autentifikacijos paketą. Pažeistuose serveriuose pam_unix.so buvo pakeistas užpakalinių durų kopija. Sygnia aptiko devynis skirtingus variantus — kiekvienas sukompiliuotas atskiroje aplinkoje, kas rodo gerai organizuotą gamybos konvejerį. Du pagrindiniai tipai: pirmasis priėmė užkoduotą slaptažodį ir visiškai aplenkdavo standartinį tikrinimą (slaptažodis po naudojimo būdavo nedelsiant anuliuojamas atmintyje, kad nesimatytų atminties iškrovoje); antrasis papildomai įrašydavo tikruosius vartotojų vardus ir slaptažodžius į paslėptą failą /usr/sbin/.ssh.log. Šiame variante užpakalinių durų slaptažodis buvo saugomas dvejetainiame faile užšifruotu pavidalu.
OpenSSH dvejetainiai failai — ssh, sshd, scp, kai kuriais atvejais ir ssh-keygen — taip pat buvo pakeisti. Modifikuotas sshd perėmė ir saugojo visų įeinančių ryšių kredencialus užšifruotame faile /usr/share/man9/ph/.ph.man. Kiekvienas įrašas fiksavo ryšio kryptį, autentifikacijos tipą ir sėkmingumą. Tiek ssh, tiek sshd taip pat registravo kiekvieną sesijoje įvestą komandą: sshd rašė failus į /usr/share/man9/ph/ vardais s{MD5(username+TTY)}, o ssh — vardais c{MD5(UID+SSH_TTY)}. Visi sukurti failai ir katalogai buvo timestompinami — jų laiko žymos pakeičiamos į /etc/shells sukūrimo laiką. Modifikuotas scp, paleidus su root teisėmis, galėjo išjungti SELinux. Jo ! vėliava maskavo procesą kaip [kauditd] -sh.
Viena detalė atskleidžia šios kampanijos operacinę drausmę: modifikuotas ssh turėjo papildomą -d vėliavą, išjungiančią pačios grupės kredencialų ir klavišų paspaudimų registravimą. Kai Velvet Ant operatoriai dirbo per užpakalinių durų dvejetainį failą — jie aktyvuodavo šią vėliavą, kad nepaliktų pėdsakų. Trečiasis nuolatinės prieigos sluoksnis buvo paprastesnis, bet ne mažiau patikimas: grupė pridėdavo savo viešuosius raktus prie authorized_keys pažeistuose serveriuose — nepriklausoma prieiga be slaptažodžių.
LAIKO JUOSTA
Ankstyviausi klavišų registravimo artefaktai šioje aplinkoje datuoti 2016 metais. Jie rasti senajame modifikuoto OpenSSH variante, kuris sesijų žurnalus rašė į /var/lib/sam/ failais pavadintais sam_{timestamp} — mažiau rafinuotai nei vėlesni variantai, ir būtent tai leido Sygnia nustatyti, kada grupė pirmą kartą pasirodė aplinkoje. Buvimas tęsėsi beveik dešimtmetį.
Sygnia seka Velvet Ant per kelis nepriklausomus tyrimus su skirtingomis aukomis. 2024 metais grupė buvo sugauta piktnaudžiaujant F5 BIG-IP įrenginiais kitoje organizacijoje. Tų pačių metų pabaigoje — išnaudojant CVE-2024-20399, Cisco NX-OS nulinės dienos pažeidžiamybę, siekiant įdiegti VELVETSHELL užpakalines duris tiesiai į Nexus komutatorius. Abiem atvejais Sygnia paskelbė išsamius techninius aprašymus su IOC sąrašais.
Schema pastovi: aptikta Velvet Ant nepasitraukia — ji pereina į infrastruktūrą, kurią gynėjai stebi mažiau. Tinklų įrenginiai su patentuota OS stebimi prasčiau nei Windows serveriai. Linux komutatoriai — prasčiau nei įrenginiai. Pačių Linux serverių autentifikacijos paketas — prasčiausiai iš visko. Operation Highland paskelbta Sygnia 2026 m. birželio 11 d.
KODĖL TAI SVARBU
Standartinis reagavimo į incidentus scenarijus numato: pakeisti slaptažodžius, nutraukti sesijas, izoliuoti serverį. Nė viena iš šių priemonių neveikia, kai pažeistas pats autentifikacijos mechanizmas. Slaptažodžio keitimas beprasmis, jei pam_unix.so priima užpakalinių durų slaptažodį nepriklausomai nuo /etc/shadow turinio. Sesijų nutraukimas beprasmis, jei modifikuotas modulis perims naujus kredencialus kito teisėto administratoriaus prisijungimo metu. EDR, IDS ir SIEM nemato nieko nenormalaus — prisijungimai atrodo kaip įprasta administracinė veikla.
Kiekvienam sistemos administratoriui, valdančiam produkcinį serverį su SSH prieiga, tai tiesiogiai nurodo akląją zoną: jei užpuolikas turėjo prieigą prie /lib/security/pam_unix.so ar OpenSSH dvejetainių failų — žurnalų patikrinimas nieko neparodys. Šios klasės atakoms, kurias Sygnia vadina „authentication-layer persistence”, reikia atskiros aptikimo strategijos: ne žurnalų analizė, o pačių vykdomųjų failų vientisumo kontrolė.
Velvet Ant schema nuosekli: kaskart aptikus vieną placdarmiją, grupė jau turėjo kitą, gilesnę. Operation Highland — tai taškas, po kurio užpuolikai kontroliavo ne konkretią paslaugą, o gebėjimą autentifikuotis visuose aplinkos serveriuose.
KAIP APSISAUGOTI SAVO SERVERIUOSE
Pagrindinis apsaugos nuo šios klasės atakų įrankis — autentifikacijos dvejetainių failų vientisumo stebėjimas. Ne konfigūracijos failai, ne žurnalai — būtent vykdomieji failai. AIDE, auditd su rašymo stebėjimu arba bet kuris FIM sprendimas turi apimti: pam_unix.so ir kitus modulius /lib/security/ bei /lib/x86_64-linux-gnu/security/ kataloguose, PAM konfigūracijas /etc/pam.d/, OpenSSH dvejetainius failus — ssh, sshd, scp, sftp, ssh-keygen, failą sshd_config, privilegijuotų vartotojų authorized_keys, systemd vieneto failus ir paleidimo scenarijus. Bet koks šių failų pakeitimas turi suaktyvinti įspėjimą, reikalaujantį tyrimo, o ne tik įrašo žurnale.
Greitą įdiegtų paketų vientisumo patikrinimą suteikia dpkg --verify. Debian ir Ubuntu sistemose ši komanda lygina failų kontrolines sumas su paketo metaduomenimis — tuščia išvestis reiškia, kad failai nepakeisti, eilutė su prefiksu ??5?????? nurodo nesutampančią sumą:
dpkg --verify openssh-server openssh-client libpam-modules
Šis testas greitas, bet ne visiškai patikimas: užpuolikas su root prieiga gali pataisyti ir dpkg duomenų bazę. Patikimesnis būdas — palyginti SHA256 kontrolines sumas tiesiogiai su etaloniniu tos pačios distribucijos versijos vaizdu. Norėdami patikrinti sshd dvejetainį failą: atsisiųskite paketą iš oficialaus veidrodžio atskirame švariai sukonfigūruotame kompiuteryje, išpakuokite ir palyginkite kontrolines sumas su tikrinamo serverio failais. Sutapimas — gerai; nesutapimas esant identiškai paketo versijai — rimtas perspėjimo signalas.
Sumažinti riziką, kad root prieiga bus gauta iš anksto, padeda standartiniai kietinimo veiksmai: išjunkite tiesioginį root prisijungimą per SSH (PermitRootLogin no faile sshd_config), nukreipkite visą administracinę prieigą per vardines paskyras su tiksliai apibrėžtomis sudo teisėmis. MFA turi veikti prieš užklausai pasiekiant serverį, o ne jo viduje — pažeistas PAM paprasčiausiai ignoruos vidinę MFA apsaugą.
Jei pažeidimas jau įvyko — atkūrimo seka yra esminis dalykas. Slaptažodžių keitimas prieš pakeičiant pam_unix.so nieko neduos: modifikuotas modulis perims naujus slaptažodžius kito prisijungimo metu. Seka: pirmiausia patikrinti ir pakeisti autentifikacijos dvejetainius failus, tada išvalyti authorized_keys, ir tik tada keisti kredencialus. Sygnia ypač pabrėžia: PAM modulių ir OpenSSH dvejetainių failų pakeitimą būtina iš anksto išbandyti izoliuotoje laboratorijoje su identiška konfigūracija — nesuderinama versija ar trūkstama priklausomybė gali visiškai užblokuoti SSH prieigą prie veikiančio produktyvaus serverio.
KĄ DARYTI DABAR
Nepriklausomai nuo to, ar turite pagrindo įtarti pažeidimą, ar tiesiog norite įsitikinti, kad sistema švari — patikrinkite Velvet Ant naudotus failus šioje kampanijoje. Šios komandos ieško Operation Highland būdingų katalogų ir failų:
ls -la /usr/sbin/.ssh.log 2>/dev/null
ls -la /usr/share/man9/ph/ 2>/dev/null
ls -la /usr/lib/eth-scsi/ 2>/dev/null
ls -la /var/lib/sam/ 2>/dev/null
Jei bet kuris iš šių katalogų ar failų egzistuoja — tai tiesioginis šios kampanijos IOC. Atskirai patikrinkite authorized_keys root ir kitų privilegijuotų paskyrų: Velvet Ant pridėdavo savo viešuosius raktus kaip trečią nuolatinės prieigos sluoksnį. Root paskyroje:
cat /root/.ssh/authorized_keys
Kitiems vartotojams su prisijungimo apvalkalu — patikrinkite ~/.ssh/authorized_keys jų namų kataloguose. Bet koks raktas, kurio nėra jūsų patikimų raktų sąraše, yra potencialus IOC.
Visas Operation Highland kompromitacijos indikatorių (IOC) sąrašas paskelbtas Sygnia ataskaitos priede. Jei jūsų aplinka atitinka aprašytą profilį — kritinė infrastruktūra, izoliuotas tinklas, Linux serveriai su ilgu veikimo laiku be reguliaraus dvejetainių failų audito — PAM ir OpenSSH vientisumo patikrinimas turėtų būti prioritetas.
IŠVADOS
Operation Highland parodo, kur atkeliauja pažangi ilgalaikė ataka, kai gynėjai tinkamai dirba: kaskart aptikus placdarmiją, Velvet Ant ėjo giliau, kol pasiekė sluoksnį, kurio dauguma Blue Team komandų niekada netikrina. PAM ir OpenSSH — ne „tiesiog paketai”. Tai mechanizmas, nusprendžiantis, kas yra tas, kuo prisistato. Jo pažeidimas vienu metu panaikina MFA, stiprių slaptažodžių ir žurnalų audito veiksmingumą.
Praktinė išvada sistemos administratoriui: FIM autentifikacijos dvejetainiams failams — ne paranoja, o minimalus higienos reikalavimas kiekvienam serveriui, kuriame vyksta ilgalaikiai administraciniai procesai. Organizacijoms su kritine infrastruktūra ar izoliuotais tinklais: pasitikėjimas komponentu vien todėl, kad jis sisteminis — tai būtent ta grėsmės modelio spraga, kurią Velvet Ant išnaudoja jau beveik dešimtmetį.
