"İnsanın değeri aradığı şeyin değeri kadardır."
MEVLANA

17 Kasım 2011 Perşembe

Güvenilen Güven Üzerine Düşünceler [Reflections on Trusting Trust]

ACM Classic: Reflections on Trusting Trust



Ken Thompson'ın 1983 Turing Ödülü Konuşması

 

Güvenilen Güven Üzerine Düşünceler                            [Reflections on Trusting Trust]
Ken Thompson

Çeviren: Kemal GÜVENLİ kemalguvenli@gmail.com

Reprinted from Communication of the ACM, Vol. 27, No.
8, August 1984, pp. 761-763. Copyright © 1984, Association for
Computing Machinery, Inc. Also appears in ACM Turing Award
Lectures: The First Twenty Years 1965-1985
Copyright ©
1987 by the ACM press and Computers Under Attack: Intruders,
Worms, and Viruses
Copyright © 1990 by the ACM press.

Bu ACM'nin bir telif haklı çalışmasından türetilmiş
dijital bir kopyasıdır. O, yazarın orijinal çalışmasının tam
bir kopyası olduğunu garanti etmez.


Giriş

Bu ödül için ACM'ye teşekkür ederim. Ben daha fazla
katkıda bulunamam ama teknik değeri kadar zamanlama ve şans için
bu şerefi alıyor olduğumu hissederim. UNIX, merkezi main frame'
lerden özerk makinelere [PC- Ç.N.] endüstriyel
genişlikli değişimiyle ortalığı popülaritesiyle silip süpürdü.
Sanıyorum Daniel Bobrow (1) bir PDP-10 almaya gücü
yetemeseydi ve bir PDP-11 için reklamlar yerleştirilseydi
benim yerime o burada olacaktı. Ayrıca, UNIX' in günümüzdeki
hali insanların büyük ölçekli emeklerinin sonucudur.
Eski bir atasözü vardır, “Seni getiren biriyle
dans et,” bu UNIX hakkında konuşmalıyım manasındadır. Çoğu
yıldır UNIX ana akımı üzerinde çalışmadım, Şimdi
başkalarının çalışmasından dolayı hak edilmiş itibarı almaya
devam ediyorum. Bu nedenle, UNIX hakkında konuşmayacağım fakat
katkıda bulunmuş herkese teşekkür etmek istiyorum.

Bu beni Dennis Ritchie' ye getirir. İşbirliğimiz güzel bir
şeydi. On yıllarca beraber çalıştık, sadece bir çalışmanın
hatalı yönlendirilmesini anımsayabilirim. Bu vesileyle, aynı
20-satır assembly dili programı birlikte yazdığımızı keşfettim.
Kaynakları karşılaştırdım ve onların karakter'e karakter eşleştiğini
bulunca hayretler içinde kaldım. Bizim çalışma
birlikteliğimizin sonucu, bizim her bir katkıda bulunduğumuz
çalışmadan daha büyük uzaktadır.

Ben bir programcıyım. Benim 1040 formumda [A.B.D' de bireysel
gelir vergisi bildirim formu – Ç.N. ] , bu meslek olarak
ifade ettiğimdir. Bir programcı olarak, programlar yazarım. Şimdiye
kadar yazdığım en zarif programı size göstermek istiyorum. Bunu
üç bölümde yapacağım ve en sonunda onu beraber
almayı deneyin.

Bölüm I

Kolejde, video oyunlarından önce, programlama egzersizleri
ortaya atarak kendimizi eğlendirirdik. En meşhurlarından biri kendi
kaynak kodunu üreten (self-reproducing ) en kısa programı
yazmaktı. Gerçekçilikten (reality) ayrılmış bir örnek
olduğundan beri, en kullanışlı araç FORTRAN'dır. Gerçekten,
FORTRAN üç durumlu yarışların [Piknik ve okul
karnavallarında partnerlerin birer ayağını birbirine bağlayarak
yaklaşık 50 metre uzaklığı koştukları favori yarış. – Ç.N.]
popüler olmasının aynı sebebinden dolayı tercih diliydi.

