Bir parça kodun rastgele bir yabancıdan derlenmesi ne kadar güvenli? [kapalı]


41

Diyelim ki iş başvurusunda bulunanların becerilerini kanıtlamak için gönderdiği kodları gözden geçiriyorum. Açıkça, gönderdikleri çalıştırılabilir dosyaları çalıştırmak istemiyorum. Açıkçası, kodlarının derlenmesinin sonucunu çalıştırmamayı tercih ederim (örneğin, Java yorumlarda çalıştırılabilir kodu gizlemeye izin verir ).

Ya kodlarını derlemeye ne dersin? Derleyici uyarıları varsa istiyorum, ya da kodları derleyicimden yararlanan bazı akıllı karakter dizileri içeriyorsa ve derleyicim makinemden ödün verirse?

"Derleyici açıkları" için Google’da aldığım isabetlerin tümü derleyici optimizasyonları ve kod emisyonu ve yayılan kodun orijinal kaynak kodun olması gerektiği kadar güvenli olup olmadığı ile ilgilidir.

Akıllıca bir kod parçasını derlerken kullanıcı makinesini tehlikeye atmayacaklarından emin olmak için derleyiciler tipik olarak onaylanır mı? Bir yabancıdan bir kod parçasını derlemek ne kadar güvenli?


40
Sadece sanal bir makine kullanın ...
Florian Margaine 23:15

14
Eğer kodu gerçekten gözden geçiriyorsanız, fark edilmeden “kullanıcı makinesini kilitlemek” kadar zor bir şey bulmak zor olmalı, değil mi?
RemcoGerlich

17
Peki yeteneklerini nasıl değerlendiriyorsun? Bunu soruyorum, çünkü iş başvurusunda bulunanlar tarafından bize gönderilen kodları sık sık gözden geçirdim, ancak her zaman okudum, çalıştırmaya gerek duymadım.
RemcoGerlich

9
Java yorumlarda çalıştırılabilir kodun gizlenmesine izin veriyor. Tüm Java IDE'leri, sözdizimi vurgulaması yaparken unicode dönüşümler yapmaz; bu, uzaktan aynı şey değildir.
Pete Kirkham

68
Kodu bile okuma. Beynindeki bir güvenlik açığından yararlanabilirler.
Henrik

Yanıtlar:


34

Değişir.

Bu makefile parçası ana dizininizi silebilir:

all:
    rm -rf ~

Yani, bir araç (cmake veya makefile sistemi gibi) kullanmanız gerekiyorsa, o zaman güvenli değildir. Sadece kodlayıcının ne kadar kötü niyetli olduğuna bağlı.

Diğer taraftan, derleyiciler insanlar tarafından programlanır, bu nedenle hataları vardır. Bu yüzden, belki de birileri derleme sırasında kötü niyetli kod yürütmenin bir yolunu bulmuş olabilir.

Yorumlarda önerildiği gibi, makinenize komik bir şey yapılmadığından emin olmak istiyorsanız, sanal bir makine kullanın.


32
"sanal bir makine kullanın" - ve gerçekten paranoyaksanız, birden fazla kusurdan yararlanarak kötü amaçlı yazılımların potansiyel olarak VM'nizden çıkabileceğini ve sizi boğabileceğini unutmayın ( venom.crowdstrike.com )
Steve Jessop

23
@SteveJessop evet, iç içe VM'leri daha iyi kullanın;) Muhtemelen kodlayıcı bir VM'den koptuğunu fark etmiyor, o hala diğerinde.
Ruslan

3
Ya da sadece kodu test etmek için eski bir dizüstü bilgisayar kullanın. Ağ yetenekleri olmadığı sürece, kötü amaçlı yazılımın atlamayacağından her zaman emin olursunuz. Yazılım hataları sihirli bir şekilde gerçek hatalara dönüştürülmezse tabii.
Mast

5
@Ruslan: Maalesef çoğu bilgisayar korsanı Başlangıç'ı gördü.
Steve Jessop

2
@Ruslan Bu tam anlamıyla bu sayfadan önce açtığım sekme: matrix.wikia.com/wiki/Matrix_in_a_Matrix_theory , SciFi SE sitesindeki alakasız bir soru nedeniyle okudum.
armani

23

