C derleyicisi sıfırdan nasıl derlenir, sonra Unix / Linux sıfırdan nasıl derlenir


64

Diyelim ki ABD / İngiltere dışındaki büyük bir hizmet kuruluşu için çalışıyorum. UNIX ve Linux sunucularını yoğun olarak kullanıyoruz.

Bu makalenin okunmasıyla, bir C derleyicisine bir arka kapı yerleştirmenin kolay olacağını, daha sonra bu derleyiciyle derlenen herhangi bir kodun bir de arka kapı içereceğini belirtir. Şimdi NSA / GCHQ’nun tüm şifreleme yöntemlerinde, donanım ve yazılımlarda arka / zayıf noktaları koyma yetkisi ile ilgili son sızıntılar göz önüne alındığında, derleyici şimdi kritik bir başarısızlık noktasıdır. Potansiyel olarak tüm standart UNIX / Linix dağıtımları tehlikeye girebilir. Sistemlerimizin, verilerimizin ve müşterilerimizin verilerinin hileli hükümetler tarafından güvence altına alınmasını sağlayamıyoruz.

Bu bilgiler göz önüne alındığında, sıfırdan güvenilir bir derleyici oluşturmak istiyorum, daha sonra bu derleyiciyi kullanarak İşletim Sistemi ve uygulamaları kaynak koddan derleyebilmem için inşa edeceğim güvenli bir tabanım var.

Soru

Derleyiciyi kaynak kodundan derlemeye (görünüşte tavuk yumurtası senaryosuna) ve ardından güvenilir bir Unix / Linux dağıtımını sıfırdan derlemeye devam etmenin doğru (ve güvenli yolu) nedir?

Ben veya başkalarının güvenlik kusurları için kaynak kodunu okuma ve anlama yeteneğine sahip olduğunu varsayabilir, bu nedenle kaynak kod derlemeden önce onaylanır. Asıl peşinde olduğum şey, bu derleyiciyi sıfırdan güvenli bir şekilde üretmek için çalışan bir kılavuzdur ve çekirdeği, işletim sisteminin diğer bölümlerini ve uygulamalarını derlemek için kullanılabilir.

İşletim sistemine veya o yığında çalışan uygulamalara güven duyacaksak, güvenlik yığını temel düzeyde başlatılmalıdır. Evet, derleyiciye kurulurken bir miktar mikro kod ekleyebilecek donanım arka kapıları olabileceğini biliyorum. Şu an için bu konuda yapabileceğimiz bir şey yok, ancak ABD’de tasarlanmamış fişler kullanılması dışında. Şimdi bu katmanı bir başlangıç ​​için sıralayalım ve potansiyel olarak herhangi bir arka kapı takılmadan önce eski bir bilgisayara kurabileceğimi varsayalım.

Bruce Schneier'in dediği gibi: "Mühendisler için şunu söylüyorum: interneti yaptık ve bazılarımız onu altüst etmeye yardımcı olduk. Şimdi özgürlüğü seven bizler onu düzeltmek zorundayız."

Ekstra bağlantılar:


7
Kahretsin, bu çok ilginç bir soru ve onu taşımak istemiyorum ama konunun burada olduğunu sanmıyorum. Temel sorunuz, hemen hemen işletim sistemi için agnostik ve bir programlama sorusu olan sıfırdan bir derleyiciyi nasıl derleyeceğinizden dolayı stackoverflow.com için daha uygundur . Bir süre sonra burada yanıt alamazsanız, sorunuzun etiketlerinin altındaki "flag" bağlantısını kullanın ve bir moderatörden bunu SO'ya taşımasını isteyin.
terdon

2
@terdon Programcılar için daha uygun olabilir. Çünkü belirli bir geliştirme probleminden ziyade genel programlama konularında daha fazladır. Aslında, orada bir kopyası olabilir .
bir CVn

2
GCC açık kaynaktır, herhangi bir arka kapı nasıl yerleştirilir?
Michael Pankov

2
Kararlı Thompson sömürüsünün, oturum açma programı veya derleyici derlenirken tanıyabilecek bir kod gerektirdiğini unutmayın. Kaynağı manuel olarak derleyici tarafından bu programlardan biri olarak algılanamayan bir formata dönüştürürseniz, arka kapı yayılmaz.
Russell Borogove

