Tinklaraštis

Root be slaptažodžio: kaip PinTheft paverčia io_uring branduolio perėmimo įrankiu.

PinTheft
Uncategorized @lt

Root be slaptažodžio: kaip PinTheft paverčia io_uring branduolio perėmimo įrankiu.

Serveris užrakintas iš visų pusių. Nginx už Cloudflare, fail2ban blokuoja botus, root prisijungimas per SSH išjungtas, visi portai išskyrus 22, 80 ir 443 užblokuoti nftables. Tada kažkas gauna neprivilegijuotą shell — per pažeidžiamą plaginą, silpną slaptažodį, bet ką. Paleidžia scenarijų. Po kelių sekundžių — root.

Sveiki atvykę į PinTheft.

KAS NUTIKO

2026 metų gegužės 21 dieną SecurityLab paskelbė Linux branduolio pažeidžiamumo PinTheft detales. Jį atrado komanda V12 — RDS (Reliable Datagram Sockets) posistemėje, atsakingoje už patikimą datagramų perdavimą, daugiausia klasterio viduje.

PoC eksploitas jau yra GitHub. CVE identifikatorius nepriskirtas. Branduolio komanda paskelbė pataisą gegužės 5 dieną — vadinasi, laikotarpis tarp pataisos ir viešo eksploito buvo dvi savaitės. Jei per tą laiką neatnaujinote branduolio — esate rizikos grupėje.

KAIP TAI VEIKIA

RDS posistemės zerocopy mechanizme rasta double-free klaida: tas pats atminties puslapis atlaisvinamas du kartus. Zerocopy — tai duomenų perdavimo tarp branduolio ir programų metodas be fizinio kopijavimo: vietoj kopijų perduodamos nuorodos į atminties puslapius. Greita ir efektyvu — ir būtent tai čia tampa problema. Savaime tai nemalonu, bet ne katastrofa. Katastrofa prasideda su io_uring.

io_uring — asinchroninė įvesties/išvesties sąsaja Linux branduolyje, atsiradusi 5.1 versijoje. Ji leidžia programoms teikti operacijų eiles branduoliui su minimaliomis sąnaudomis. Tai mechanizmas, naudojamas atakoje: užpuolikas sukuria io_uring užklausų seriją, kuri patenka į dvigubo atlaisvinimo momentą ir pradeda perimti nuorodas į branduolio atminties puslapius — pin stealing. Palaipsniui kaupiant kontrolę virš atminties puslapių, užpuolikas įgyja galimybę vykdyti bet kokį kodą su branduolio teisėmis. Rezultatas: root be slaptažodžio.

Sėkmingos atakos sąlygos:
— rds modulis įkeltas
— io_uring įjungtas
— sistemoje yra bet koks SUID dvejetainis failas (sudo, pkexec — pakanka bet kurio)
— architektūra x86_64
— lokalinė prieiga prie sistemos

KAS PAŽEIDŽIAMA

Iš populiarių distribucijų rds pagal nutylėjimą įkeliamas tik Arch Linux — todėl pagrindinis smūgis tenka ten. Tačiau tai nereiškia, kad Debian, Ubuntu ir RHEL yra saugūs: jei rds įkeltas dėl bet kokios priežasties — pavyzdžiui, nes programa paprašė atitinkamo socket tipo — sistema yra pažeidžiama.

Patikrinti viena komanda:

lsmod | grep rds

Jei yra išvestis — rds įkeltas. Esant kitoms sąlygoms sistema yra pavojuje.

KIEK TAI RIMTA

Tipiniam VPS ar dedikuotam serveriui — vidutinis pavojus. Štai kodėl.

Švelninantys veiksniai:
— reikalinga lokalinė prieiga, nuotoliniu būdu neišnaudojama
— Ubuntu/Debian/RHEL rds pagal nutylėjimą neįkeltas
— reikalinga konkreti sąlygų kombinacija vienu metu

Kas daro ją rimtą:
— PoC viešas, įėjimo slenkstis nulis
— jei užpuolikas jau turi neprivilegijuotą shell (per pažeidžiamą WordPress plaginą, pavyzdžiui) — tai tiesioginis kelias į root
— nėra CVE, vadinasi automatiniai skaitytuvai jos nemato