İşin herhangi bir yerinde, belirli bir dil ve derleyici sürümü için böyle bir saldırı yaratan bazı zeki çocuklar olduğundan eminim. Bunun gibi bir şeye bakmak için en sevdiğim yer muhtemelen Uluslararası Şaşırtmalı C yarışması olacaktır - (Java için karşılaştırılabilir bir şey olup olmadığını bilmeyin). Bununla birlikte, gerçekte, riski ne kadar yüksek olarak kabul edersiniz,

  • Başvuran, sizin hakkınızda gerçek bir izlenim bırakmaktadır. Şirketinizdeki işi gerçekten istiyor (dava değil).

  • Adam seninle ne kadar inceleme yaptığını bilmiyor

  • hangi derleyici sürümünü kullandığınızı bilmiyor

  • Sadece güvenli olması için sanal bir ortam veya çevrimiçi derleyici kullanıp kullanmadığınızı bilmiyor

  • Etkili bir şekilde incelenemeyecek kadar büyük programları kabul etmiyorsunuz

  • size şüpheli görünen hiçbir şeyi derlemiyorsunuz

  • Dünyada gerçekte, böyle bir görevi teknik olarak nasıl yerine getireceğini bilen pek çok insan yoktur (ve tek başına googling yapmak, size "önceden bir ref" ya da öğretici olarak vermeyecektir).

Bu nedenle derleme teoride "tamamen güvenli" olmasa da, IMHO gerçekte "derleyicinizin delinmesi" riskinin çok düşük olması.


15
Şaşkın iyi. Underhanded daha iyi. underhanded-c.org

11
“Başvuran şirketinizde gerçekten bir iş istiyor (dava değil)” Başvuru gönderen bir yabancının işi gerçekten istediği belli değil.
Christian

@ Hıristiyan: Açıkçası. Ancak sanırım OP, başvuranın iş talebiyle ilgili en azından makul bir görünüme sahip olmaması halinde, başvuranın kodunun gözden geçirilmesine hiçbir zaman yatırım yapmaz. Ve ayrıca bir yabancı muhtemelen dava açmak istemiyor. Demek istediğim: Yukarıdaki noktaların her biri kendi başlarına çevrilebilir, ancak hepsi birlikte mi? Bu oldukça düşük bir risk.
Doktor Brown

13

Birkaç vakayı ayırt etmeliyiz:

  1. Derleyicideki bir hata. Her karmaşık program gibi, bir derleyicide de hatalar olabilir ve bu hatalardan biri sömürülebilir olabilir.
  2. Bir Truva Atı. Saldırgan, derleme işleminin bir parçası olarak bazı rasgele kodlar çalıştırmanızı sağlayabilir. A Makefile, a build.xml, bir configurekabuk betiği vs. Teknik olarak, bu saldırganın kodunu derlemek değil, derleme ortamını ayarlamaktan kaynaklanmaktadır.
  3. İsteğe bağlı kodun derleme zamanında çalışmasına izin veren diller. Scala'nın makro dili Scala, Common Lisp'in makro dili Common Lisp, Template Haskell'in makro dili Haskell'dir. Scala ayrıca, yine derleme zamanında çalışan isteğe bağlı Scala kodu olan derleyici eklentilerine sahiptir. F # tip sağlayıcılara sahiptir.
  4. Derleme zamanında Turing hesaplamasına izin veren diller. Scala'nın ve Haskell'in tür sistemleri, C ++ 'ın Şablonları gibi, Turing tamamlandı. Derleyiciye, sonsuz döngüler dahil ancak bunlarla sınırlı olmamak üzere, derleme zamanında isteğe bağlı Turing-hesaplama yapma olanağı sağlayabilirsiniz. Turing-complete uygulamasının yalnızca her Turing ile hesaplanabilir işlevi hesaplayabileceğiniz anlamına geldiğini, dosya sistemine veya buna benzer bir şeye erişebileceğiniz anlamına gelmediğini unutmayın. Ancak, derlenmesi çok uzun sürecek bir program yapabilirsiniz.
  5. Çok uzun derleme süreleri. Örneğin, C # 'nın aşırı yük çözünürlüğü kuralları o kadar karmaşıktır ki herhangi bir 3-SAT problemini C # aşırı yük çözünürlüğü olarak kodlayabilirsiniz. 3-SAT, elbette, meşhur NP tamamlandı. Başka bir deyişle, şu anki bilgilerimize göre, C # 'da aşırı yük çözünürlüğü için etkili bir algoritma bulmak mümkün değildir. Derlemenin sonsuz uzun sürmesini sağlayamazsınız, ancak derlemenin evrenin ömründen daha uzun sürmesini sağlamak büyük bir program gerektirmez, ki bu da aslında aynı şeydir.