2
@Constantius - İlk satırda bağlantılı Thompson makalesini okuyun. Derleyiciyi kim derliyor?
Russell Borogove

Yanıtlar:


30

Güvenlikten tamamen emin olmanın tek yolu AFAIK, derleme dilinde bir derleyici yazmak (veya diski doğrudan kendiniz değiştirmek ) olacaktır. Ancak o zaman derleyicinizin arka kapı yerleştirmediğinden emin olabilirsiniz - bu işe yarar çünkü derleyiciyi tamamen ortadan kaldırırsınız.

Buradan, sıfırdan derleyicinizi, örneğin GNU alet zincirini önyüklemek için kullanabilirsiniz. Sonra bir Linux From Scratch sistemini derlemek için özel alet zincirinizi kullanabilirsiniz .

Kendiniz için işleri kolaylaştırmak için, C (veya başka bir dilde yazılmış) yazılmış ikinci bir aracı derleyiciniz olabileceğini unutmayın. Böylece derleyici A'yı derlemede yazacak, sonra derleyiciyi C / C ++ / Python / Brainfuck / içinde derleyici B'yi alacak şekilde yeniden yazacak ve derleyiciyi A kullanarak derleyecektiniz.


13
Buna rağmen, bu hala sadece kötü niyetli bir derleyiciye karşı koruma sağlıyor. Derleyicinin çalıştığı sisteme hala güvenmeniz gerekir. İzolasyonda hiçbir yazılım yoktur.
bir CVn

3
Özerk olan her şey doğal olarak tehlikelidir. Bir takım zinciri derleyicisini (garip olsa da) etkili bir şekilde öneriyorsunuz, yani muhtemelen kaçınmaya çalıştığınız şekilde değiştirilebilir. Daha da iyisi, MitM yoluyla transit geçiş yapılabiliyordu.
Eylül’de

1
Sizler bu cevabın 15 yaşından itibaren geldiğini anlamalısınız. Strugee devam et!
saat

3
Aynı zamanda sıfırdan bir kod editörü yazmayı da unutmamak gerekir - kim önceden derlenmiş <code> vim </code> ya da sadece virüslü bir şekilde denetlediğiniz kaynağından iyi derleyicinizle derlediğinizi <code> vim </code> biliyor mu? <code> vim </code> güvenilir mi?
Hagen von Eitzen

1
Asla unutma ki, bu ilk makine kodunu bizzat yazmadıysanız (montaj. Gerçek makine kodu değil) ve temel güvenlik açılarını tanıma konusunda bir uzman değilseniz ve derlediğiniz her bir kod satırını okuyup kontrol ettiyseniz… o yapan kişi bizzat , ve ona güven bunu yapmak .... Bunların hiçbiri hiç yardımcı olmaz. Bu yüzden bu Kickstarter'ı denemek bütün meseleyi mahvediyor. Hangisi: Yüksek güvenilirlik.
Evi1M4chine

22

Muhtemel bir yol, pratikte oldukça uzun zaman alacak olsa da, köklere geri dönmek olacaktır. GNU’nun gelişimi 1984’de başlamış ve 1987’de, Linux’un ilk açılışında kullanılan orijinal sürümü olan Minix’in 1987’de piyasaya sürülmesi

Bu cevabın tamamı, "[siz] veya başkalarının güvenlik hataları için kaynak kodunu okuma ve anlama yeteneğine sahip olduğundan, bu nedenle kaynak kodun derlenmeden önce ilk önce onaylanacağına" dayanarak, bu tür bir analizin sonucuna güvenebileceğiniz . Bu olmadan, bu cevap muhtemelen değersizdir, çünkü kesinlikle hiçbir fayda için çok fazla zaman harcıyorsunuzdur.