Elbette ki dahası saptandı, problem, derlendiğinde ve
çalıştırıldığında kendi kaynak kodunun tam bir kopyasını çıktı
olarak üretecek bir kaynak kodlu program yazmaktır. Eğer bunu
bunu hiç yapmadıysanız, kendinizin onu denemesi için
sizi teşvik ediyorum. Nasıl yapıldığının keşfi, nasıl yapıldığının
anlatılmış olmasıyla elde edilecek herhangi bir menfaatin uzak ara
üstünde olduğunu açığa vurulmasıdır. “En kısa”
hakkındaki bölüm, ustalığı göstermek ve kazananı
belirlemek için sadece özendirici bir şeydi.


FIGURE1


Figure I C programlama dilinde kendi
kaynak kodunu üreten [self-reproducing] bir programı gösterir.
(Purist [Titiz; lisan kullanımında aşırı dikkatli kişiler –
Ç.N.] programın tam olarak kendi kaynak kodunu üreten bir
program olmadığının farkına varacak, fakat kendi kaynak kodunu üreten
bir program üretecektir.) Bu giriş bir ödül kazanmak
için epeyce büyüktür, ama o tekniği gösterir
ve hikayemi tamamlamak için ihtiyaç duyduğum iki önemli
özelliğe sahiptir: (I) Bu program bir başka program tarafından
kolaylıkla yazılmış olabilir. (2) Bu pro-gram ana algoritmasıyla
birlikte üretilecek yeniden üretilecek bagaj
fazlalılığındaki bir keyfiyi içerebilir. Örnekte, yorum
[C kaynak kodlarında /* ve */ arasında kalan cümleler. -Ç.N.]
bile üretilebilir.

Bölüm II

C compiler [derleyici] C'de yazıldı. Tanımlamak üzere olduğum
şey , compiler'lar kendi dillerinde yazıldıkları zaman doğacak olan
“tavuk ve yumurta” problemlerinden birisidir. C
Compiler'ından spesifik bir örnek kullanacağım.
C ilk değeri atanmış karakter dizisini [initialized character
array] belirterek yapan bir string e izin verir. String'lerdeki
kendine özgü karakterler basılamaz [unprintable]
karakterleri göstermekten sakındırabilir. Örnek olarak;
“Merhaba dünya\n”
"Hello world\n"
yeni satır karakterini gösteren “\n,” ile beraber
bir string i gösterir.

FIGURE2


Figure 2, karakter escape [Escape character:
"\" , bir script ya da kod içinde,
kendisinden hemen sonra gelecek olan karakterin, komut olarak değil,
gözüktüğü şekilde kullanılması gerektiğini
anlatır. - Ç.N.] sekansını yorumlayan C compiler'ındaki kodun
idealleştirilmişidir. Bu kodun şaşırtıcı kısmıdır. O, herhangi
karakter kümesinde yeni bir satır için ne derlendiğini
tamamen taşınabilir şekilde bilir. Bilinen bu davranış sonra ona
kendini yeniden derlemesine izin verir, böylece bilgiyi
ölümsüzleştiriyor.


FIGURE3


Bizim, dikey kayış karakterini [the vertical tab character] temsil
etmek için "\v" sekansını içerecek şekilde C
compiler'ını değiştirmeyi dilediğimizi farz et. Figure
2
'ye ilave apaçıktır ve Figure 3. de
gösterilir. C compiler 'ını yeniden derledikten sonra bir
diagnostic [Compiler veya assembler'ın anlayamadığı ifade veya söz
dizimininden söz eden programcının kaynak kodundaki hata mesajı
– Ç.N. ] alırız. Açıkça, compiler'ların
binary [ programlama dillerinde yazılan kaynak kodlarının,
mikroişlemciler tarafından direk çalıştırabilen kodu]
versiyonun “\v” hakkında bilmediklerinden beri, kaynak
kod legal[meşru] C değildir. Biz compiler'ı “eğitmeliyiz”.
O, "\v" neyi ifade ettiğini bildikten sonra, sonuç
olarak bizim yeni değişikliğimiz legal C olacak. Vertical tab'ın
decimal 11 olduğunu ASCII çizelgesinden arayıp bulabiliriz.
Figure 4. deki gibi kaynak kodumuzu değiştiririz.
Şimdi eski compiler yeni kaynak kodu kabl eder. Sonuçlanmış
binary' yi yeni resmi C compiler'ı olarak kurarız ve Figure
3
.'de sahip olduğumuz tarzda şimdi taşınabilir versiyonunu
yazabiliriz.


