Ken Thompson'ın derleyicisi kesmek hala bir tehdit midir?


156

Ken Thompson Hack (1984)

Ken Thompson, 1984'te bir derleyici ikilisini (ve bir * nix sistemindeki bir giriş betiği gibi diğer derlenmiş yazılımları) bozmak için bir yöntem belirledi. Modern derlemenin bu güvenlik açığını ele alıp almadığını merak ettim.

Kısa Açıklama:

Derleyici kodunu 2 hata içerecek şekilde yeniden yazın:

  • Kendi ikili kodunu derlerken, derleyici bu kusurları derlemelidir.
  • Başka önceden seçilmiş bir kod (giriş işlevi) derlerken, bazı isteğe bağlı arka kapıları derlemelidir.

Bu nedenle, derleyici normal çalışır - bir oturum açma komut dosyası veya benzerlerini derlediğinde, bir güvenlik arka kapısı oluşturabilir ve gelecekte kendisinin daha yeni sürümlerini derlediğinde, önceki kusurları korur - ve kusurlar yalnızca derleyicide bulunur İkili bu yüzden tespit etmek son derece zordur.

Sorular:

İnternette bunlara cevap bulamadım:

  • Bu tam zamanında derleme ile nasıl ilişkilidir?
  • Bir * nix sistemindeki program işleme girişleri gibi işlevler çalıştırıldıklarında derlendi mi?
  • Bu hala geçerli bir tehdit mi, yoksa 1984'ten bu yana önemli bir sorun olmasını engelleyen derleme güvenliğinde gelişmeler oldu mu?
  • Bu tüm dilleri etkiler mi?

Neden bilmek istiyorum

Biraz ev ödevi yaparken buna rastladım ve ilginç görünüyordu, ancak bunun güncel bir mesele mi yoksa çözülmüş bir mesele mi olduğunu somut bir şekilde anlayabilmem için arka planım yok.

Referans malzemesi


6
Farklı Çift Derleme stratejisi, bir RoTT donanımlı derleyicinin varlığını tespit etmenin makul derecede güvenilir bir yoludur.
dmckee

3
NSA'nın bu tür bir saldırı için çok fazla çaba harcadığını hayal ediyorum.
Paul M,

Yanıtlar:


110

Bu hack bağlam içinde anlaşılmalıdır. Her zaman ve farklı donanımlarda çalışan Unix'in baskın sistem olduğu bir zamanda ve bir kültürde yayınlandı.

Ne saldırısı kadar korkutucu yapılan C derleyicisi olmasıydı bu sistemler için yazılım merkez parçası. Sistemdeki hemen hemen her şey ilk takıldığında derleyiciden geçti (heterojen donanım nedeniyle ikili dağılımlar nadirdi). Herkes her zaman bir şeyler derledi. İnsanlar düzenli olarak kaynak kodunu denetlediler (çoğu zaman derlemek için ayarlamalar yapmak zorunda kalıyorlardı), bu nedenle derleyicinin arka kapağa enjekte etmesi, yakalanamayacağınız bir tür "mükemmel suç" senaryosu gibi görünüyordu.

Günümüzde donanımlar çok daha uyumludur ve bu nedenle derleyiciler bir sistemin günlük çalışmasında daha küçük bir role sahiptir. Tehlikeli bir derleyici artık en korkutucu senaryo değil - rootkitler ve tehlikeli bir BIOS'un tespit edilmesi ve kurtulması daha da zor.


27
Veya, çoğu insan kaynağından hiçbir şey derlemediği için (Windows’ta), ortalama bir trojan yeterli olacaktır :) (ödün verilmiş bir derleyicinin çok fazla abartılı olduğuna katılıyorum)
Andres F.

16
@ArjunShankar: Özgür olmayan bir tescilli sadece ikili ikili derleyicinin bu arka kapıya ihtiyacı yoktur ve olamaz . Bu arka kapı yalnızca kaynak kodundan derlediğiniz derleyiciler için geçerlidir.
Ocak'ta 13:13