4.. ve # 5. en çok hizmet reddiyle sonuçlanacaktır. Pratik olarak, C ++ ve Scala derleyicileri yapabileceğiniz özyineleme miktarını sınırlar, böylece sonsuz bir döngü yazmak gerçekten mümkün olmaz . Scala'da, bu sadece bir uygulama kısıtlamasıdır, ancak C ++ 'da, spec tarafından açıkça izin verildiğine inanıyorum.

# 2. Teknik olarak bu sorunun kapsamı dışındadır çünkü soru onu çalıştırmayan kodun derlenmesiyle ilgiliydi (OTOH, derin felsefi bir soru var: eğer bir Haskell programının tip kontrolünün keyfi bir şekilde gerçekleştirilebilmesi durumunda Turing-hesaplaması, bir derleme mi yoksa bir program mı çalışıyor?)

# 1. olası değildir. Bir yandan, üretim derleyicileri çok karmaşık, bu nedenle böcek olasılığı yüksektir. Öte yandan, titizlikle test edilirler, sonuçta, kötü biçimlendirilmiş girdilerin incelikle ele alınması, bir derleyicinin iş tanımının bir parçasıdır. Test edilmemiş olsalar bile, yine de kötü biçimlendirilmiş kodlarla bombalanacaklar… önemsiz insanların derleyicilerine ne attığını gösteren örnekler için bazı StackOverflow sorularına bakın!

Bu bize 3 bırakıyor. Bazı derleyiciler derleme zaman kodunun sisteme erişim türünü sınırlayabilir, ancak bazı kullanım durumları için tam erişime sahip olmak kaçınılmazdır. F # tür sağlayıcılarının amacı, örneğin, tür sistemi F # 'ile eşleşmeyen veriler için sentetik türleri "sahte" hale getirmektir; böylece, WSDL şemasını güçlü bir şekilde yazılmış bir web hizmetiyle etkileşime sokabilirsiniz. moda. Ancak, bunu yapabilmek için tür sağlayıcısının dosya sisteminde veya web'de WSDL şema kaynağına erişebilmesi gerekir, bu nedenle dosya sistemine ve ağ erişimine sahip olması gerekir.

Yani güvenli mi? Teknik olarak hayır. Riskli mi? Pek sayılmaz.


1
C ++ gerçekten şablonların örnekleme derinliğini uygulamaya bağlı bazı değerlerle sınırlar. Bu birkaç düzine oldu; modern uygulamalar limiti birkaç yüze çıkardı. Yine de, seviye başına şablon örnekleme sayısını iki katına çıkarmak önemsizdir, bu yüzden 100 seviye derleyicinin 2 ^ 100 şablona örneklemesini gerektirir. Bu sadece bir DoS saldırısına kadar.
MSalters

3

Sadece kodu derleme riski olmamalıdır . Gelen teorisi akıllı bir korsan yararlanmak ama son derece olası sesleri mi olabilir derleyici bir hata söz konusu olabilir.

Binanın güvenli olamayacağına dikkat edin . Örneğin, C # 'build olayı', derleme kodunda arabellek taşmalarından çok daha kolay ve kullanımı tehlikesiz ve istismar edilmesi çok daha kolay olan, yapım öncesi ve sonrası çalıştırılacak isteğe bağlı komut satırlarını belirtmenize izin verir.


3
Scala, Template Haskell, hemen hemen tüm Lisps'lar derleme zamanında keyfi kod yürütebilir. Turing-complete tip sistemli tüm diller (Scala, Haskell), sınırsız bir döngü dahil ancak bunlarla sınırlı olmamak üzere derleme zamanında keyfi Turing hesaplama yapabilir. C ++ 'ın Template sistemi yine Turing-complete'dur ve derleme zamanında sonsuz döngüler dahil olmak üzere rasgele hesaplama yapmanızı sağlar. C # 'nin aşırı yük çözünürlüğü 3-SAT'ye eşittir, bu nedenle NP-tamamlanmıştır, ki bu Turing-tamamlanmış değildir, ancak yine de isterseniz evrenin ömrü boyunca derleyiciyi asmanıza izin verecektir.
Jörg W Mittag

3
Bir Turing-tam tür sistemi yok değil bilgisayarı pwn izin verin. En kötüsü, istismar ederseniz derleyiciyi asar. Ancak evet, derleme adımının isteğe bağlı kod uygulayabileceği bir diliniz varsa, o zaman açıkça güvenilmeyen kodu derlememelisiniz.
JacquesB