FIGURE4


Bu derin bir kavramdır. O, gördüğüm gibi ''eğitim''
programına öyle yakındır. Bir kere onu basitçe
anlatırsın, sonra self-referencing [kendini referans almak;
recursion-yenileme- kavramında görülür – Ç.N.]
tanımını kullanabilirsin.

Bölüm III


FIGURE5


Tekrar, C compiler'ında, Figure 5 , rutin
''derleme''nin [ the routine “compile”] kaynak kodun bir
sonraki satırının derlenmesi olarak adlandırıldığı yer, C compiler'ın
yüksek seviyeli kontrolünü gösterir. Figure
6
, her ne zaman özel bir örnek eşleştiğinde kaynak
kodu kasten hatalı derleyecek C compiler'ına basit bir modifikasyonu
gösterir. Eğer kasıtlı değilse o compiler “bug”
[hatalı sonuçlara neden olan kod parçası] olarak
isimlendirilir. Kasıtlı olduğun beri, o bir ''Truva atı''[Trojan
horse] olarak çağrılmalıydı.

FIGURE6


Compiler'ın içine yerleştirdiğim gerçek bug, UNIX
''login'' [UNIX işletim sistemindeki hesaba username ve password ile
giriş yapılan komut] komutundaki kaynak koda benzeyecekti. Yerini
alan kod login komutunu hatalı derleyeceğinden dolayı tasarlanmış
kriptolu şifreyi veya özel bilinen şifreden birini o kabul
edecekti. Böylece eğer bu kod binary'de kurulduysa ve binary
“login” komutunu derlemek için kullanıldıysa, ben
o sistemin içine herhangi bir kullanıcı gibi girebilirdim[log
into].
Böyle bariz kod uzun zaman fark edilmemiş olarak
gitmeyecekti. C compiler'ının kaynak kodunun çok tesadüfi
dikkatli okuması [perusal] bile şüpheleri uyandıracaktı.

FIGURE7


Son adım Figure 7. de gösterilir. Bu
basitçe önceden mevcut olan birine ikinci Truva atı
(Trojan horse) ekler. İkinci örnek C compiler'ını nişan alır.
Yerini alan kod Truva atıyla beraber compiler'ın içine
yerleştirilen Bölüm I kendi kaynak kodunu üreten
(self-reproducing ) programdır. Bu Bölüm II'de olduğu gibi
bir öğrenme safhası gerektirir. Önce bir gedikli binary
[bugged binary] üretebilmek için modifiye edilmiş kaynak
kodu normal C compiler ile derleriz. Bu binary'i resmi C olarak
kurarız. Şimdi compiler'ın kaynak kodundan bug'ları kaldırabiliriz ve
yeni binary ne zaman derlenirse bug'ı içine yerleştirir. Tabi
ki, login komutu kaynak kodun hiçbir yerinde iz bırakmadan
gedikli [bugged] kalacak

Kıssadan Hisse