12
Masaüstü hariç, Unix ve tüm varyantları hâlâ hakim işletim sistemidir.
Rob

7
@ruakh: belki 'bu' vurgunuzu anlamıyorum, ama ben aynı fikirde değilim. Bu arka kapı, serbest olmayan, mülk sahibi derleyiciye sahip olan ve aynı derleyicinin yeni sürümlerini derlemek için bu derleyiciyi kullanan şirkette tanıtıldıysa, bu arka kapının orijinal senaryoda olduğundan çok daha kötü bir etkisi olacaktır. Hepsine bulaştırmak için sadece bir saldırı vektörüne ihtiyacınız olacak.
orithena

8
Birinin bir ubuntu derleme sunucusundan ödün verdiğini ve herhangi bir kaynağı değiştirmeden derleyiciyi değiştirdiğini hayal edin. Bunun anlaşılması biraz zaman alabilir ve o zamana kadar ubuntu görüntüleri, içine yerleştirilmiş tehlikeye girmiş derleyici ile (herkese açık oturum açma meclisleri ya da neye sahip olduğunuzla birlikte) insanlara dağıtılırdı. Bunun hala geçerli bir endişe olduğunu düşünüyorum.
Jimmy Hoffa,

74

Bu konuşmanın amacı, ele alınması gereken bir kırılganlığı vurgulamak ya da bilmemiz gereken teorik bir kırılganlık önermek değildi.

Amaç, güvenlik söz konusu olduğunda, kimseye güvenmek istemememiz gerektiğiydi, ama ne yazık ki bu imkansız. Her zaman birine güvenmek zorundasın (bu yüzden başlık: "Güvene İlişkin Düşünceler")


Masaüstü sabit diskini şifreleyen ve kendi derlemediğiniz herhangi bir yazılımı çalıştırmayı reddeden paranoyak bir tür olsanız bile, işletim sisteminize güvenmeniz gerekir. İşletim sistemini kendiniz derleseniz bile, kullandığınız derleyiciye güvenmeniz gerekir. Hatta Ve eğer kendi derleyici derlemek, sen hala güven gerekiyor o derleyici! Ve bu donanım üreticilerinden bile bahsetmiyor!

Sadece güveninle kaçamaz kimse . Karşılaştığı nokta bu işte.


2
Birinin davranışı herhangi bir uygulama tarafından tanımlanmış veya tanımlanmamış davranışa bağlı olmayan açık kaynaklı bir derleyiciye sahipse, onu bağımsız olarak geliştirilmiş çeşitli derleyiciler kullanarak derler (güvenilir ya da değil) ve ardından farklı derlenmiş tüm sürümlerini kullanarak bir program derler. Bu açık kaynaklı olanı, her derleyici tam olarak aynı çıktıyı üretmelidir. Eğer öyle yaparlarsa, bu bir trojanın bir arada olabileceği tek yolun aynı şekilde olması halinde olacağı anlamına gelir. Bu pek mümkün görünmüyor. Net, çok, benim ağrılarımdan biri ...
supercat

9
@supercat: Noktayı kaçırıyor gibisiniz. Ken Thompson’ın sunduğu hack’in çalışabileceğini söylüyorsunuz. Seçtiği kesmenin önemli olmadığını söylüyorum; bu sadece bir örnekti, daha büyük bir noktayı her zaman birine güvenmeniz gerektiğini göstermek . Bu yüzden bu soru biraz anlamsız - ağaçlar için ormanı tamamen özlüyor.
BlueRaja - Danny Pflughoeft

9
@supercat: Farklı derleyicilerin farklı tasarım kararları, optimizasyonları vb. nedeniyle önemsiz herhangi bir program için aynı bytecode üretmeleri pek olası değil.
Ankit Soni,