3

Spekülasyon yapmak yerine, cevap vermeden önce bu konuda bazı araştırmalar yapmak için uğraştım, aklıma gelen en yetkili kaynağa gidiyorum ( CVE Detayları ). Kamuya açıklanmış bu güvenlik açıklarının bu kapsamlı listesi muhtemelen çeşitli yazılım türlerinin tehdit düzeylerini değerlendirmek için yapılabilecek en iyisidir.

Elbette mevcut tüm materyalleri okumak için zaman ayırmadım , fakat örnek bir tehdit değerlendirmesi yapmak için birkaç "birincil" derleyici, IDE ve metin editörü seçtim. Herhangi bir yazılımı çalıştırmak konusunda ciddiyseniz, en azından orada hangi tehditlerin bulunduğunu görmelisiniz. Ayrıca, eski yazılımların genellikle yeni yazılımlardan daha hatalıdır, bu nedenle en son çalıştırdığınız yazılımın çalıştırılması idealdir.

İlk olarak, çeşitli metin editörlerine bir göz atabiliriz. En iyi editörlerin en basit olduğu anlaşılıyor. Bir Linux kabuk kullanıyorsanız Vi, Windows kullanıyorsanız Not Defteri kullanın. Biçimlendirme kabiliyetine sahip olmayan, ayrıştırma yok, yalnızca ileriye doğru görüntüleme görüntüleme ve tek bir karakter geçerli kodlama şemasının dışındaysa ayrıştırmanın otomatik olarak sonlandırılması. Notepad ++ 'ın bile bir avuç güvenlik açığı var. Güvenilmeyen dosyaları görüntülerken karmaşık olan herhangi bir şeyden kaçının.

İkincisi, IDE'lere bakabiliriz. Dosyayı bir IDE'de açmayı seçerseniz, bazı IDE'lerde hata bildirildiğinin farkında olmalısınız. Görünüşe göre Visual Studio, uzantı mekanizmaları aracılığıyla kullanılabilecek avantajlara sahipti; IDE'lerden kaçınmak, sizinle güvenilmeyen kod arasındaki bütün bir problem sınıfından kaçınır. VI ile yapıştırmak çok daha güvenli görünüyor.

Üçüncüsü, gerçek derleyicilere bakabiliriz. Ben Adobe, Microsoft, Java ve GNU C / C ++ dahil birkaç göz, ve genellikle, konuşma bulundu derlenmesi (hatta ve kod bina hiçbir özel makyaj dosyasını varsayarak) nispeten güvenlidir, ancak bu derleyici her birini veya did Derlenmiş ikilileri çalıştırmanın neden olabileceği güvenlik açıklarını kullanmak. Başka bir deyişle, sadece derleme yaparak sisteminizi devralmamış olabilirler, ancak kod çalıştırarak başarabilirlerdi.

Bu nedenle, sonuç olarak, teslim yönteminin sisteminizi kaçırmayacağını varsaymak (ör. E-posta istemciniz saldırıya uğradı ya da geldiği USB sürücüsü ...), kaynak kodunu okumak ve kaynak kodunu derlemek muhtemelen güvenlidir. . Özel yazılımınızı araştırmak suretiyle, dosyayı doğru kod sayfasında, vb. Doğrulayarak, örneğin daha güvenli hale getirebilirsiniz. Kodu çalıştırmak yalnızca umursamadığınız bir donanımda yapılmalıdır. Bir VM değil, ağ erişimi olmayan ve hassas dosyalar veya harici cihazlar içermeyen tamamen farklı bir bilgisayar. Kodu anladığınızı düşünseniz bile , basit araştırmalar, derleyicilerin bile gizli bir arabellek taşması istismarının arkadan gizlice girip, isteğe bağlı bir kod yürütmesine izin verebilecek hatalara sahip olduğunu göstermektedir.programı çalıştırmak veya hata ayıklamak . Gerçek derleme güvenli olmalı.


2

Eh, "kodlarını gözden geçirme" ile başlardım. Neden gerçekten kodu çalıştırmanız gerekiyor?

Bunun dışında, kodu girip derleyebileceğiniz ve / veya çalıştırabileceğiniz çok sayıda çevrimiçi derleyici var. Bunu bir zorunluluk haline getirebilirsiniz: bu ve bu çevrimiçi derleyiciden derler.

Çevrimiçi derleyiciler içeren bir sayfa örneği: Çevrimiçi derleyiciler

