ABD hükümeti güvenli projeler için neden dinamik dillere izin vermiyor?


120

Şu anda ABD ordusu için bir proje üzerinde çalışan bazı insanları tanıyorum (düşük güvenlik seviyesi, savaş dışı insan kaynakları tipi verileri).

Proje kodunun başlangıçtaki durumu gözden geçirilmek üzere orduya sunuldu ve programı bir çeşit güvenlik analiz aracı aracılığıyla yürüttüler. Koddaki bilinen güvenlik sorunlarının bir raporunu verdi ve nihai ürünün teslimatından önce yapılması gereken değişiklikleri istedi.

Çözülmesi gereken öğelerden biri, Ruby'de yazılmış olan ve dinamik bir dil olduğu için projenin bir kısmının kaldırılmasıydı .

Dinamik bir dilin güvenli bir ortamda kullanılmasına izin vermemenin arka planı / nedeni nedir? Bu hükümet yeni teknolojileri benimsemekte yavaş mı oluyor? Yoksa dinamik diller, statik dillere göre (ala C ++ veya Java ) ek bir güvenlik riski oluşturuyor mu?


56
Kesin olarak bilmenin tek yolu, tanıdıklarınız işverenlerinden nedenini sormalarıdır. Fakat bir tahminde bulunma riskini götürebilirim: statik tip kontrolü, kritik görev yazılımlarının doğruluğunu sağlayan başka bir katmandır. Elbette böceklerden kurtulmaz, ama doğru yönde atılmış bir adım: bilgisayar sizin için bazı işleri yapıyor. (Evet, bunun kutsal savaş bölgesi olduğunu biliyorum).
Andres F.


75
PHP + JavaScript'te füze kontrol yazılımı yazılı istemiyorsunuz.
Tulains Córdova

16
İK veridir değil "düşük güvenlik düzeyi". Bir şirketin istihdamımı ve kişisel verilerimi olabildiğince güvenli tutmasını bekliyorum.
gbjbaanb

5
@gbjbaanb OP'nin hayat kaybının buradaki en kötü senaryo olmadığı anlamına geldiğini düşünüyorum.
Andres F.

Yanıtlar:


126

Belirli bir kod parçasının işlevselliği ile ilgili olarak başka bir programcı veya denetçi tarafından hemen açık olmayan kod bölümlerinde saklanabilecek dinamik dillerde yapılabilecek birkaç 'temiz' şey vardır.

İrb'deki bu diziyi göz önünde bulundurun (etkileşimli yakut kabuğu):

irb(main):001:0> "bar".foo
NoMethodError: undefined method `foo' for "bar":String
        from (irb):1
        from /usr/bin/irb:12:in `<main>'
irb(main):002:0> class String
irb(main):003:1> def foo
irb(main):004:2> "foobar!"
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> "bar".foo
=> "foobar!"

Orada olanlar foobir String sabitinde metodu çağırmaya çalıştım . Bu başarısız oldu. Daha sonra String sınıfını açtım ve fooreturn metodunu tanımladım "foobar!"ve sonra çağırdım. Bu çalıştı.

Bu açık bir sınıf olarak bilinir ve her zaman bir güvenlik veya bütünlüğe sahip olan yakutta kod yazmayı düşündüğümde bana kabuslar verir. Tabii ki çok hızlı bir şekilde bazı şeyleri hızlıca yapabilmenizi sağlıyor ... ama bir dize sakladığında, bir dosyada sakladığında veya ağ üzerinden gönderdiğinde bunu başarabilirim. Ve String'i yeniden tanımlamanın bu küçük kısmı kodun herhangi bir yerinde saklanabilir.

Diğer birçok dinamik dilde yapılabilecek benzer şeyler vardır. Perl'de, sahnelerin ardında, belirli bir skalerin çalışma şeklini değiştirebilecek Tie :: Skaler var (bu biraz daha açıktır ve görebileceğiniz belirli bir komut gerektirir, ancak başka bir yerden geçen bir skaler sorun olabilir). Perl Yemek Kitabına erişiminiz varsa, bkz. Tarif 13.15 - Kravatla Büyü Değişkenleri Yaratma.

Bu şeyler nedeniyle (ve diğerleri genellikle dinamik dillerin bir parçası), kodda güvenliğin statik analizine pek çok yaklaşım işe yaramıyor. Perl ve Belirlenemezlik bunun durum olduğunu gösterir ve sözdizimi vurgulama gibi önemsiz sorunları bile işaret eder ( whatever / 25 ; # / ; die "this dies!";zorlukları ortaya çıkarır çünkü whateverargümanlar almak için tanımlanabilir veya çalışma zamanında bir sözdizimi vurgulayıcıyı veya statik analizörü tamamen yenmeden tanımlanamaz ).


Bu, kapatmanın tanımlandığı ortama erişme yeteneği ile Ruby'de daha da ilginçleşebilir ( YouTube: RubyConf 2011'den Joshua Ballanco tarafından Ruby'nin Makul Olmasını Sağlama). MouseTheLuckyDog tarafından yayınlanan bir Ars Technica yorumundan bu videodan haberdar oldum .

Aşağıdaki kodu göz önünde bulundurun:

def mal(&block)
    puts ">:)"
    block.call
    t = block.binding.eval('(self.methods - Object.methods).sample')
    block.binding.eval <<-END
        def #{t.to_s}
          raise 'MWHWAHAW!'
        end
    END
end

class Foo
    def bar
        puts "bar"
    end

    def qux
        mal do
            puts "qux"
        end
    end
end

f = Foo.new
f.bar
f.qux

f.bar
f.qux

Bu kod tamamen görülebilir, ancak malyöntem başka bir yerde olabilir ... ve açık sınıflarla, elbette, başka bir yerde yeniden tanımlanabilir.

Bu kodu çalıştırıyorum:

~ / $ ruby ​​foo.rb 
bar
> :)
qux
bar
b.rb: 20: `qux 'cinsinden: MWHWAHAW! (Çalışma hatası)
    b.rb'den: 30: `'
~ / $ ruby ​​foo.rb 
bar
> :)
qux
b.rb: 20: `bar ': MWHWAHAW! (Çalışma hatası)
    b.rb'den: 29: `'