1
@AnkitSoni: Cevabım daha fazla ayrıntıya giriyor. Uygun şekilde yazılmış bir açık kaynaklı derleyiciye / bağlayıcıya farklı derleyicilerden beslemek, aynı şekilde davranacak farklı çalıştırılabilirler vermelidir . Yürütülebilirler aslında aynı davranırsa, açık kaynak derleyici / linker için kod geçilirse aynı çıktıyı üretecektir. Dosyaları karşılaştırmak için, bir diskete kopyalanabilir ve bunları karşılaştırmak için antika bir bilgisayar kullanılabilir.
Süpermen

2
Bu konuşmanın bir kısmı, test ettiğiniz şeyler için, ikili dosyalar / donanımın beklendiği gibi davrandığı anlamına gelmez mi? Hala test etmediğiniz ve farkında olmadığınız bir şey olabilir .
Bart Silverstrim

53

Hayır

Başlangıçta tarif edildiği gibi saldırı asla bir tehdit değildi. Bir derleyici bunu teorik olarak yapabilirken, gerçekte saldırıyı kaldırmak derleyicinin programlanmasını gerektirir.

  • Derlenmekte olan kaynak kodun bir derleyicide olduğu zamanları ve
  • Korsanlığı içine eklemek için isteğe bağlı kaynak kodunu nasıl değiştireceğinizi öğrenin.

Bu, derleyicinin kaynak kodundan nasıl çalıştığını, bozulmadan değiştirebilmesi için nasıl çalıştığını anlamayı gerektirir.

Örneğin, linkleme formatının veri uzunluklarını veya derlenmiş makine kodunun ofsetini yürütülebilir bir yerde sakladığını hayal edin. Derleyicinin, bunlardan hangisinin ve hangisinin istismar yükünü yerleştirirken güncellenmesi gerektiğine karar vermesi gerekecektir. Derleyicinin sonraki sürümleri (zararsız sürüm) bu biçimi keyfi olarak değiştirebilir; bu nedenle, yararlanma kodunun bu kavramları etkili bir şekilde anlaması gerekir.

Bu yüksek seviyeli, kendi kendini yönlendiren bir programlama, zorlu bir AI problemi (en son kontrol ettiğimde, sanatın türü, pratikte türleri tarafından belirlenen bir kod üretiyordu). Bakın: birkaç insan bunu bile yapabilir; önce programlama dilini öğrenmeli ve ilk önce kod temelini anlamalısınız.

AI problemi çözülse bile, insanlar minik derleyicilerini derlemenin ona bağlı devasa bir AI kütüphanesiyle bir ikili olarak sonuçlanıp sonuçlanmadığını fark edeceklerdir.

Benzer saldırı: bootstrapping güven

Ancak, saldırının genelleştirilmesiyle ilgilidir. Temel sorun, güven zincirinizin bir yerden başlaması gerektiğidir ve birçok alanda kökeni, tüm zinciri tespit edilmesi zor bir şekilde altüst edebilir.

Gerçek hayatta kolayca çıkarılabilecek bir örnek

Ubuntu Linux işletim sisteminiz, indirilen güncelleme paketlerini havuzun imzalama anahtarına (genel anahtar şifrelemesi kullanarak) karşı kontrol ederek güncellemelerin güvenliğini sağlar. Ancak bu, yalnızca imzalama anahtarının yasal bir kaynağa ait olduğunu kanıtlamanız durumunda güncellemelerin orijinalliğini garanti eder .

İmza anahtarını nereden aldın? İşletim sistemi dağıtımını ilk indirdiğinizde.

Güven zincirinizin kaynağının, bu imzalama anahtarının kötü olmadığına güvenmelisiniz.