Bir iş görüşmesi için gözden geçirme kodunun ne olup bittiğini anlayamamanız kadar büyük olmamalıdır.


3
Msgstr "Neden kodun gerçekten çalıştırılması gerekiyor?" Bunun iyi olup olmadığını öğrenmek için, elbette, gözden geçirme yalnızca başarısızlıklarının ince olduğunu söyler :-). “Yukarıdaki koddaki hatalara dikkat edin; yalnızca doğru olduğunu kanıtladım, denemedim.” - Knuth
Steve Jessop

2

Akıllıca bir kod parçasını derlerken kullanıcı makinesini delmemeleri için derleyiciler tipik olarak onaylanır mı?

Genelde onlar çok karmaşıktır ve genellikle bu özelliği kanıtlamanın pratik olmadığı dilleri kullanarak yazılmıştır.

Muhtemelen bu özel niyetle değil, ancak fuzz test derleyicileri kavramı en azından bilinir ( LLVM artık fuzz testini yapabilir ). Derleyici hataları nedeniyle derleyiciyi çökerten girdiyi yakalamaya yönelik testler de istismar edilebilir kusurları ortaya koyma eğiliminde olacaktır .

Doğal olarak, ilgilendiğiniz belirli bir derleyicinin olası çökmeleri bulmak için test edilip edilmediğini veya bu testlerle karşılaşılan hataların gerçekten düzeltilip düzeltilmediğini araştırmanız gerekir. Temel kural şudur: hafıza istisnası dışında yakalananlardan daha kötü bir kaza varsa, daha fazla ayrıntı araştırmadan, istismarlardan yararlanabilecekleri ciddi bir olasılığı göz önünde bulundurmanız gerekir.

Bir yabancıdan bir kod parçasını derlemek ne kadar güvenli?

Ne yazık ki, bir ipin uzunluğu ne kadar Prensipte e-posta, posta istemcinizden ya da kaynak kodunuz, derleyicinize ulaşmadan önce metin düzenleyicinizden ya da onay kutunuzdan yararlanabilir. Sebastian'ın çevrimiçi bir derleyici kullanma yorumlarındaki önerisi oldukça iyi, ancak elbette kod derleyicinin kabul edeceği bir biçimde olmalı.

Genel kodun derleme zamanında yürütülmesine yönelik tesisleri olan herhangi bir dil veya derleyici kuşkusuz şüphelidir. C ++ şablonları işlevsel olarak tamamlanmıştır, ancak sisteme erişimi yoktur (bu nedenle), bu nedenle nispeten düşük risklidirler. BЈовић, makeçok yüksek riskli olduğunu belirtiyor (yabancı bir kişinin kodunu yürüttüğü için, kod sadece makeC ++ dilinde değil , dilde yazılmış oluyor ). Derleyici çalışacaksa systemaynı gemidesiniz. Eğer doğru hatırlıyorsam, rasgele derleme zamanı kod çalıştırması yapabilen bir assembler ile çalışırdım. Arama tablolarını hesaplamak için düşünülmüştü, ancak hiçbir şeyin sistem çağrıları yapmanızı engellediğini sanmıyorum.

Uygulamada , kod bana uygun görünüyorsa ve sanırım anlıyorum, o zaman onu derlemenin son derece düşük olduğunu düşünüyorum, "interneti kapalı bir tarayıcı ile gezinmek" demekten çok daha düşük risk. Genel amaçlı makinemde rutin olarak daha riskli şeyler yapıyorum, ancak birçoğunu örneğin bir virüs laboratuvarında veya kritik bir sunucuda yapmam. Eğer kod komik görünüyorsa veya belirgin bir şekilde karışıksa, derleme riskini alamayabilirim çünkü riskten ayrı olarak okunamayan çöplere gizlenmiş bir istismar içerebiliyor, çöp kodu. Düşük kod zor ama mümkün değil. Makineyi bir derleyici kullanımı istisnasıyla kullanan yalın kodun önemsiz bir çalıştırılabilir yük içermesi gerekir, bu yüzden son derece zordur.

