CPU-X'in Arkasındaki Mühendislik: Linux Sistem Gözlemlenebilirliği ve Donanım Analizi
🇹🇷 CPU-X; Linux/BSD için donanım odaklı, açık kaynaklı bir araçtır. Bu yazı, aracın mimarisini ve tersine mühendislik açısından sunduğu imkanları inceler.
Bir güvenlik araştırmacısı veya tersine mühendis olarak, üzerinde çalıştığınız sistemin donanımını tüm çıplaklığıyla tanımak çoğu zaman işin ilk adımıdır. Bir işlemcinin mikrokod versiyonu, önbellek (cache) mimarisi veya anakartın DMI (Desktop Management Interface) verileri, spesifik bir donanım zafiyetini (örneğin donanımsal yan kanal saldırıları) test ederken hayati önem taşır.
Windows ekosisteminde bu iş için yıllardır CPU-Z kullanılıyor. Ancak Linux (ve FreeBSD) dünyasında, GNU/Linux felsefesine uygun, açık kaynaklı ve terminalde bile çalışabilen harika bir alternatifimiz var: CPU-X. Üstelik v5.1.0 sürümünden itibaren sadece x86 platformlarıyla kısıtlı kalmayıp, ARM (ARM32/AArch32 ve ARM64/AArch64) mimarilerine de resmi destek vererek mimari bağımsız bir donanım analiz aracı olma yolunda ilerliyor. Özellikle Apple Silicon ve ARM tabanlı sunucuların yükselişte olduğu bu dönemde bu esneklik oldukça kıymetli. FreeBSD desteğinin de oldukça olgunlaştığını unutmamak gerek.
Arch Linux depolarında standart olarak bulunan (pacman -S cpu-x) bu aracın sadece ne sunduğuna değil, modern C++ ile tasarlanan nesne yönelimli mimarisine ve donanımla nasıl konuştuğuna yakından bakalım.
🏗️ CPU-X’in Temel Mimarisi ve Arayüz Katmanları
CPU-X, büyük ölçüde nesne yönelimli hale getirilmiş, modern C++ kütüphanelerinden (std::thread, std::filesystem) faydalanan modüler bir araçtır. Kodun okunabilirliği ve taşınabilirliğinin artması, bilhassa Linux ve BSD sistemleri arasında ortak kod kullanımı açısından büyük bir mühendislik kazancıdır. Uygulama, farklı ortamlar için çoklu arayüz desteği sunar:
- GUI (GTK3 / GTK4): Masaüstü ortamları için standart grafik arayüz (Wayland ve X11 ile tam uyumlu).
- TUI (NCurses): X11 veya Wayland olmayan sunucu ortamlarında (SSH oturumlarında) klavye ile gezilebilir terminal arayüzü.
- CLI: Sadece ham veriyi döküp grep/awk gibi araçlarla parse etmek için
--dump,--dmidecode,--bandwidthgibi veri dışa aktarma modlarıyla çalışan komut satırı arayüzü.
🔐 Geliştirilmiş Daemon/Client Mimarisi ve IPC (Yetki Ayrılığı)
Linux’ta /dev/mem, /sys/class/dmi/id/ gibi kritik donanım verilerini okumak (haliyle CAP_SYS_RAWIO yeteneği), kaçınılmaz olarak root yetkisi gerektirir. Modern Linux sistemlerinde grafik arayüzlü bir uygulamayı (sudo cpu-x şeklinde) root olarak çalıştırmak ciddi bir güvenlik riskidir (GTK gibi karmaşık kütüphaneleri yüksek yetkilerle çalıştırmanın yaratacağı bellek bozulması riskleri root seviyesine taşınır ve Wayland üzerinde doğrudan engellenir). CPU-X bunu kök yetkisi gerektiren işlemleri izole eden daha da güçlendirilmiş bir Daemon/Client mimarisi ile çözer. Uygulamanın grafik arayüzü standart kullanıcı haklarıyla çalışırken, donanıma temas eden sunucu kısmı Unix Domain Socket kullanılarak IPC (Inter-Process Communication) ile yönetilir. İstek-cevap döngüsü poll() üzerinden asenkron olarak işleyen hafif bir sunucu ile sağlanır ve org.cpu_x.daemon ad alanında (namespace) D-Bus üzerinden Polkit ile yetkilendirilir.
sequenceDiagram
participant User as Kullanıcı (UI/CLI)
participant Socket as Unix Domain Socket / IPC
participant Polkit as Polkit (Yetkilendirme)
participant Daemon as CPU-X Daemon (Root)
participant HW as Sysfs / Donanım Kayıtları
User->>Socket: Donanım bilgisi talep et
Socket->>Daemon: İsteği ilet
Daemon->>Polkit: Bu kullanıcının yetkisi var mı?
Polkit-->>Daemon: Yetki doğrulandı (Şifre istendi/girildi)
Daemon->>HW: Düşük seviyeli okuma (MSR, DMI, PCI)
HW-->>Daemon: Ham veriler
Daemon-->>Socket: Formatlanmış veri
Socket-->>User: Veriyi arayüzde göster
src/daemon/server.cpp dosyasına baktığımızda bu daemon’un sadece pasif bir okuyucu olmadığını, aksiyon alabilen esnek bir mimariye sahip olduğunu görüyoruz:
- MSR (Model-Specific Registers) Okuma: İşlemcinin özelliklerini
/proc/cpuinfodosyasından ziyade doğrudan x86 CPUID komutu ile libcpuid kütüphanesi üzerinden okur. Arka planda çekirdektekimsrmodülünün yüklü olmasını gerektirencall_libcpuid_msr_staticvecall_libcpuid_msr_dynamicfonksiyonları işletilerek, doğrudan/dev/cpu/0/msraygıt dosyası üzerindenpread()çağrıları ile çekirdeğe özel yazmaçlar okunur. Voltaj değerleri, termal sınırlar, çarpan kilitleri ve donanımsal zafiyet yamalarının (microcode updates) durumu bu verilerden çekilerek client’a aktarılır. - DMI / SMBIOS Ayrıştırma: Sistem anakart ve RAM bellek (stick) topolojisi dahili
dmidecodemodülü ile okunur. İşlem belli bir hiyerarşiyi izler: Önce modern sysfs arayüzü (/sys/firmware/dmi/tables/), sonra EFI tabloları (/sys/firmware/efi/systab) aranır. Eğer bu arayüzler bulunamazsa araç,devmemyöntemiyle doğrudan0xF0000 - 0x100000fiziksel bellek aralığınımmap()ile eşleyerek (/dev/mem) ham bellek taraması yapar. - PCI Tarama ve Erişim: Ekran kartları cihaz ağacını (
libpcikullanarak) cihaz sürücülerindeki sanal debug dosyalarına kadar gezer. Gerekirse ekran kartlarının PCIe bağlantı hızını (Link Speed/Width) detaylandırmak için AMDGPU sürücüsüne ait/sys/kernel/debug/dri/*/nameveyapp_dpm_pciedosyalarına dek erişim sağlar. FreeBSD gibi dosya sistemlerinin dışa kapalı (erişimin < 0666) olduğu işletim sistemlerinde cihaz erişim izinlerini ayarlar. - Debugfs Otomatik Mount: AMD/Intel GPU sürücülerinin düşük seviyeli istatistiklerini sağlayan
driklasörüne erişebilmek için; eğer sistemde debugfs mount edilmemişse, daemon kök yetkisiyle/sys/kernel/debugdizinini otomatik olarak mount eder. - Kernel Modülü Yükleme: Ek sensör değerlerini okumak gibi spesifik durumlarda çalışma anında kernel modüllerini (
modprobeveyakldloadile) sisteme yükler.
⚙️ Kaputun Altı: Yeni Veri Toplama Yöntemleri ve Kütüphaneler
CPU-X, donanım bilgilerini toplamak için Linux çekirdeğinin sunduğu arayüzlerin ötesine geçmiş, birçok yeni teknoloji ve entegrasyonu barındıran bir yapıya evrilmiştir. Çekirdek saat hızları ve sysfs değerlerinin yanında harici kütüphaneler de önemli bir rol oynar.
1. 🧠 Sistem Belleği ve İşletim Sistemi İstatistikleri
İşletim sistemi verilerini okurken artık tek bir kütüphaneye bağlı kalınmıyor. src/core/libsystem.cpp modülü sayesinde, derleme aşamasında sistemde ne varsa ona dinamik olarak adapte olunuyor:
- Modern Linux dağıtımları için yeni nesil
libproc2desteği. - Geleneksel Linux sistemlerinde
/proc/meminfogibi okumalar içinlibprocps. - FreeBSD/BSD sistemlerde ise kusursuz entegrasyon için
libstatgrabmetodları.
2. 🎮 Grafik ve İşlem (Compute) Kütüphaneleri
Aracın isminin sadece “CPU-X” olmasına aldanmayın. CPU-X, sistem donanımını tabiri caizse “iliklerine kadar” tanımak için grafik API’lerini doğrudan sorgulayan (query) harika modüllere sahiptir:
- OpenGL ve EGL:
src/core/libopengl.cppmodülü ile OpenGL sürümü ve desteklenen özellikler sorgulanır. - Vulkan:
src/core/libvulkan.cppüzerinden sistemdeki Vulkan destekli fiziksel ekran kartları (Physical Device bazında) taranarak detay dökümü alınır. - OpenCL:
src/core/libopencl.cppile GPU ve CPU’nun OpenCL işlem (compute) kapasitelerine dair veriler listelenir. Bu özellik, grafik hesaplama kapasiteleri üzerine analiz yapan araştırmacılar için paha biçilemez.
🏎️ Dahili Benchmark Motoru ve CPU Affinity (Tahsis)
Tersine mühendisleri ve sistem programcılarını muhtemelen en çok ilgilendirecek yeni özelliklerden biri, CPU-X’in kendine ait çoklu iş parçacıklı (multithreaded) bir test arayüzüne (src/core/benchmarks.cpp) sahip olmasıdır.
Bu benchmark modülü, CPU sınırlarını ölçmek için temel olarak asal sayı (prime numbers) hesaplamasına dayanır ve “Slow” (Yavaş mod) ile “Fast” (Karekök algoritması kullanılan mod) olmak üzere iki farklı test profili sunar. En can alıcı teknik detay ise uygulanan multithreading mekanizmasıdır. Sistemdeki her mantıksal işlemci (logical CPU) başına bir std::thread başlatılır. pthread_setaffinity_np (veya FreeBSD’deki karşılığı cpuset_t) fonksiyonu kullanılarak her bir thread spesifik bir çekirdeğe kilitlenir (CPU Affinity). Böylelikle işletim sisteminin thread scheduling (zamanlama) davranışlarından dolayı context switch yapması önlenir ve işlemcinin ham teorik performansı saptırılmaksızın en doğru şekilde ölçülür.
🛡️ Tehdit Modellemesi ve Saldırı Yüzeyi
Tersine mühendislik ve exploit geliştirme perspektifinden değerlendirildiğinde, CPU-X’in daemon tasarımı ve C kod tabanı (core.cpp, dmidecode/ vb.) iki temel saldırı yüzeyi noktası sunmaktadır. Kod tabanı üzerinde yapılabilecek hedefli fuzzing çalışmaları, araştırmacılar için değer taşıyabilir:
1. ⚡ D-Bus IPC Üzerinden Yerel Yetki Yükseltme (LPE) Potansiyeli
cpu-x-daemon işlemi sistemde root yetkileriyle çalışmakta ve org.cpu_x.daemon ad alanında D-Bus üzerinden mesaj kabul etmektedir. Eğer daemon, soket üzerinden iletilen manipüle edilmiş (malformed) mesajları (kullanıcı veya zararlı bir süreç tarafından gönderilen) ayrıştırırken uygunsuz sınır kontrollerine veya integer overflow hatalarına sahipse (yeterli bellek koruması hedeflenmemişse), standart bir kullanıcı bu soketi kullanarak sistemde yerel yetki yükseltme (LPE) zafiyeti tetikleyebilir. Soketin sunduğu D-Bus metotları busctl introspect org.cpu_x.daemon /org/cpu_x/daemon komutu ile dinamik olarak incelenebilir.
2. 👾 Sahte Donanım (Rogue Hardware) ve Girdi Doğrulama Zafiyetleri
Root yetkisine sahip bir işlemin donanımdan gelen verileri koşulsuz güvenilir veri olarak kabul etmesi yapısal bir risktir. CPU-X, özellikle dmidecode/dmioem.c içerisinde üreticiye özel (OEM - Lenovo, HPE vb.) veri bloklarını (SMBIOS) doğrudan parse eder. Özel olarak modifiye edilmiş bir sahte PCIe donanım cihazı, bir USB aygıtı veya zararlı bir hypervisor (sanal makine için), beklenenden uzun string’leri (buffer overflow tetikleyebilecek), hatalı biçimlendirilmiş veya null-byte içeren donanım tanımlayıcıları sunabilir. C dilinin yapısı gereği ham donanım girdisinin ayrıştırılması sırasında yaşanacak bir bellek ihlali, donanım tabanlı saldırılar (hardware-fault injection) kategorisinde potansiyel oluşturur.
🎯 Sonuç: Tersine Mühendisler ve Geliştiriciler İçin Ne Vaat Ediyor?
Sisteme dair detaylı bilgi toplama aşaması, pentest süreçlerinin ve düşük seviyeli exploit geliştirme çalışmalarının omurgasıdır. CPU-X’in CLI tarafında sunduğu döküm kabiliyeti, örneğin ROP zincirleri oluştururken gereken özel instruction setlerin olup olmadığını doğrulamakta kritiktir.
Bunun yanı sıra, asenkron poll() tabanlı IPC yapısı, daemon içerisindeki otomatik mount yetenekleri (debugfs), çekirdeklere kilitlenen benchmark operasyonları ve modern C++ mimarisi CPU-X’i sadece bir donanım tanıma aracı olmaktan çok öteye taşıyor. Apple Silicon’dan modern BSD dağıtımlarına uzanan platform desteğiyle CPU-X, sistem programlama konseptlerini (CAP_SYS_RAWIO, IPC, mmap kısıtlamaları) öğrenmek isteyenler için harika bir akademik materyal sergilerken, donanım fuzzing’i odaklı tersine mühendisler için vazgeçilmez bir açık kaynaklı İsviçre çakısıdır!