Sizinle Ubuntu indirme sunucusu arasındaki İnternet bağlantısını MITM yapabilen herhangi biri - bu ISS'niz olabilir, İnternet erişimini kontrol eden bir hükümet (örneğin Çin) veya Ubuntu'nun hosting sağlayıcısı bu işlemi kaçırmış olabilir:

  • Ubuntu CD görüntüsünü indirdiğinizi tespit edin. Bu basittir: talebin (genel olarak listelenen) Ubuntu aynalarından herhangi birine gideceğini ve ISO görüntüsünün dosya adını istediğini görün.
  • İsteği kendi sunucularından göndererek size saldırganın ortak anahtarını ve Ubuntu yerine depo konumunu içeren bir CD görüntüsü verin.

Bundan böyle, güncellemelerinizi saldırganın sunucusundan güvenli bir şekilde alacaksınız. Güncellemeler kök olarak çalışır, böylece saldırganın tam kontrolü vardır.

Orijinalin orijinal olduğundan emin olarak saldırıyı önleyebilirsiniz. Ancak bu, indirilen CD görüntüsünü bir karma kullanarak doğrulamanızı gerektirir ( birkaç kişi bunu gerçekten yapar ) - ve hash'in kendisi, örneğin HTTPS üzerinden güvenli bir şekilde indirilmesi gerekir. Eğer saldırganınız bilgisayarınıza bir sertifika ekleyebilir (şirket ortamında yaygın olarak bulunur) veya bir sertifika yetkilisini (örneğin Çin) denetlerse, HTTPS bile koruma sağlamaz.


47
Bu yanlış. Derleyici yalnızca o derleme değilken, çok özel içeriği ile kendi kaynak kodundan çok özel kaynak dosyası derleme zamanı belirlemek zorundadır herhangi olursa olsun derleyici !!!
Kaz

14
@Kaz - Bir noktada, derleyici veya oturum açma programındaki yukarıdaki değişiklikler, arka kapının derleyici tanıyıcı / oturum açma tanıyıcıyı yendikleri noktaya gelebilir ve sonraki yinelemeler arka kapıyı kaybeder. Bu, bazı hastalıklara bağışıklık sağlayan rastgele bir biyolojik mutasyona benzer.
Russell Borogove

12
Cevabınızın ilk yarısında, Kaz'ın tanımladığı bir sorun var, ancak ikinci yarıda o kadar iyi ki, yine de + 1'leyeceğim!
Ocak'ta

7
Sadece kendi kaynağını tanıyan kötü bir derleyicinin oluşturulması kolaydır, ancak pratikte göreceli olarak değersizdir - zaten bu derleyicinin ikilisine sahip olan birkaç kişi, söz konusu ikili dosyayı yeniden oluşturmak için kullanır. Saldırının daha uzun bir süre boyunca başarılı olması için, derleyicinin kendi kaynağının yeni sürümlerini yamalamak için daha fazla zekaya ihtiyacı olacak, böylece snswer'de açıklanan sorunlara rastlanacak.
user281377

5
Belirli bir derleyici için bir tanıyıcı oldukça genel olabilir ve yeni sürüm karşısında zorlanma olasılığı düşük olabilir. Örneğin gcc'yi kullanın - gcc'deki birçok kod satırı çok eski ve çok fazla değişmedi. Adı gibi basit şeyler neredeyse hiç değişmez. Tanıma ters gitmeden önce, enjekte edilen kodun yapması muhtemeldir. Ve gerçekte, bu sorunların her ikisi de büyük ölçüde teoriktir - pratikte kötü amaçlı bir yazılım derleyicisinin (yavaş) gelişme hızına ayak uyduramaz.
Eamon Nerbonne

25

İlk olarak, bu hack'le ilgili en sevdiğim yazımın adı Strange Loops .