Kıssadan hisse açıktır. Tamamen kendinin yaratmadığı koda
güvenemezsin. (Bilhassa kod, benim gibi insanları çalıştıran
şirketlerinse ). Kaynak kod düzeyinde doğrulama veya inceleme
güvenilmeyen kodu kullanmadan seni korumayacak. Saldırının bu
çeşit olanağını göstermekte, ben C compiler'ında seçtim.
Herhangi bir programı seçebilirdim-ele alınan program bir
assembler, bir yükleyici [loader] veya hatta donanım mikrokodu
[hardware microcode; Bilgisayarın devre düzeyi ve makine
talimatı arasında tercüme tabakası gibi davranan
“microprogram”dır. “Mikrokodu” yazmak
“mikroprogramlama” olarak adlandırılır.] Program daha çok
düşmesi derecesince, bu bug’ları tespit etmek zorlaştıkça
zorlaşacak. İyi yerleştirilmiş mikrokod[microcode] bug’ı tespit
etmek hemen hemen imkansız olacak.
Sizi güvenilemeyeceğime ikna etmeyi denedikten sonra, Ahlaki
yönden açıklamak isterim
. 414 çetesi,
Dalton çetesi vb. “hacker”ların el ele vermesinde
basını eleştirmek istiyorum. Bu çocukların gösterdiği
davranışlar olsa olsa vandalizm [yıkıcılık] ve muhtemelen günah
ve en kötü ihtimalle hırsızlıktır. Hacker’ları ciddi
adli kovuşturmalardan koruyan sadece
suçlu kodun [criminal code; cezalı
suçlara ilişkin bir ulusun
kanunları taslağını hazırlayan hükumet kanunlarının bir
derlemesidir ve böyle suçlar işlendiğinde mahkemelerin
suçluya zorla kabul ettirdikleri maksimum ve minimum
cezalardır.]
yetersizliğidir. Bu faaliyete karşı savunmasız
[vulnerable] olan şirketler (ve çok büyük şirketler
çok savunmasızdır) suçlu kodun güncellenmesini zor
yayınlıyorlar. Bilgisayar sistemlerine yetkisiz girişim bir kaç
eyalette çoktan beri ciddi bir suçtur ve günümüzde
daha fazla eyalet yasama meclislerinde Millet Meclisi’ndeki[Congress;
(US) Millet Meclisi -seçimle işbaşına gelmiş yasa yapıcı
organı Senato ve Temsilciler Meclisi'nden oluşur- ] kadar iyi bir
şekilde hitap ediliyor.

Bir patlayıcı durum hazırlığı vardır. Bir elde, basın, televizyon,
ve sinemalar onlara ilerlemekte olan başarılı gençler[whiz
kids] diye hitap
ederek yıkıcı-vahşi- kahramanlar[heroes of vandals] meydana
getirmektedirler. Diğer elde bu çocukların gösterdiği
davranışlar yakın bir zamanda hapishanede yıllara kadar
cezalandırılabilir olacak.

Congress doğrulamadan
önce ben çocukları izledim.
Davranışlarının
ciddiyetinden tam anlamıyla habersiz oldukları aşikardır. Açıkça
kültürel bir boşluk vardır. Bir bilgisayar sistemini
kırarak girme davranışı bir komşunun evini kırıp girme gibi aynı
sosyal lekeye sahip olmak zorundadır
.
Komşunun kapısı kilitsiz olması bir sorun teşkil etmemelidir. Basın,
yanlış yere yönlendirilmiş bir bilgisayar kullanımının bir
otomobilin sarhoş sürülmesinden daha fazla şaşırtıcı
olmadığını öğrenmelidir.

Sonuç

İlk kez Multics’in[multiplexed information computing system.
MIT'de geliştirilmiş ve mutliuser, multitasking ve device files gibi
kavramları barındıran ilk işletim sistemi.] eski uygulamasının
güvenliğinin bir Hava Kuvvetleri kritiğinde böyle bir Truva
atı’nın[Trojan hourse] olma olasılığını okudum. Bu dokumana
daha fazla bir özel örnek bulamam. Eğer
bu referansı sağlayan her hangi bir kimse bana bilmem için
izin verecek idiyse, onu takdir etmek isterdim.

Referanslar

  1. Bobrow, D.G., Burchfiel, J.D.,
    Murphy, D.L., and Tomlinson, R.S. TENEX, a paged time-sharing system
    for the PDP-IO. Commun. ACM 15, 3 (Mar. 1972), 135-143.
  2. Kernighan, B.W., and Ritchie, D.M.
    The C Programming Language. Prentice-Hall, Englewood Cliffs, N.J.,
    1978.
  3. Ritchie, D.M., and Thompson, K.
    The UNIX time-sharing system. Commun. ACM 17, 7(July 1974), 365-375.
  4. 4. Unknown Air Force Document.

3 yorum:

Kemal Güvenli dedi ki...

Açık kaynak kodun önemi şimdi daha iyi anlaşılıyor.

Adsız dedi ki...
Bu yorum bir blog yöneticisi tarafından silindi.
Kemal Güvenli dedi ki...

Yılar sonra edit: Evet çok kötü çevirmişim. Daha iyisini bulursanız ondan okuyun.