Bunu daha yakından incelemek isterseniz, çevrimiçi derleyicileri barındıran kişilere sormayı deneyin. Onlara yapılmadıysa (NSA'nın veya eşdeğerinin dikkatine gelmenizi yasaklamanız halinde), bunun size yapılmayacağını makul bir şekilde kabul edebilirsiniz. Derleyicilerini uygun bir sanal alanda çalıştırmak için biraz çaba harcadılar, bu sizin gitmeye istekli olduğunuzdan daha fazla çaba gösterebilir, ancak en azından bu sanal alanın onları ne kadar sıkıntıya soktuğunu size söyleyebilirler.


Utah Üniversitesi'ndeki Profesör John Regehr tarafından yapılan çalışma nedeniyle, clang ve gcc, derleyicinin diğer derleyicilerden farklı şekilde davranan kodlar üretmesine ve hatta kod değiştirmesine neden olabilecek yüzlerce hataya neden olacak şekilde yoğun fuzz testlerinden geçti. Aranacak şey hala açık olan böcekler ve yeterince tehdit oluşturup oluşturmadıkları olacaktır.
Phil Miller

@Novelocrat: kabul etti ve özel bilgi için teşekkürler. Korku, derleyici geliştirme ekibinin böcekleri düşük öncelikli olarak değerlendirebileceğidir, çünkü "hiç kimse bu kodu yazmaz" ve henüz düzeltilmemiştir , oysa derleyiciyi bir saldırı yüzeyi olarak düşündüğünüzde onları kritik. Unutmayın, umarım gurur, bir derleyici yazarın tampon yazma taşması gibi utanç verici bir şey yapmasına izin vermez ;-)
Steve Jessop

1

Bu genellikle bir endişe olmasına rağmen, kurulum nedeniyle sorunun var olmadığını düşünüyorum.

Başvuru sahibi size bir kaynak kod gönderdi. Bu nasıl veya neden oldu?

Açıkçası, sadece üç olasılık var:

  1. Başvurana becerilerini değerlendirmek için belirli (iyi tanımlanmış) bir sorunu çözme görevi verdiniz.
  2. Başvuran yazdığı güzel bir şeyi göstermek istemektedir.
  3. Başvuran bir pislik, casus veya başka türlü kötü niyetli bir kişidir ve aslında işe alınmak istememektedir. Tek umduğu, onun kodunu koyacak kadar aptal olman.

Yaklaşık 2) ve 3)

Asıl risk 2) ile 3) arasında ayrım yapmaktır. Şansı yüksektir, eğer yazdığı her şeye bakmaya değerse , çevrimiçi olarak kaynak kodunu ("nötr" bir kaynaktan) alabileceğiniz ve zaten aşina olduğunuz bir şey olduğu ya da gerçekten yaptığınız bir şey olabilir. Bakmak istemez çünkü bir rakibin (eski işveren) fikri mülkiyetini ihlal edersiniz. İkincisi, yine de o kişiyi işe almak istemeyeceğiniz anlamına gelir.
Kaynağı çevrimiçi hale getirebilirseniz, bunu yapın. Başvuranın iyi bilinen bir yazılıma (özel yazılım da dahil olmak üzere) krediyle ilgili bir yerdeki adıyla katkısını doğrulayabilirseniz, bunu yapın.
Diğer her durumda, size her ne yolladıysa aldırmayın. Ya bakmaya değmez ya da yasa dışı ya da yüksek risklidir.

Yaklaşık 1)

Başvuran sana bir şey gönderdi, çünkü ona bir görev verdin. Eğer herhangi bir yetkinliğiniz varsa (ki bunu yaptığınızı sanıyorum!), O zaman tipik bir programlama ödevi için (... kendini seçtiğin!), İşe yarayabilir gibi görünen makul bir çözüm olduğunu anlatabilirsin. kaynak koduna 30 saniyeden az bakıldığında (daha büyük olasılıkla 10 saniye).

Programın 30 saniye içinde muhtemelen çalışacağını (veya ne yaptığını) söyleyemezseniz, onu yazmak istediğiniz kişi değil, yazdığınız kişi. Başka insanların anlayabileceği ve koruyabileceği kod yazan insanların olmasını istiyorsun. Size zeki olmaya çalışan birinin ya da düzenli olarak karışık olan C yarışmasını kazanan birini istemezsiniz. Programın çalışıp çalışmadığı önemli değil. Başka bir kişi kodu anlamaz anlamaz, asla "işe yaramaz".
Program muhtemelen işe yarayacak gibi görünüyorsa, ancak "tuhaf" görünen bir şey bulursanız (diyelim, Java unicode kaçış dizileri, C ++ ham dize değişmezleri, trigraph gibi görünen şeyler, ne olursa olsun), atamayı "başarısız" olarak kabul et, taşı Bir sonraki başvurana. Tüm programların% 99'una benzer bir şey eklemek gerekli değildir (ve kesinlikle, ödevinize değil - umarım). Öyleyse "garip" bir şey bulursanız, başvuru sahibi işe almak isteyeceğiniz bir kişi değildir.