Bu belirli kesmek kesinlikle (*) bugün herhangi bir büyük açık kaynaklı işletim sistemi projesinde, özellikle Linux, * BSD ve benzerlerinde yapılabilir. Neredeyse aynı şekilde çalışacağını umuyorum. Örneğin, openssh'ı değiştirmek için sömürülen bir derleyiciye sahip FreeBSD'nin bir kopyasını indirirsiniz. O andan itibaren openssh veya derleyiciyi kaynağa göre her güncellediğinizde soruna devam edeceksiniz. Saldırganın FreeBSD'yi ilk sırada paketlemek için kullanılan sistemden yararlandığını varsayalım (muhtemelen, görüntü bozuksa veya saldırgan aslında paketleyiciyse), o zaman sistem FreeBSD ikili dosyalarını yeniden oluşturduğu zaman, sorunu reddedecektir. Bu saldırının başarısız olması için birçok yol var, ancak Ken'in saldırısının nasıl başarısız olabileceğinden temelde farklı değiller (**). Dünya gerçekten bu kadar değişmedi.

Elbette, benzer saldırılar sahipleri tarafından Java, iOS SDK, Windows veya başka herhangi bir sisteme kolayca veya daha kolay enjekte edilebilir. Bazı güvenlik kusurları donanıma bile dahil edilebilir (özellikle rasgele sayı oluşumunu zayıflatır).

(*) Ama "kesinlikle" demek istediğim "pricinciple". Herhangi bir sistemde bu tür bir delik bulunmasını mı beklemelisiniz? Hayır. Çeşitli pratik nedenlerden dolayı pek olası değildir. Zamanla, kod değiştikçe ve değiştikçe, bu tür bir kesmenin garip hatalara neden olma olasılığı artar. Ve bu keşfedilme ihtimalini arttırıyor. Daha az zeki arka kapılar, komploların sürdürülmesini gerektirir. Elbette, çeşitli telekomünikasyon ve ağ sistemlerinde "yasal yollara müdahale etmenin" arka kapıların yerleştirilmiş olduğu gerçeğini biliyoruz, bu nedenle çoğu durumda bu tür ayrıntılı bir kesmek gereksizdir. Kesmek açıkça takılır.

Yani her zaman, derinlemesine savunma.

(**) Ken'in saldırısının gerçekten var olduğunu varsayarsak. O sadece nasıl ele verebilir yapılabilir. Aslında bildiğim kadarıyla yaptığını söylemedi.


İkinci dipnotunuzla ilgili olarak, Ken "inşa et ve dağıtılmadı"
8,

15

Bu tüm dilleri etkiler mi?

Bu saldırı öncelikle kendi kendini barındıran dilleri etkiler. Derleyicinin dilin kendisinde yazıldığı diller. C, Squeak Smalltalk ve PyPy Python yorumlayıcısı bundan etkilenecektir. Perl, JavaScript ve CPython Python tercümanı olmaz.

Bu tam zamanında derleme ile nasıl ilişkilidir?

Çok değil. Hackerin gizlenmesini sağlayan derleyicinin kendi kendini barındırma niteliğidir. Herhangi bir kendi kendine barındırma JIT derleyicisini bilmiyorum. (Belki LLVM?)

Bir * nix sistemindeki program işleme girişleri gibi işlevler çalıştırıldıklarında derlendi mi?

Genellikle değil. Ama soru değil ne zaman o derlenmiş, ancak hangi derleyici tarafından . Giriş programı, etiketli bir derleyici tarafından derlenirse, etiketlenecektir. Temiz bir derleyici tarafından derlenirse temiz olur.

Bu hala geçerli bir tehdit mi, yoksa 1984'ten bu yana önemli bir sorun olmasını engelleyen derleme güvenliğinde gelişmeler oldu mu?

Bu hala teorik bir tehdittir, ancak pek olası değildir.

Azaltmak için yapabileceğiniz bir şey, birden çok derleyici kullanmaktır. Örneğin, kendisi GCC tarafından derlenen bir LLVM Derleyicisi bir arka kapıdan geçmeyecektir. Benzer şekilde, LLVM tarafından derlenen bir GCC arka kapıdan geçmeyecektir. Yani, bu tür bir saldırı için endişeleniyorsanız, derleyicinizi başka bir derleyici türü ile derleyebilirsiniz. Bu, kötü niyetli bilgisayar korsanının (işletim sistemi satıcınızda?) Her iki derleyiciyi de birbirlerini tanıması için bağlamak zorunda kalacağı anlamına gelir; Çok daha zor bir problem.


