Strace
Nasıl Çalışır?
Unix tabanlı sistemlerde strace gibi bir uygulamanın varolabilmesi için gereken ptrace
sistem çağrısı uzun yıllardır (SVr4 ve 4.3BSD) bulunmaktadır.
Sistem çağrısı ismini process trace kavramından alır. ptrace
sistem çağrısı üzerinden bir uygulama başka bir uygulamanın durumunu takip edebildiği gibi değişiklikler yapma imkanına da sahip olmaktadır.
ptrace
sistem çağrısı temel olarak gdb gibi debug uygulamalarında, strace, ltrace gibi sistem veya kütüphane çağrılarını takip uygulamalarında, code coverage araçlarında, çalışan yazılım koduna dokunmadan bazı hataların giderilmesinde veya güvenlik kontrollerinden geçirilmesinde kullanılır.
ptrace
çağrısıyla bir uygulamanın kontrolü tamamen başka bir uygulama verilmektedir. Buradaki kontrolden kastımız, uygulamanın kullandığı tüm bellek alanına erişim, sinyallerin alınması, değiştirilmesi, file descriptor'ların yönetimi hatta uygulamanın kod segmentinin değiştirilerek yamalar yapılması dahil aklımıza gelebilecek hemen her türden tehlikeli değişikliklere izin veriliyor olmasıdır.
Bahsettiğimiz bu özelliklerinden ötürü, bir uygulamanın başka bir uygulamayı ptrace
ile kontrol edebilmesi için, ilgili uygulamaya sinyal gönderme yetkisinin bulunması gerekir. Dolayısıyla özel durumlar haricinde her kullanıcının kendi sahibi olduğu diğer uygulamaları ptrace ile kontrol edebileceğini, root kullanıcısının da sistemdeki tüm uygulamaları kontrol edebileceğini söyleyebiliriz.
Linux Capabilities API sisteminin geliştirilmesinden sonra yukarıda koşullardan bağımsız olarak, CAP_SYS_PTRACE özelliği sayesinde de ptrace
izni verilebilmektedir.
Tipik Kullanım
Uygulamanızı strace
ile aşağıdaki biçimde başlatmanız yeterlidir:
Ancak çoğu zaman çok daha önceden başlatılmış ve çalışmaya devam eden, bununla birlikte herhangi bir sorun nedeniyle ek bilgi toplamak istediğiniz durumlar oluşur. strace
ile herhangi bir çalışan uygulamaya, -p
parametresine <PID>
değerini vermek suretiyle attach olabiliriz:
-f
Parametresi
-f
ParametresiStrace'in uygulamanın tüm thread'lerini ve uygulamadan fork() edilen diğer çocuk süreçlerini takip edebilmesi için -f
parametresi verilmelidir.
-e
Parametresiyle Filtreleme
-e
Parametresiyle FiltrelemeStrace çıktısı zaman zaman takip için oldukça kalabalık olabilir.
Sadece belirli sistem çağrılarını takip etmek istiyorsanız e
parametresi ile bunu yapabilirsiniz:
Sadece dosya işlemleriyle ilgili sistem çağrılarını takip etmek için -e trace=file
kullanılabilir:
Sadece network ile ilgili sistem çağrılarını filtrelemek için -e trace=network
kullanılabilir:
Zaman Bilgisi Alma: -tt
-tt
Sistem çağrılarının çıktısı alınırken saniye hassasiyetinde zaman bilgisi de almak istiyorsak -t
parametresini kullanabiliriz.
Çoğu zaman saniye hassasiyeti yeterli olmayacaktır. Mikrosaniye hassasiyetinde zaman bilgisi almak için -tt
parametresini kullanabiliriz:
İstatistiki Bilgi Alma: -c
-c
-c
parametresi ile istediğimiz süre boyunca sistem çağrılarıyla ilgili istatistik toplayabiliriz:
-o
İle Çıktıların Kayıt Edilmesi
-o
İle Çıktıların Kayıt Edilmesistrace
uzun süreli çalıştırılıp oluşan loglar daha detaylı olarak geniş zaman aralığında incelenecekse, logların kayıt edilmesi gerekecektir.
-o
parametresi ile logların kayıt edileceği dosyayı belirtebilirsiniz:
Ptrace Engelleme
Linux altında bir uygulamanın, kendisinin root harici kullanıcılar tarafından ptrace
sistem çağrısı ile kontrol edilmesini engelleyebilmesine imkan verilmiştir.
Bu işlem için prctl
özel sistem çağrısı kullanılır. Uygulama prctl
aracılığıyla kendisi için PR_SET_DUMPABLE
bayrağını temizleyecek olursa root haricindeki kullanıcıların uygulamaya sinyal gönderme hakkı olsa dahi bu uygulamayı ptrace
ile kontrol etme şansları olmaz.
Bu özelliğin en tipik kullanımlarından biri, OpenSSH authentication agent yazılımında görülür. Böylelikle kullanıcıların parola girme aşamasında uygulamanın ptrace
ile başka bir uygulama tarafından kontrolü engellenmiş olur.
Güvenlik
Linux kullanımının yaygınlaşmasıyla birlikte zararlı yazılımlara rastlanma sıklığı da artmaktadır. Geleneksel Linux process modelindeki ptrace
imkan seti sebebiyle, sisteminizde kendi kullanıcınızla çalıştırdığınız herhangi bir yazılım içerisine zararlı bir kod enjekte edilmiş ise (en basit xterm aracından gelişmiş web tarayıcı uygulamalarına kadar), ptrace
sistem çağrısı sayesinde çalışan diğer tüm uygulamalarınızın kontrolünün bu zararlı yazılım tarafından devralınması ve siz hiç bir şey farketmeden önemli bilgilerin kopyalanması mümkündür.
Pek çok kullanıcının farkında olmadığı bu duruma karşılık, Linux çekirdeği içerisindeki Yama kod adlı güvenlik modülüyle bir koruma mekanizması geliştirilmiştir. (Ayrıntılı bilgiler için: https://www.kernel.org/doc/Documentation/security/Yama.txt)
Yama modülü olan Linux çekirdeğinde, /proc/sys/kernel/yama/ptrace_scope
dosyası üzerinden ptrace
sistem çağrısına verilecek tepki kontrol altına alınabilmektedir. Öntanımlı olarak bu dosyada 0 değeri yazmaktadır. Dosyada yazan değer aşağıdaki tablo doğrultusunda yorumlanır:
Değer
Anlam
0
Geleneksel davranış: önceki bölümde anlatılanlar doğrultusunda ptrace
yapabilme hakkının bulunduğu tüm uygulamalar kontrol edilebilir
1
Kısıtlandırılmış ptrace
: sadece uygulamanın doğrudan parent process'lerine veya PR_SET_PTRACER
opsiyonuyla uygulama tarafından izin verilen debug uygulamalarına ait PID
değerlerinin eşleştiği uygulamalara kontrol izni verilir. Böylece gdb program_adi
ve strace program_adi
şeklindeki kullanımlar çalışmaya devam eder ancak çalışan bir uygulamaya sonradan attach olmaya izin verilmeyecektir (dolayısıyla strace -p PID
yöntemi de çalışmayacaktır). Diğer opsiyon da özellikle KDE, Chromium, Wine gibi uygulamaların kullandığı, debug/crash handler'a ait PID değerinin PR_SET_PTRACER
ile uygulama içerisinden belirtilmesi ve bu sayede spesifik bir uygulamanın ptrace
yapabilmesi şeklindedir
2
Sistem yöneticisine ptrace
: sadece CAP_SYS_PTRACE
özelliği tanımlanmış uygulamalar veya prctl
ile PTRACE_TRACEME
opsiyonunu tanımlayan çocuk process'ler kontrol edilebilir
3
Tamamen devre dışı: hiç bir şart altında ptrace
yapılmasına imkan tanınmaz. Bu özellik bir defa tanımlandığı takdirde çalışma anında tekrar değişiklik yapılamaz
Her ne kadar uygulamalar prctl
üzerinden kendilerinin ptrace
yapılabilmesini root kullanıcısı dışında devre dışı bırakabiliyor olsalar da, pek çok yazılımcı bu detayların farkında değildir. OpenSSH agent'ı gibi doğrudan güvenlikle ilgili yazılımlar bu işlemleri yapıyor olmasına karşın, sistemde çalışan tüm yazılımlardan aynı davranışı beklemek doğru olmaz. Bu nedenle sistem genelinde yazılımdan bağımsız çözümlerin üretilmesi önem taşır. Son zamanlarda bazı Linux dağıtımları (Ubuntu vb.) yukarıda tariflediğimiz ptrace_scope
dosyasının öntanımlı değerini 1 yapmaya başlamışlardır. Böylelikle ptrace
işlemleri kısıtlandığından sistem genelinde daha güvenli bir çalışma ortamı sağlanmaktadır.
Android kullanan sistemler de düşünüldüğünde bu gibi güvenlik konularında daha hassas olunması gerektiği açıktır.
Örnek strace gerçekleştirimi
Aşağıdaki örnek uygulamayı ministrace.c
adıyla kaydedip
ile derleyebilirsiniz.
Not: Örnek uygulama 32 bitlik sistemler için yazılmış olup mimari farklılıkları gözardı edilmiştir. Bu sebeple 32 bitlik bir sistemde veya
gcc-multilib
kurulu ise-m32
parametresi ile derlemelisiniz.
Uygulama derlendikten sonra herhangi bir komutu ministrace
ile çalıştırıp çıktıyı inceleyebiliriz:
Örnek uygulamamızda 65 satırlık bir kod ile strace uygulamasının temel çalışma prensibi gösterilmeye çalışılmıştır. Daha gelişmiş bir örnekte sistem çağrılarının numaralarından isimlerine ulaşmak, çağrıda kullanılan parametreleri ve geri dönüş kodlarının ilgili sistem çağrısı özelinde anlamlarını göstermek mümkün olabilir.
Last updated
Was this helpful?