Orijinal Minix kitabının bir kopyasını kaynak koduyla bulabilirseniz, onu kitaptan yazabilirsiniz. Derleyicinin beklenen makine dili ikili çıktısını oluşturduğunu doğrulamak için derleyin ve farklı bir sistemde farklı bir kod çözücü kullanın. (Kod yalnızca 12.000 satırdır, muhtemelen C'dir, bu nedenle bunu yapmak zaman alıcıdır, ancak böyle bir proje için ciddi olmanız durumunda yine de makul bir durumdadır.) Kendi sökme cihazınızı bile yazabilirsiniz; bu çok zor olmamalı.

Elinize geçebileceğiniz GNU yardımcı programlarının en eski sürümlerini kapın (muhtemelen dış kodlara daha az kod ve daha az bağımlılığı olduğu için), kodu gözden geçirin, Minix için oluşturun (bu biraz işe yarayabilir; kesinlikle kaçınmak istemek, kaynak kodunda ayarlamalar yapmaktır, çünkü bu daha sonra hataya açık yama ekleyecektir) ve GNU araçları için benzer bir sökme-doğrulama çevriminden geçecektir. Bu noktada işletim sistemine ve araç zincirine güveniyorsunuz, bu yüzden sadece yama kümesindeki kaynak kodunu gözden geçirmeniz gerekir (yama kümesinde olmayan herhangi bir şey zaten güvenilirdir), ancak araçlar kullandıklarınızla karşılaştırıldığında çok ilkel ve kaba olacak bugüne kadar. Örneğin, çalışan sistem araçlarının en temel işlevlerinden daha fazlasını beklemeyin.XKCD'nin çoğunu okuyun.

Bir noktada, Linux'un bilgisayar korsanları arasında çekiş kazanmaya başladığı 1990'lı yılların başlarında olduğu gibi Linux çekirdeğinin erken bir sürümünü derleyebilecek ve başlatabilecek bir sisteme sahip olacaksınız. Bu noktada Linux'a göç etmeyi öneriyorum (sistem kitaplıklarını ve Linux'a karşı araç zincirini yeniden inşa et, Linux çekirdeğini inşa et, Linux'a aç ve muhtemelen Linux'ta Linux çekirdeğini ve GNU araç zincirini yeniden inşa et; barındırma), ama bu büyük ölçüde size kalmış. Yamaları doğrulamaya, çekirdeği yamalamaya, kütüphaneleri ve temel GNU araçlarını kullanmaya ve modern versiyonlara ulaşana kadar yeniden inşa etmeye devam edin.

İşte o zaman modern bir yazılım oluşturmak için kullanılabilecek güvenilir bir temel işletim sistemi ve derleyici var. O zamana kadar örneğin Linux From Scratch kılavuzlarını, faydalı görevleri gerçekleştirebilecek bir sistem kurmak için takip edebilirsiniz .

Hiçbir zaman "derleyici" sistemi hiçbir zaman bir ağa hiçbir şekilde bağlanamaz (ağa bağlı bir ana bilgisayardaki bir VM dahil); Çekirdeği de dahil olmak üzere herhangi bir ağ özellikli bileşenden geçme riskini alırsınız. Bir Thompson derleyici saldırısı için endişeleniyorsanız , herhangi bir VM sunucusunun da tehlikeye girebileceğini beklemeniz gerekir. Bir şeyler derlediğiniz fiziksel ana makineden kaynak kodunu ve ikili dosyaları almak için sneakernet'i kullanın. En azından USB yığın depolama desteğinin uygulandığı noktaya gelmeden önce sistemde dosya açıp kapatırken sorun yaşamalarını bekleyin. Gerçekten paranoyaksanız, kaynak kodu listelerini yazdırın ve bunları elle yazın (ve yazıcı sürücüsünün ve yazıcının bunlarda benzer kodlara sahip olmadığını umarak) veya bir bilgisayar monitöründeki kodu okuyup, fiziksel olarak yanına ancak bağlı olmayan başka bir bilgisayara yazın.

Evet, bu çok zaman alacak . Ancak bu yaklaşımın avantajı, her adımın artan olmasıdır, bu, pek çok sürümde aşamalı olarak tanıtılmadığı sürece, kötü niyetli herhangi bir şeyin geçmesi daha zor olacağı anlamına gelir; bunun nedeni, her adımdaki değişikliklerin kümesinin nispeten küçük olması ve böylece daha kolay anlaşılmasıdır. Yama setini changelog ile karşılaştırın ve kaynak kodundaki her değişikliğe tam olarak hangi changelog girişinin karşılık geldiğini belirlediğinizden emin olun. Yine, bu, (belki de güvendiğiniz biri aracılığıyla) bu tür değişikliklerin kod tabanına gizlice girmediğini doğrulama yeteneğine sahip olduğunuzu varsaymaktadır, ancak sizi yalnızca bir yazılım dışında güvenilir bir sisteme yaklaştırmalıdır. firmware yaklaşımı olabilir.