Son paragrafınız kesinlikle konuşmuyor. Teoride, kod derleyicinin derlendiğini algılayabilir ve arka kapıyı uygun şekilde çıkarabilirdi. Bu elbette gerçek dünyada pratik değildir, ancak onu engelleyen hiçbir şey yoktur. Ama sonra, asıl fikir gerçek pratik tehditler ile ilgili değil, güven içinde bir dersle ilgiliydi.
Steven Burnap,

Doğru tespit. Sonuçta, hack oturum açma için bir arka kapı boyunca ve derleyici için bir mod taşır, böylece başka bir derleyici için de bir mod taşıyabilir. Ancak giderek daha az olası hale geliyor.
Sean McMillan

Tam zamanında derleme bir tedavi olabilir. Bazı kodların yalnızca belirli bir parça JIT derlendiğinde güvenlik açığı varsa, fark edilmeyebilir. (sadece saf
tory

12

Bunun gerçekleşmesi için teorik bir şans var. Bununla birlikte, David A. Wheeler'ın Diverse çift derlemesi aracılığıyla belirli bir derleyicinin (mevcut kaynak koduyla birlikte) tehlikeye atılıp atılmadığını kontrol etmenin bir yolu vardır .

Temel olarak, şüpheli derleyicinin kaynağını derlemek için hem şüpheli hem de bağımsız olarak geliştirilen başka bir derleyiciyi kullanın. Bu size SC sc ve SC T verir . Şimdi, şüpheli kaynağı her iki ikili dosyayı da kullanarak derleyin. Sonuçta ortaya çıkan ikili dosyalar aynıysa (çeşitli zaman damgaları gibi yasal olarak değişken olabilecek çeşitli şeyler hariç), şüpheli derleyici aslında güveni kötüye kullanmadı.


Ya o ya da güvenilir derleyici, kullanıcının düşündüğü kadar güvenilir değildir. Ancak bir dilin iki bağımsız uygulaması için, aynı arka kapıyı içerme olasılığı önemsizdir.
Damian Yerrick

Veya bunları karşılaştırmak için kullandığınız diff aracı da tehlikeye
girdi

@ kennycoc Bununla birlikte, "bu iki dosya aynıdır" yazarken karşılaştırma aracı düşünülmez, her şey düşünülmez, o kadar zor değildir (bir sistem çağrısı referansı verildiğinde, ikili makine kodunda 2-16 saat içinde yapılabilir olmalıdır).
Vatine

3

Belirli bir saldırı olarak, şimdiye kadar olduğu gibi bir tehdit, bu da neredeyse hiç tehdit değil.

Bu tam zamanında derleme ile nasıl ilişkilidir?

Ne demek istediğinden emin değilim. Bir JITter buna bağışıklık kazanıyor mu? Hayır. Daha savunmasız mı? Pek sayılmaz. Bir geliştirici olarak YOUR uygulamanız daha savunmasızdır, çünkü yapıldığını doğrulayamazsınız. Henüz geliştirilmemiş uygulamanızın temelde bu ve tüm pratik varyasyonlara karşı bağışıklık kazandığını, yalnızca kodunuzdan daha yeni bir derleyici için endişelenmeniz gerektiğini unutmayın.

Bir * nix sistemindeki program işleme girişleri gibi işlevler çalıştırıldıklarında derlendi mi?

Bu gerçekten alakalı değil.

Bu hala geçerli bir tehdit mi, yoksa 1984'ten bu yana önemli bir sorun olmasını engelleyen derleme güvenliğinde gelişmeler oldu mu?

Gerçek bir derleme güvenliği yoktur ve olamaz. Bu onun konuşmasının asıl meselesiydi, bir noktada birine güvenmelisin.

Bu tüm dilleri etkiler mi?

Evet. Temel olarak, bir süre veya başka bir durumda, talimatlarınız bilgisayarın tükettiği bir şeye dönüştürülmelidir ve bu çeviri yanlış yapılabilir.


-2

David Wheeler'ın iyi bir makalesi var: http://www.dwheeler.com/trusting-trust/

Ben daha çok donanım saldırıları konusunda endişeliyim. FLOSS kaynak kodlu, tamamen kendimizi değiştirip derleyebildiğimiz, aletlerin arka kapağına yerleştirilmemiş bir mikroişlemci yapmamıza izin veren tamamen VLSI tasarım araç zincirine ihtiyacımız olduğunu düşünüyorum. Araçlar aynı zamanda çip üzerindeki herhangi bir transistörün amacını anlamamıza yardımcı olmalıdır. Daha sonra bitmiş cipslerin bir örneğini açabilir ve bir mikroskopla kontrol edebiliriz, böylece aletlerin sahip olması gereken aynı devreye sahip olduklarından emin olabiliriz.


3
-1, cevabınızın büyük kısmı soruyu çözmekte başarısız oluyor.

-3

Son kullanıcıların kaynak koduna erişimi olan sistemler, bu tür saldırıları gizlemek zorunda kalacağınız sistemlerdir. Bunlar bugünün dünyasında açık kaynaklı sistemler olacaktır. Sorun şu ki, tüm Linux sistemleri için tek bir derleyiciye bağımlılık olsa da, saldırının tüm Linux dağıtımları için yapı sunucularına girmesi gerekecek. Bunlar derleyici ikili dosyalarını her derleyici sürümü için doğrudan indirmediklerinden, saldırının kaynağı derleyicinin en az bir önceki sürümünde derleme sunucularında olmalıydı. Bu ya da derleyicinin bir ikili dosya olarak indirdikleri ilk versiyonunun tehlikeye atılması gerekirdi.


2
Cevabınız sorunun yüzeyinde çiziktir, ancak gerçekten sorulanı ele almaz.

-4

Biri, çıkarılan kaynak dosyalarının içeriğinden başka bir şeye bağlı olmaması gereken bir derleyici / derleme sistemi için kaynak koduna sahipse ve biri birkaç derleyiciye sahipse ve hepsinin aynı derleyici kesmesini içermediğini biliyorsa, biri birinin kaynak kodundan başkasına bağlı olmayan bir çalıştırılabilir dosya aldığından emin olun.

Birinin bir derleyici / linker paketi için (örneğin, Groucho Suite) kaynak kodunun çıktılarının belirtilmemiş davranışlara ve girdi kaynak dosyalarının içeriğinden başka hiçbir şeye bağlı olmayacak şekilde yazıldığını varsayalım. bağımsız olarak üretilen çeşitli derleyiciler / linker paketlerini kodlayan linkler (Harpo Suite, Chico suite ve Zeppo Suite), her biri için farklı bir açılabilir dizi oluşturur (G-Harpo, G-Chico ve G-Zeppo). Bu çalıştırılabilirlerin farklı komut dizileri içermesi beklenmez, ancak işlevsel olarak aynı olmalıdırlar. Bununla birlikte, bunların tüm durumlarda fonksiyonel olarak aynı olduklarını kanıtlamak, muhtemelen anlaşılmaz bir problem olacaktır.

Neyse ki, böyle bir kanıt sadece sonuçtaki çalıştırılabilirleri tek bir amaç için kullanırsa: Groucho takımını tekrar derlemek gerekmeyecek. Eğer biri G-Harpo'yu (GG-Harpo'yu veren), G-Chico'yu (GG-Chico) ve G-Zeppo'yu (GG-Zeppo) kullanarak, Groucho takımını derlerse, sonuçta ortaya çıkan her üç dosya da, GG-Harpo, GG-Chico ve GG-Zeppo, tüm baytlar için aynı bayt olmalıdır. Eğer dosyalar eşleşirse, herhangi birinde bulunan herhangi bir "derleyici virüsü" nin hepsinde aynı olması gerektiği anlamına gelir (her üç dosyanın da byte bayt için aynı olması nedeniyle, davranışlarının hiçbir şekilde farklılık göstermesi mümkün değildir) yön).