Kod ilk triyajı geçerse, daha iyice bakarak 2-3 dakika daha geçirmek isteyebilirsiniz. Bundan sonra gördüklerinizden hala memnunsanız, statik bir analizörden geçirebilir ve sanal bir makinede yüksek uyarı seviyesinde derleyebilirsiniz.

Bu, kaynağı okurken kaçırmış olabileceğiniz sorunları ortaya çıkarmalıdır (tanımsız davranışları çağırmak veya dönüşümü daraltmak gibi).
İlk önce derleme, başvuru sahibinin programlama becerisine sahip olup olmadığına değil, ayrıntıya gerekli özen ve özen gösterip göstermediğini size söyleyecektir. İşverenin ismini başvurunuza doğru yazmak ve CV'nizi teslim etmeden önce hecelemek gibi, en iyi şekilde kullandığınız kaynak kodun hatasız (ve tercihen uyarılar olmadan) derlendiğinden emin olmalısınız. Birisi bunu başaramazsa, onu işe almak istemezsin.

Bu noktada meydana gelebilecek kötü şeylerin riski (derleyiciden yararlanma ve sanal makineden ayrılma) ihmal edilebilir, zaten kod üzerinde bir olasılık kontrolü nasıl yürüttüğünüze bakın. Olmayacak.


0

Olasılık sizi endişelendiriyorsa, eski bir makineyi alın (çoğumuzun üzerinde oturmaz mıyız?), Linux ve compiler & c sürümlerini yükleyin, kaynak kodunu kopyalayın, ağ kablosunu çıkarın (veya WiFi'yi kapatın). ) derler. Kötü bir şey olursa, başka hiçbir şeyi * etkilemez.

Ve Makefile'deki kötü amaçlı yazılımlar için, gerçekte yapmadan ne yapacağını görmek için -n bayrağıyla (IIRC, RTMF) çalıştırın.

* Elbette programcınız kötü amaçlı yazılımı yeniden bağlamayı bekleyecek şekilde kodlamıyorsa, ancak bu durumda a) makineyi silin; ve b) adamın özgeçmişini NSA'ya iletin, çünkü ticari dünyada harcanmış :-)


0

Sonuç olarak , risk var. Diğer yanıtların not ettiği gibi risk oldukça küçüktür, ancak bir risk vardır. Bu, iki soru sormanız gerektiği anlamına gelir:

  1. Riski azaltmak için ne yapabilirim?
  2. Risk almam gereken kadar yüksek mi?

İkincisi, bu soruda burada ne ifade ettiniz, ancak bu özel durum için yanlış odak. Riski azaltmanın cevabı açık ve kolayca hazır: makinenizdeki kodu derlemeyin . Makinenizi kullanmadan derlemenin iki belirgin yolu vardır:

  1. Sanal bir makine kullanın (@FlorianMargaine, yorumlarda hemen belirtildiği gibi). Sadece derlemeden önce anlık görüntü ve bitince anlık görüntüyü geri yükleyin.
  2. Barındırılan bir hizmet kullanın (çevrimiçi derleyici gibi).

Riskinizi azaltmanın bu yolları o kadar açık, ucuz ve kolayca erişilebilir ki, riskin ne kadar büyük olduğunu analiz etmeye çalışmak çok fazla zaman harcamaya değmez. Sadece onlardan birini yap ve onunla bit.


0

Visual Studio, güvenilmeyen bir konumdan (e, g, indirilen veya ağ paylaşımı) bir proje açarsanız sizi uyarır.

Bunun nasıl kullanılabileceğine bir örnek bir WPF projesi ile olabilir: .NET sınıflarına XAML'den başvurabilir ve IntelliSense, VS'yi sağlamak için başvurulan sınıfları tasarım zamanında yükler ve yürütür.

Bu, bir saldırganın kötü amaçlı bir .dll dosyasını bin dizinine bırakabileceği, kaynak kodunu kötü amaçlı olmayan bir kodla değiştirebileceği ve tasarım zamanında DLL çalıştırıldığı anlamına gelir. İlk kurulduktan sonra, kötü amaçlı ikili kodun her izi kaybolur.