Sökme-doğrulama yöntemi çok kusurludur, çünkü doğrulama makinesinin tamamen güvenilir olduğu konusunda büyük bir varsayımda bulunmaktadır. O makineyi ve yazılımını sıfırdan inşa etmediyseniz ya da şahsen ve ona güvenen kişiyi tanımıyorsanız, bu gerçekleşmeyecek. Yani bu hala güvensiz. Üzgünüm. …… Ayrıca, bu konularda “… yakın”, hala tüm noktayı mahvetmek için sadece tek bir güvenilmez nokta gerektirdiğinden “güvensiz” anlamına geliyor.
Evi1M4chine

9

Güvenilir bir derleyiciye ihtiyacınız varsa, compcert projesi gibi akademik çalışmalara bakabilirsiniz . '' Sertifikalı '' olarak tasarlanan INRIA (bir Fransız IT kamu laboratuarı) tarafından oluşturulmuş, yani koda anlamsal olarak kusursuz bir şekilde eşdeğer bir yürütülebilir (ve elbette matematiksel olarak kanıtlanmış) üretmek için tasarlanmış bir derleyicidir.


1
Herkesin güvenilir bir derleyiciye ihtiyacı vardır. Matematik, "güvenilir" bir derleyici oluşturabilecekleri için nasıl çalışır?
David J

@DavidJ Bootstrapping, büyük olasılıkla. Tamamen doğrulayabileceğiniz ve ispatlayabileceğiniz küçük bir parça oluşturun, daha sonra daha karmaşık derleyiciler oluşturmak için bir temel olarak kullanın.
CVn

1
"" "CompCert C'yi diğer tüm üretim derleyicilerinden ayıran, makine destekli matematiksel kanıtlar kullanarak yanlış derleme sorunlarından muaf tutulacak şekilde resmen doğrulanmış olmasıdır." "" Compcert.inria.fr/compcert-C.html Derleme eskisi kadar ampirik değil.
lgeorget

1
@ Muhtemelen derleyici tarafından okuduğumda çekirdek derleyici kaynağına bir arka kapı dahil nedeniyle tehlikeye girebileceğini hesaba katmaz MichaelKjörling
mandalınızı ucube

1
Ayrıca işe yarayabilecek bu bağlantıyı da buldum .
David J

2

Kendi derleyicinizi bir başlangıç ​​noktası olarak el ile oluşturmak en güvenli olurken, başka bir seçenek de bu istismarlar ortaya çıkmadan önce güvendiğiniz 5 (veya 10) yıllık bir kurulum CD'sinden bir sistem kurmaktır. Ardından, denetlenen yeni kaynağı kaynağından derlemek için bunu temel olarak kullanın.


5
Saldırı 1984'ten beri halka açık bir şekilde biliniyor. Muhtemelen Thompson, olasılığı düşünen ilk kişi değildi. O kadar geriye gitmek, bugün kabul ettiğimiz şeylerin çoğunun olmadığı anlamına geliyor; bilgisayarların 20 yıl önce yapabileceklerini düşünün ve mevcut durumları ile karşılaştırın. Orijinal Linux önyükleme sistemi Minix bile ' 87'ye kadar piyasaya sürülmedi ve GNU'nun gelişimi '84'te başladı. Yani teoride bu soruya cevap verirken, pratikte cevap olarak büyük ölçüde işe yaramaz.
bir CVn

2
Potansiyelim elime geçebilecek en eski bilgisayar 286 olacaktı. Büyükannem ve babamın hala elinde olup olmadığını görmek zorundayım.
David J

1
Aslında bunu dikkate aldığın için bonus puan :-). @DavidJ
11684

@ MichaelKjörling: Pek değil; çünkü sadece önyükleme zincirinizi daha uzun yapar. Fakat belki de kendi derleyicinizi sıfırdan makine dilinde yazdığınız sürece değil.
Evi1M4chine
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.