Diğer derleyicilerin yaşına ve soylarına bağlı olarak, böyle bir virüsün içlerinde makul bir şekilde bulunamamasını sağlamak mümkün olabilir. Örneğin, biri 1980'lerde yazılmış olan bir MPW sürümüyle 2007'de sıfırdan yazılmış bir derleyiciyi beslemek için antika bir Macintosh kullanıyorsa, 1980'lerin derleyicileri 2007 derleyicisinde bir virüsün nereye yerleştirileceğini bilemez. Bugün bir derleyicinin bunu anlamak için yeterince kod analizi yapması mümkün olabilir, ancak böyle bir analiz için gereken hesaplama düzeyi, kodu basitçe derlemek için gereken hesaplama seviyesini çok fazla aşar ve çok fazla fark edilmezdi. Derleme hızının önemli bir satış noktası olduğu bir pazarda.

Üretilecek bir yürütülebilir dosyadaki baytların, sunulan kaynak dosyalarının içeriğinden başka hiçbir şeye bağlı olmaması gereken bir derleme araçlarıyla çalışıyorsa, bir Thompson'dan makul derecede iyi bir bağışıklık elde etmenin mümkün olduğunu söyleyebilirim. tarzı virüs. Ne yazık ki, bazı nedenlerden dolayı, derlemedeki determinizmsizlik bazı ortamlarda normal olarak görülüyor. Çok işlemcili bir sistemde, bir kod parçasının belirli bir iş parçasının hangisinin bir iş parçasını bitirdiğine bağlı olarak değişmesine izin verilirse, derleyicinin daha hızlı çalışmasının mümkün olabileceğini kabul ediyorum.