Bu kodda, kapatma, sınıfta tanımlanan tüm yöntemlere ve diğer bağlamalara bu kapsamda erişebildi . Rasgele bir yöntem seçti ve bir istisna oluşturmak için yeniden tanımladı. ( Bu nesnenin neye erişimi olduğu hakkında bir fikir edinmek için Ruby'deki Binding sınıfına bakın )

Değişkenler, yöntemler, benlik değeri ve muhtemelen bu bağlamda erişilebilen bir yineleyici bloğu korunur.

Bir değişkenin yeniden tanımlanmasını gösteren daha kısa bir sürüm:

def mal(&block)
    block.call
    block.binding.eval('a = 43')
end

a = 42
puts a
mal do 
  puts 1
end
puts a

Hangi, run ürettiğinde:

42
1
43

Bu, statik analizi imkansız kılan yukarıda bahsettiğim açık sınıftan daha fazlası. Yukarıda gösterilen şey, başka bir yere iletilen bir kapağın, içinde tanımlandığı tüm ortamı taşıdığıdır. Bu, birinci sınıf bir ortam olarak bilinir (tıpkı fonksiyonların etrafında dolaşırken, bunlar birinci sınıf fonksiyonlardır; bu çevre ve o andaki mevcut bütün bağlanmalardır). Bir kapatma kapsamında tanımlanan herhangi bir değişkeni yeniden tanımlayabilirsiniz .

Yakut veya olmasın şikayet, iyi ya da kötü (tek olur kullanımları vardır istiyorum bir yöntemin ortamda elde edebilmek için (bkz Güvenli ) Perl), neden yakut olurdu" sorusu bir hükümet projesi için sınırlama getirilmesini "gerçekten bağlantılı bir videoda yanıtlandı.

Verilen:

  1. Ruby, insanın çevreyi herhangi bir kapanmadan açmasını sağlar
  2. Ruby, kapatma kapsamındaki tüm ciltleri yakalar
  3. Ruby, tüm ciltleri canlı ve değişken olarak korur
  4. Ruby'nin yeni bağları eski bağları gölgeledi (çevreyi klonlamak ya da yeniden bağlamayı yasaklamak yerine)

Bu dört tasarım seçeneğinin getirdiği sonuçlarla, herhangi bir kod parçasının ne yaptığını bilmek mümkün değildir.

Bu konuda daha fazla Özet Heresies blogunda okunabilir . Özel görev, böyle bir tartışmanın yapıldığı Şema ile ilgilidir. (SO ile ilgili: Scheme neden birinci sınıf ortamları desteklemiyor? )

Ancak zamanla, birinci sınıf ortamlarda ilk başta düşündüğümden daha fazla güç ve daha az güç olduğunu fark ettim. Bu noktada birinci sınıf ortamların en iyi ihtimalle işe yaramaz, en kötüsü de tehlikeli olduğuna inanıyorum.

Umarım bu bölüm birinci sınıf ortamların tehlike yönünü ve neden Ruby'nin sağlanan çözümden kaldırılması isteneceğini göstermektedir. Bu sadece Ruby'nin dinamik bir dil olması değil (başka bir cevapta belirtildiği gibi, diğer projelerde diğer dinamik dillere de izin verilmiştir) değil, aynı zamanda bazı dinamik dillerin nedenini daha da zorlaştıracak belirli konular olduğunu göstermektedir.


3
Bunun anlamını anlamıyorum. Skaler davranışını değiştirmeyi sağlayan bir Perl sınıfından bahsediyorsunuz. Bununla birlikte, Perl, güvenli ortamlar dahil olmak üzere, yaygın olarak kullanılmaktadır. Sadece bu yeteneklerin dilde olması dilin kullanılamayacağı anlamına gelmez. Belirli Ruby örneğinde, hedef ortamın Ruby'yi desteklememesi muhtemeldir. Şahsen, Ruby'yi herhangi bir sistemde kullanabileceğimi hiç görmedim ve onaylanmış herhangi bir yazılım listesinde olup olmadığından bile emin değilim.
Thomas Owens

17
@ThomasOwens - Bu cevabı anlıyorum, anahtarın anahtar olduğu "many approaches to static analysis of security in code doesn't work", bu yüzden analiz edilemediği için reddedildi (en azından bu grup tarafından). Doğru yorumluyorum ya da reddetmek için geçerli bir neden olup olmadığını bilmiyorum.
Bobson,

21
Onaylı yazılım listeleri hakkında bilgi eksikliği olduğunda, yalnızca dinamik dillerle ilgili zorlukları tahmin edebilirim. Bununla birlikte, finansal yazılım ile benzer sorunları gördüm ve ödeme kartı endüstrisi kontrolleri başarısız oldu çünkü dil güvenlik sorunları için önceden hazırlanmış statik bir analiz yapamadı. Dinamik dillerde, dilin yapısının statik analizi engellemesine izin verdiği iki örnek gösterdim. Ben de işaret niye bu, hatta teorik olarak doğru olamaz. Perl'e bazı yerlerde izin verilebilir ve diğerlerinde değil, yalnızca nedenlerle ilgili tahmin edebilirim.

2
Standart kütüphane işlevlerini diğer birçok dilde de yeniden tanımlayabilirsiniz (örneğin, Obj-C, C, C ++).
Martin Wickman

12
Peki, .NET uzantısı yöntemleri yukarıdaki Ruby ile aynı değildir. Statik bir sınıf yazmak için daha kolay bir yol yaratıyorlar. Aslında bir sınıfa bir yöntem eklemiyorlar.
Graham,

50

Değerlendirmenin yalnızca güvenlik olduğunu ve yalnızca bir kabul taramasının (varsa, Ruby'yi kabul etmedikleri için Ruby'yi kabul etmediklerini) kabul etmediğini varsayarsak:

Güvenlik analiz araçları tipik olarak dinamik davranışlarla kötü zamanlar geçirir.

Örneğin:

ASP.NET MVC ve Entity Framework gibi modern özelliklerle yazılmış herhangi bir .NET projesini Veracode gibi bir şeyle çalıştırın ve raporunuzda ne tür bir çamaşırhane aldığınızı görün.

Veracode, .NET 4 çekirdek kütüphanelerindeki birçok temel tekniği, desteklenmeyen çerçeveler olarak "desteklenmeyen çerçeveler", hatta çoğu bu noktada birkaç yaşında olmasına rağmen, beta olarak listelemektedir.

Eğer böyle bir araca güçlü bir şekilde bağlı olan bir varlık ile uğraşıyorsanız, teknik bir uzmanlığa ve kaynaklara sahip olmadıklarında, bir projeyi manuel olarak değerlendirmek ve uygun şekilde yazıldığını ve güvenli.

Bilgisayar sistemlerinin genel olarak tehlikeli veya çok pahalı bir şeyi kontrol etmediği sivil operasyonlarda, azaltma, hatalı pozitifleri tartışmanızdır ve genellikle toplu olarak kabul edilirler.

Bankacılık işlemlerinde hala yanlış bir pozitif etki azaltma şansına sahipsiniz, ancak her bir maddenin minutisini tartışmak için daha çok zaman harcayacaksınız. Bu hızla maliyeti engelleyici hale gelir ve daha geleneksel yöntemler kullanmaya başlarsınız.

Askerlikte, havacılıkta, ağır sanayide ve benzerlerinde, sistemler bu sistemleri kötü bir şekilde kötüleştiren şeyleri kontrol edebilir, böylece diller, derleyiciler vb. Hakkında çok katı kurallar olabilir.

Örgütler genel olarak güvenlik politikalarını bildikleri en kötü durum için yazmaktadırlar, bu yüzden önemsiz bir şey yazıyor olsanız bile, önemsiz olmayan sistemleri olan bir kuruluş için yazıyorsanız, varsayılan olarak bunu sürdürmek olacaktır. Birisi belirli bir istisna istemediği sürece daha yüksek bir standart.


4
Ve bu sadece yanlış pozitifler. Gerçekten endişe verici olan şey yanlış negatiflerin ortaya çıkması için potansiyeldir.
Stephen C

3
Dürüst olmak gerekirse, bu araçlarla olan deneyimim genellikle çok kötüydü. Muhtemelen tartışmaya değer bir şey bulma konusunda 1/200 ila 1/1000 arasında bir şey. Ayrıca, yanlış bir pozitif aldığımda, kod tabanında veya çerçevede binlerce noktada kullanılan bir şey olduğunu ve yalnızca tam olarak güvenle dolu olmadığım bir avuç tespit etti. Sorun, spec # gibi resmi bir dille başlamadıkça, bu araçlardan birini oluştururken, Negatif bir kanıtı etkin bir şekilde uygulamanızdır.
Bill

33

Dinamik diller savunma ve askeri uygulamalarda kullanılabilir. DoD uygulamalarında şahsen Perl ve Python kullandım ve sundum. PHP ve JavaScript kullanmış ve konuşlandırılmış olarak da gördüm. Deneyimlerime göre, gördüğüm derlenmemiş kodun çoğu, kabuk ortamlar ve Perl olmuştur, çünkü gerekli ortamlar çeşitli olası hedef sistemlere onaylanmış ve yüklenmiştir.

Bu dillerin dinamik olması büyük olasılıkla sorun değil. Bu dillerin tercümanlarının hedef sistemlerde kullanılması onaylanmalıdır. Tercümanın kullanımı onaylanmadıysa (veya belki de öyle ise, ancak hedef sistemlerde kullanılmıyorsa), dil kullanılamaz. Belirli bir tercümanın (veya herhangi bir uygulamanın) güvenli bir sistemde kullanılması, herhangi bir sayıda güvenlik engeli gerektirir: kaynağın analizi, hedef ortamlar için kaynaktan derleme yeteneği, ikili dosyaların ek analizi, mevcut altyapı ile çakışma olmaması vb.


32

F-16’nın MMU’su için pozisyon yazım kodu için DOD’la (Savunma Bakanlığı) görüşme yaptım . Açıklamaları ihlal etmeden: MMU, F-16'nın neredeyse tüm fonksiyonlarını kontrol eden bilgisayar birimidir. (Açıkça görüldüğü üzere) uçuş sırasında çalışma zamanı hataları gibi hiçbir hatanın oluşmaması kritiktir. Sistemin gerçek zamanlı bilgi işlem işlemleri gerçekleştirmesi de aynı derecede önemlidir.

Bu ve diğer tarihsel nedenlerden dolayı, bu sistem için tüm kodlar statik bir nesne yönelimli programlama dili olan ADA'ya yazılır veya derlenir .

Ada'nın güvenlik açısından kritik destek özellikleri nedeniyle, artık sadece askeri uygulamalar için değil, aynı zamanda bir yazılım böceğinin ciddi sonuçları olabileceği ticari projelerde de kullanılmaktadır, örneğin aviyonik ve hava trafik kontrolü, ticari roketler (örneğin Ariane 4 ve 5), uydular ve diğer uzay sistemleri, demiryolu taşımacılığı ve bankacılık. Örneğin, Boeing 777'deki uçtan uca sistem yazılımı Ada'da yazılmıştır.

Çok fazla alıntı yapmaktan nefret ediyorum ama bu gerçekten statik dillerin (ADA gibi) neden bu gibi projeler için kullanıldığını açıklıyor:

Diğer dillerde çalışma zamanına kadar tespit edilemeyen veya kaynak koduna ekli kontroller yapılmasını gerektiren hataların önlenmesine yardımcı olmak için çok sayıda derleme zamanı kontrolü desteklenir. Örneğin, sözdizimi, eşleşmeyen bitiş belirteçlerinden kaynaklanan hataları önlemek için açıkça adlandırılmış blokların kapatılmasını gerektirir. Güçlü yazmaya uyma, derleme sırasında veya çalışma zamanı sırasında birçok genel yazılım hatasının (yanlış parametreler, aralık ihlalleri, geçersiz referanslar, yanlış eşleşmiş türler vb.) Tespit edilmesini sağlar. Eşzamanlılık dil belirtiminin bir parçası olduğundan, derleyici bazı durumlarda olası kilitlenmeleri algılayabilir. Derleyiciler aynı zamanda yanlış yazılmış tanımlayıcıları, paketlerin görünürlüğünü, fazladan bildirimleri vb. Kontrol ederler ve hatanın nasıl düzeltileceğine dair uyarılar ve faydalı önerilerde bulunabilirler.

Ada, ayrılmamış belleğe, arabellek taşması hatalarına, aralık ihlallerine, birer birer hatalara, dizi erişim hatalarına ve diğer algılanabilir hatalara karşı koruma sağlamak için çalışma zamanı kontrollerini de destekler. Bu kontroller çalışma zamanı verimliliği açısından devre dışı bırakılabilir, ancak genellikle verimli bir şekilde derlenebilir. Ayrıca, program doğrulamasına yardımcı olacak olanaklar da içerir. Bu nedenlerden dolayı Ada, herhangi bir anomalinin kazara ölüm, yaralanma veya ağır finansal kayıp gibi çok ciddi sonuçlara yol açabileceği kritik sistemlerde yaygın olarak kullanılmaktadır. Ada'nın kullanıldığı sistemlere örnekler arasında aviyonik, demiryolları, bankacılık, askeri ve uzay teknolojisi sayılabilir.

Ada'nın dinamik bellek yönetimi yüksek seviyede ve güvenlidir. Ada genel (ve belirsiz) "işaretçiler"; ve dolaylı olarak herhangi bir işaretçi türü de ilan etmez. Bunun yerine, tüm dinamik bellek ayırma ve ayırma işlemlerinin açıkça bildirilmiş erişim türleri aracılığıyla yapılması gerekir. Her erişim türünde, bellek yönetimi alt düzey ayrıntılarını işleyen ilişkili bir depolama havuzu bulunur; programcı ya varsayılan depolama havuzunu kullanabilir ya da yenilerini tanımlayabilir (bu, özellikle Düzgün Olmayan Bellek Erişimi için geçerlidir). Hepsi aynı tipte olan ancak farklı depolama havuzları kullanan birkaç farklı erişim tipi bildirmek bile mümkündür. Ayrıca, dil, hem derleme zamanında hem de çalışma zamanında bir erişim değerinin işaret ettiği nesnenin tipini geçememesini sağlayan erişilebilirlik kontrolleri sağlar.


3
“Ada'nın güvenlik açısından kritik destek özellikleri nedeniyle, şimdi ticari roketlerde kullanılıyor (örneğin Ariane 4 ve 5)” , elbette ilk yazılım olan Ariane 5 bir yazılım hatası nedeniyle patladı , bu yüzden gümüş mermi yoktu.
Andrew Marshall

5
@AndrewMarshall: "Rapor doğrudan bir neden olarak bir yazılım hatası tanımlasa da, diğer araştırmacılar nedenleri sistem tasarımı başarısızlıkları ve yönetim sorunları olarak görüyorlar" - Farklı bir dilde (örneğin, Java veya C ++) yazılmış olan kodun almış olacağından şüpheliyim. roket yörüngeye.
Martin Schröder

@ MartinSchröder Oh, Ada'nın bu uygulama için hala diğerlerinden daha üstün olduğundan şüphelenmiyorum, aptal olmadığına dikkat çekiyorum. Başka bir dil Ada'da mümkün olmayan sayısız hatadan geçebilirdi.
Andrew Marshall

13

Hem DoD hem de NASA, milyarlarca dolara mal olan programlama başarısızlığıyla uzun bir geçmişe sahip. Her iki kurum da aynı hataları tekrar etmekten korumak zorunda olan süreçleri kabul etti.

Is this the government being slow to adopting new technologies?

Bu bir yanılgıdır - dinamik diller yeni bir teknoloji değildir, oldukça eskidir. Sorun şu ki, dinamik bir dilin neden olduğu bir sorun yaşarsanız (örneğin zayıf / dinamik yazarak) ve bu sorun size çok paraya mal olursa, aynı hatayı tekrar yapmanızı önleyen bir politika kabul edersiniz. Dinamik dillerin hassas sistemlerde kullanılmasının yasaklanması.

Dinamik diller genellikle böcekleri "yutar" ve beklenmedik davranışlarla sonuçlanır. Bu hassas sistemlerde çok tehlikelidir. Eğer yanlış bir şeyler oluyorsa, mümkün olan en kısa sürede bilmek istersiniz.

Güvenlik söz konusu ise, fiili kullanım durumunun görülmesi gerekecektir. Örneğin, Ruby on Rails web sayfasının Java web sayfasından otomatik olarak daha az güvenli olacağını sanmıyorum.


2
IMHO Daha fazla hata sadece söyleyerek ... tam en dinamik diller ilk etapta izin vermeyecektir şeydir her şeyden daha tespit edilmemiş tampon taşmaları, tarafından "yutulması" edilmiş
miraculixx

@miraculixx Doğru, Java / C # ve benzeri dillerin Ruby'den çok daha fazla kullanılmasının bir nedeni var. Savunmacılar - her şeyi kontrol ediyorlar. C / C ++ 'da savunuculuk, iyi bir kodlama standardı kullanılarak zorlanabilir. Ayrıca her şey için çekler uygulayabilirsiniz. Ancak, yakut veya javascript'te hassas bir uygulama yazmayı hayal edebiliyor musunuz? Gizli hataların olasılığı harika.
Sulthan

Gerçekten yapabilirim. Programlama dilinden bağımsız olarak yazılımın ayrıntılı bir şekilde test edilmesi gerektiği konusunda hemfikiriz. Regresyonlardan kaçınmak için, test en iyi şekilde örneğin birim test, BDD ve ark. Profesyonel bir yaklaşım varsayarak (hassas uygulama, doğru?), Yeterli test kapsamı elde etmek, şansa bırakılmayan yönetilen bir süreçtir. Bununla beraber, C / C ++, Java'nın ruby ​​veya javascript gibi gizli hatalar açısından bir avantajı olduğundan şüpheliyim. Programcı becerileri? C ++ ile muhtemelen daha teknik, Java ile şüpheli, ancak pek bir dil sorunu. Daha fazla teknik bilgi = ürün kalitesi.
miraculixx

6

SQL enjeksiyonunu ve nihayetinde keyfi kod yürütülmesini sağlayan oldukça kritik bir güvenlik açığı olan Drupal'ın SA-CORE-2014-005'i açıklayarak mevcut cevapları eklemek istiyorum . PHP'nin dinamik yazma ve gevşek çalışma zamanı yazma kurallarından kaynaklanır.

Bu konuyla ilgili yamanın tamamı:

-      foreach ($data as $i => $value) {
+      foreach (array_values($data) as $i => $value) {

Bu kod, SQL enjeksiyonunu önlemek için tasarlanmış bir SQL soyutlama katmanının bir parçasıdır. Adlandırılmış parametrelerle bir SQL sorgusu ve adlandırılmış her parametre için bir değer sağlayan bir ilişkisel dizi alır. Değer, örneğin WHERE x IN (val1, val2, val3)üç değerin hepsinin tek bir adlandırılmış parametre için tek bir dizi değeri olarak geçirilebileceği durumlar için bir dizi olmasına izin verilir .

Güvenlik açığı, kodun $iiçinde $i => $valuedeğerin bir tamsayı dizini olması gerektiğini varsaydığı için oluşur . Devam eder ve bu "indeksi" doğrudan SQL sorgusu ile bir parametre adının parçası olarak birleştirir, çünkü tamsayıların kaçması gerekmez, değil mi?

Ne yazık ki Drupal için PHP böyle bir garanti vermemektedir. Anahtarları dize olan başka bir ilişkisel diziye geçmek mümkündür ve bu döngü dize anahtarını sorguda olduğu gibi mutlu bir şekilde birleştirir (kodun sadece bir tam sayı olabileceğini düşündüğünü unutmayın).

Statik olarak yazılmış bir dilde benzer bir hatayı yaşamanın yolları olsa da, muhtemel değildir. İyi bir geliştirici $i, sorguda birleştirmeden önce olası şeylerin neler olabileceğini düşünecektir . Statik olarak yazılmış bir dille, $ibir tamsayı olması gerektiğini ve bunun gibi güvenlik açısından hassas bir kodda uygulanması kesinlikle çok kolay .

Ayrıca, kod aslında öğelerin üzerinde yineleme yapmadan önce değerin bir dizi olup olmadığını kontrol eder. Ve burada, bu güvenlik açığını etkinleştiren hatanın ikinci bir parçası yatıyor: hem bir ilişkisel dizi hem de "normal" bir dizi için doğru is_array. Hem sözlüklerde hem de dizilerde C # 'da doğru olsa da IEnumerable, yanlışlıkla yanlışlıkla bile olsa, sözlük anahtarlarını kasıtlı olarak bile bu gibi indeks indeksleriyle birleştirecek kod oluşturmak zor.


2

Bir kod tabanının güvenli olup olmadığı kodunuzu nasıl yazdığınıza, nasıl test ettiğinize ve geliştirme ve dağıtım işleminizi nasıl doğruladığınıza ve izleyeceğinize bağlıdır. Diller ne güvenli ne de güvensiz, ne şekilde kodlarsınız.

Kötü niyetli girdilerden (sql enjeksiyonları, tampon taşmaları), virüslerden, rootkitlerden ve truva atlarından kaynaklanan güvenlik olaylarının çoğunluğu. Hiçbir dil sizi bundan koruyamaz.

Bu nedenle, dil sınıflarının "güvensiz" olmalarının yasaklanması geçerli bir neden değildir.

Bir kimsenin, ne sebeple olursa olsun - bilgilendirilmiş olsun ya da olmasın - bu dilleri yasaklamaya karar verdiğinden şüpheleniyorum. Bir süre sonra örgütsel bir gerçek haline geldi . Bazı projeler için o zamanlar doğru olabilirdi, ancak kontrol kültürleri değişen kararlara hevesli değiller (yanlış olduklarını kabul ediyorlar) ve daha ziyade basit kuralları tercih ediyorlar. Onlar kural ve düzenlemelere gelişmek ve onu yok onlar mantıklı olmadığını fark, öyle algılanan güvenlik sayar.

Bu kontrol kültürlerinde her zaman olur. Her gün az ya da çok görüyorum. Hiçbir anlamı yok, ama işte böyle gidiyor. Bu konu ile ilgili daha fazla şey okumak istiyorsanız, Schneider'in " Yeniden Yapılanma Alternatifleri " kitabını öneririm . İşte Schneider'in kitabına dayanan Michael Sahoto / Agilitrix tarafından hazırlanan bir kültür diyagramı : görüntü tanımını buraya girin


18
-1 Güvenlik kritik sistemler için bir dilin başka bir dilde (gerçek zamanlı, statik yazarak, çalışma zamanı kontrolleri) seçilmesinin birçok geçerli teknik nedeni vardır. Sebeplerin% 100 kültür olduğunu, bize karşı bizleri ve keyfi olarak IMO'nun bu durumda tamamen yanlış olduğunu ima edersiniz.
Michael Jasper

8
"Diller güvenli değil ya da güvensiz" - bkz. Stackoverflow.com/a/14313277/602554 . Bazı diller kesinlikle diğerlerinden daha "güvenli" dir.
Michael Jasper

2
Cevabımı güncelledim, belki de beğeninize. Bir sistemin ne kadar güvenli olduğuna, hala hangi dili kullandığınıza nazaran yazdığınız koda bağlı olduğuna inanıyorum, ancak bazı diller bazı problemleri önlemeye yardımcı oluyor (muhtemelen başkalarını da tanıttı).
Martin Wickman

2
@MartinWickman: a) SQL / HTML enjeksiyonları ve tampon taşmaları bazı tip sistemler tarafından çözülür - kaçan ve çıkmamış giriş için farklı tipleriniz vardır, böylece hangisine ne şekilde davranılması gerektiğini bilirsiniz. b) 'güvenli projelerdeki' tüm güvenlik sorunları mutlaka bir uzlaşma anlamına gelmez. 'Güvenlik' sorunu olmasa bile uçağı çalıştıran yazılımın herhangi bir hata yaşamasını istemiyorum (yani sistemi ele geçirmek için kullanılamaz).
Maciej Piechotka

5
Gerçek doğruluk problemleri için -1. Arabellek taşması istismarları, C diline özgü bir problemdir; yığında bir dizge tamponu ayırmanıza izin vermeyen dillerde asla duymazsınız. Parametrelerin kullanımına basit bir şekilde izin verilmediği, ancak gerekli olduğu varsayımsal bir SQL lehçesi hayal etmek hiç de zor değil . SQL enjeksiyonu bu dilde imkansız olurdu. Yani evet, düzgün tasarlanmış dil olabilir saldırıların birkaç yaygın türlerinden sizi korumak.
Mason Wheeler

2

Söyleyebileceğim kadarıyla, resmi Savunma Bakanlığı politikası, genel olarak dinamik dilleri yasaklamıyor.

DoD tarafından geliştirilen veya tedarik edilen yazılım standartları, Savunma Bilgi Sistemleri Ajansı (DISA) tarafından yayımlanır . Onların Uygulama Güvenliği - Uygulama Güvenlik ve Geliştirme Güvenlik Teknik Uygulama Kılavuzu (Stig) herhangi bir dili yasaklamak değil. Ruby'den bahsetmiyor, ancak benzer şekilde dinamik olan Perl ve Python'dan bahsediyor. Onlara çeşitli konular bağlamında değinmektedir (Kodlama Standartlarını takip ederek, Komuta Enjeksiyon Güvenlik Açıklarından kaçınılması, vb.).

Muhtemelen gördüğünüz şey, çok katı bir tarama aracıdır (STIG'de belirtilen, her biri kuralların kendi yorumuna sahip olabilir) ve / veya çıktısının çok katı bir şekilde yorumlanması olabilir.

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.