Bu nedenle, sağlanan kodun tümü "temiz" olsa da, derleyici hatasızdır ve tabii ki, sağlanan hiçbir zaman el ile çalıştırma .EXE, kötü niyetli kod arka planda hala çalıştırılabilir. (Bu saldırıdan korunmak için çözümü açmadan önce dizin ağacında NO ikili olduğundan emin olabilirsiniz. VS, tasarım zamanında IntelliSense'i sağlamadan önce çözümü oluşturmanızı isteyecektir.)

Benzer vektörler muhtemelen diğer dillerle / OS'lerde var.


0

Kaynak kodu okunuyor: tamamen güvenli. Kaynak kodu derleniyor: tamamen güvenli. Derlenmiş ikiliklerin çalıştırılması: peki ... buna bağlı.

Derleme sadece kaynak kodu okuyan ve eşdeğerini ikili biçimde yazan bilgisayardır. Derlemeden sonra, sadece 2 belgeniz var: biri insan tarafından okunabilir, diğeri bilgisayar tarafından okunabilir. Bilgisayarın 2. belgeyi okumasına (yani çalıştırmasına) izin vermediğiniz sürece hiçbir şey olmayacak.


3
Derlemenin neden tamamen güvenli olduğuna dair herhangi bir açıklama var mı? Bir akıllıca hazırlanmış bir mesaj göndererek bir sunucuyu rehin alabilir - neden akıllıca hazırlanmış bir girdi vererek bir derleyiciyi açamaz?
sharptooth

2
Bir sunucuda veya derleyicide bir güvenlik açığından yararlanmak için tasarlanan zekice hazırlanmış kodun farkına varacağınızı düşünüyorum. Fakat bunu aşırı noktaya götürmek, neden kodu hiç görme riskini alıyor ?! Editörlerde, sadece bir dosyayı görüntüleyerek yararlanılabilecek birkaç istismar vardır .
gbjbaanb

2
Bu cevap tamamen saçma. Bir derleyicinin doğal olarak güvenli olmasının ya da en azından SSL bağlantısı kurmak gibi basit bir görevi yapan bir şeyden daha güvenli olmasının hiçbir nedeni yoktur, ancak son zamanlarda popüler bir kütüphane bu güvenlik açığını içermekteydi. Hatta derleyiciler genellikle düşmanca bir ortamda (internet gibi) kullanılmadıklarından, güvenlik açıklarından daha az kontrol edildiklerini ve bu yüzden de onlara sahip olma ihtimallerinin daha yüksek olduğunu iddia ediyorum.
Dorus

1
Tamamen güvenli kod derleme konusunda emin değilim. Java'da bile, Maven (örneğin) dikkatsiz bir " mvn package", kolayca tanımayabileceğiniz ek eklentilerle bir şeyler çekebilir ve görevler gerçekleştirebilir. Aynı şey diğer yapı sistemleri için geçerli olduğundan eminim.
Bruno

1
Turing-complete dili , derleyicinin sınırsız bir süre boyunca çalıştırılmasına izin verilirse, derlemek için sınırlı bir süre harcamak için izin verebilir , ancak birçok derleyicide görünebilecek herhangi bir şeyden bağımsız olarak sınırlı sayıda iş parçacığı oluşturur Kodun derlenmesi, işlemcinin bir seferde bir programı derlemeye çalışmasının sınırlı olacağı anlamına geliyor. Potansiyel olarak daha büyük bir problem disk alanı gereksinimleri olacaktır; 1KB kaynak dosyasının birçok konser kodu nesnesinin üretilmesi tamamen olasıdır.
supercat

-1

İki lezzetten biri için endişelendiğini düşünüyorum:

  • sofistike, istismar odaklı kötü amaçlı yazılım : olası değildir, özellikle de bunlar çok özel donanım ve / veya yazılımları hedef aldığından ve [sorunuza dayanarak] saldırganınız muhtemelen bu sistem bilgisine sahip değildir.
  • ortamınıza zarar veren şeyler : kötü niyetli şaka direktifleri (örneğin, ana dizininin silinmesi) veya sistem davranışınızı değiştiren düşüncesiz / yetersiz direktifler (örneğin PATH veya LIBRARY ortam değişkenlerinin yeniden yazılması)

Bazı insanlar sanal makineler veya eski sistemler önermişlerdir, ancak ben çok daha kolay bir çözüm öneriyorum: Farklı / farklı izinlere sahip farklı bir kullanıcı olarak derleyin . Sanal bir makine veya özel bir bilgisayar kurmaktan çok daha kolay.

Düşük ihtimalde olsa bile sisteminiz derleme zamanındaki istismarlar yüzünden delinirse, yedeklemelerden geri yükleyin (sizde var mı?).

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.