Öte yandan, derleyicilerin / bağlayıcıların çıktının yalnızca kaynak dosyalara ve kullanıcı tarafından geçersiz kılınabilecek bir "derleme tarihine" bağlı olduğu bir "kanonik çıktı" modu sunmaması için herhangi bir neden gördüğümden emin değilim. . Böyle bir modda kod derlemek normal derlemenin iki katı sürse bile, bayt için herhangi bir "sürüm oluşturma", bayt için, tamamen kaynak malzemelerden, tamamen kaynak malzemelerden yeniden oluşturabilmek için önemli bir değer olacağını öneririm. sürüm oluşturma sürümleri "normal sürümler" den daha uzun sürer.


2
-1. Cevabınızın sorunun temel yönlerini nasıl ele aldığını anlamıyorum.

@ GlenH7: Birçok eski derleme aracı, bit-özdeş girdi verildiğinde ( bir "resmi" derleme zamanı bildirmek için çimdiklenebilecek olan TIME dışında) bittiğinde girdi-çıktıyı tutarlı bir şekilde üretir . Bu tür araçları kullanarak, biri derleyici virüslerine karşı oldukça iyi koruyabilir. Bazı popüler gelişim çerçevelerinin “deterministik” bir derleme kodu sunmadığı gerçeği, eski araçlarda virüslere karşı korunmuş olabilecek tekniklerin yenileriyle etkili bir şekilde kullanılamayacağı anlamına gelir.
supercat,

Bunu denedin mi? 1. Tezinizi yönetin. 2. Daha kısa paragraflar kullanın. 3. "İşlevsel olarak özdeş" (birinci aşamanın sonucu) ve "bit özdeş" (ikincinin sonucu) arasındaki fark, muhtemelen üretilen tüm derleyici ikili dosyalarının bir listesi ve birbirleriyle olan ilişkileriyle ilgili daha açık olun. 4. David A. Wheeler'ın DDC belgesinden alıntı yapın.
Damian Yerrick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.