
Eine Go-Implementierung von PinTheft (CVE-2026-43494)
Go-Port von pintheft - RDS zcopy double-free LPE. Mitglied der Dirty Frag Sicherheitslückenklasse.
[!IMPORTANT] Arch Linux ist eine der am stärksten betroffenen Distributionen für diese Sicherheitslücke, da es zu den wenigen gehört, bei denen das RDS-Modul normalerweise standardmäßig geladen werden kann.
Der Fehler befindet sich in rds_message_zcopy_from_user(). Die Funktion pinnt Benutzerseiten über GUP eine nach der anderen via FOLL_GET. Wenn eine spätere Seite einen Fehler auslöst (z.B. eine PROT_NONE-Schutzseite), ruft der Fehlerpfad put_page() auf bereits gepinnten Seiten auf, dann ruft rds_message_purge() erneut __free_page() auf sie auf, weil op_mmp_znotifier auf NULL gesetzt wurde, aber op_nents/sg-Einträge intakt blieben. Wenn die Seite noch andere Referenzen hat, dekrementiert __free_page stillschweigend den Referenzzähler. Jeder fehlschlagende sendmsg stiehlt genau eine Referenz von der ersten Seite.
CONFIG_INIT_ON_ALLOC_DEFAULT_ONPinnen Sie die Zielseite über io_uring REGISTER_BUFFERS, das den Referenzzähler über FOLL_PIN um GUP_PIN_COUNTING_BIAS (1024) erhöht. Stehlen Sie alle 1024 Pin-Referenzen mit fehlschlagenden Zcopy-sendmsg-Aufrufen. Der Seitenreferenzzähler ist jetzt ~1 (nur die PTE-Abbildung). munmap nimmt den normalen __folio_put-Pfad, der mem_cgroup_uncharge aufruft (löscht memcg_data), bevor die Seite freigegeben wird. Keine bad_page-Prüfung wird ausgelöst.
io_uring behält den rohen struct page* in seinem bvec-Array ohne Lebendigkeitsprüfungen. Nachdem die Seite als Page Cache für eine suid-Binärdatei zurückgewonnen wurde, schreibt IORING_OP_READ_FIXED unsere Nutzlast über diesen hängenden Zeiger hinein.
IORING_REGISTER_CLONE_BUFFERS erhöht imu->refs. Ein geforkter Daemon-Kindprozess hält den Clone-Ring-fd offen - io_buffer_unmap sieht refs > 1 und überspringt unpin_user_folio, wodurch eine Referenzzähler-Korrumpierung auf der freigegebenen Seite verhindert wird.
An CPU 0 binden, veraltete PCP-Einträge vor dem Freigeben leeren - unsere Seite landet oben, wenn der Page-Cache-Allokator sie abgreift.
REGISTER_BUFFERS(+1024) -> CLONE_BUFFERS(imu->refs=2) ->
daemon holds clone -> steal 1024 refs -> evict page cache ->
drain PCP -> munmap(free) -> pread(reclaim) ->
READ_FIXED(overwrite) -> verify -> exec -> root
go build -o pintheft-go .
./pintheft-go
Bei Erfolg wird eine Root-Shell über PTY geöffnet. Die Binärdatei auf der Festplatte bleibt unverändert.
sudo cp /tmp/.backup_pintheft_<pid> /usr/bin/su && sudo chmod u+s /usr/bin/su
CONFIG_RDS=m, CONFIG_RDS_TCP=m (automatisch geladen über SO_RDS_TRANSPORT=2)CONFIG_IO_URING=y mit io_uring_disabled=0übrigens, ich liebe Arch Linux :)