Kur tikrai pavojinga:
— shared hosting su keliais vartotojais viename serveryje
— VPS su panelėmis kaip cPanel/Plesk, kur klientai turi shell prieigą
— CI/CD sistemos, vykdančios kodą iš saugyklų
— kūrimo serveriai su keliais SSH vartotojais

Kur rizika minimali:
— vienas VPS su vienu administratoriumi be pašalinių vartotojų: norint pasinaudoti PinTheft, užpuolikas pirmiausia turi patekti į serverį — o tai jau atskira užduotis

Trumpai: savaime ne katastrofa, bet kartu su bet kokia web programos pažeidžiamybe tampa paskutine atakos grandine.

KĄ DARYTI DABAR

1 žingsnis. Iškelti rds ir užblokuoti visam laikui:

sudo modprobe -r rds

echo "install rds /bin/false" | sudo tee /etc/modprobe.d/disable-rds.conf
echo "blacklist rds" | sudo tee -a /etc/modprobe.d/disable-rds.conf

# Debian/Ubuntu — atstatyti initramfs, kitaip blokavimas neišliks po perkrovimo
sudo update-initramfs -u

# RHEL/Fedora
sudo dracut -f

Kodėl dvi taisyklės, o ne viena: blacklist neleidžia automatiškai įkelti modulio, tačiau jį vis tiek galima įkelti rankiniu būdu per modprobe rds arba kaip kito modulio priklausomybę. install rds /bin/false perima bet kokį įkėlimo bandymą — įskaitant netiesioginius — ir vietoj modulio paleidžia /bin/false, kuri akimirksniu baigiasi su klaida. Kartu jie uždaro abu kelius.

Kodėl reikalingas initramfs atstatymas: modprobe.d taisyklės skaitomos sistemos paleidimo metu iš initramfs vaizdo. Neatstačius jo, naujos taisyklės nepatenka į vaizdą, ir po perkrovimo sistema naudoja seną initramfs be blokavimo.

2 žingsnis. Apriboti io_uring (atsargiai — gali sugadinti PostgreSQL 16+ ir kai kuriuos container runtimes):

Pirmiausia patikrinti dabartinę būseną:

cat /proc/sys/kernel/io_uring_disabled
# 0 = įjungtas visiems
# 1 = išjungtas neprivilegijuotiems vartotojams
# 2 = visiškai išjungtas

Mitiguacijai reikia bent =1. Reikšmė =2 visiškai pašalina atakos vektorių, bet sugadina viską, kas naudoja io_uring — įskaitant PostgreSQL 16+. Jei nesate tikri — naudokite =1: jis blokuoja atakos vektorių (ataka reikalauja neprivilegijuoto vartotojo) su mažesne rizika tarnyboms:

sudo sysctl -w kernel.io_uring_disabled=1
echo "kernel.io_uring_disabled=1" | sudo tee /etc/sysctl.d/99-io-uring.conf

3 žingsnis. Atnaujinti branduolį ir perkrauti:

# Debian/Ubuntu
sudo apt update && sudo apt upgrade linux-image-generic

# RHEL/Fedora
sudo dnf update kernel

Po perkrovimo — įsitikinti, kad rds nebeįkeliamas:

lsmod | grep rds
# Tuščia išvestis — gerai

KONTEKSTAS: 2026 METŲ BANGA

PinTheft — ne atskiras įvykis. 2026 metais tyrėjai nuosekliai skelbia pažeidžiamumus Linux branduolio zerocopy ir io_uring posistemėse: DirtyDecrypt, DirtyCBC, Dirty Frag, Fragnesia, Copy Fail. Ši branduolio sritis yra aktyviai tiriama.

Sekite [email protected] ir savo distribucijos saugumo pranešimus. Daugelis šių pažeidžiamumų ten pasirodo anksčiau nei gauna CVE identifikatorių — lygiai kaip nutiko su PinTheft.

Leave your thought here

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *