Lütfen bilgisayar güvenlik görevlileri için dilinizi analiz edilebilir / denetlenebilir hale getirin.
Güvenlik görevlileri, bir program gönderilmeden önce güvenlik açıklarını bulabilmeli. İdeal olarak, biz erken aranırız ve kod temeli üzerinde geliştikçe yorum yapabilir, ancak sıklıkla değil.
Dilin veya çekirdek kitaplıkların yeni bir sürümü çıktığında, daha önce güvenli olan şeyler artık olmayabilir:
- kitaplıklar daha güçlü olabilir: örneğin, URL kitaplığı artık desteklemektedir
javascript:
- dizeleri veya baytları koda dönüştürmenin yeni yolları olabilir: örneğin
eval
seri kaldırma kütüphaneleri
- dil yansıtma teknikleri daha güçlü olabilir: örneğin, yerel değişkenleri açığa çıkarma
Bu değişikliklerden herhangi biri bir programın kötüye kullandığı otorite miktarını artırabilir, ancak programın kullandığı otorite miktarı (kötü amaçlı olmayan müşterilerle çalışırken) değişmediğinden, güvenlik halkının yoğun bir şekilde ortaya çıkmadan anlaşılması zor yeniden denetim.
Bu yüzden, lütfen dili tasarlarken ve versiyonlarken bizi düşünün. Aşağıda birkaç ipucu:
Bir programın içinde parçalanabileceği birkaç ilkel tanımlayın.
HTML5 bu şekilde özellikle kötü. Onlar belli güvenlik içine düşünce bir sürü koyun ve bazı çok akıllı insanlar var, ancak bunun yerine gibi yeni bir program elemanlarını belirtmek gelmiş <video>
eskilerin açısından veya yeni bir ortak soyutlama yaratarak <video>
ve eski <img>
açısından daha belirtilebilir, <video>
henüz kendi güvenlik sonuçlarıyla bir başka bir kereye mahsus program öğesi.
Dilinizi statik analize uygun hale getirin (statik olarak yazılmamış olsa bile).
Güvenlik halkı, kalıpları bulmak ve gerçekten zorlu parçalara odaklanabilmeleri için bir programın parçalarını denemek ve dışlamak için genellikle statik analizi kullanır.
Hangi tanımlayıcıların yerel değişken olduğu ve hangilerinin olmadığı açık olmalıdır.
Örneğin, x
aşağıdaki yerel bir değişken olup olmadığını söylemeyi imkansız hale getiren eski JavaScript sürümleriyle aynı hatayı yapmayın (spec'in eski sürümünün hazır bilgi okumasına göre):
if (Math.random() > 0.5) {
Object.prototype.x = 0;
}
function f() {
var x = 1;
(function () {
alert(x); // Might alert 0, might alert 1.
})();
}
Ayrıştırılabilir güvenlik için izin ver
Güvenlik özelliklerini koruyan güvenli bir çekirdek etrafında birçok güvenli sistem tasarlanır, böylece güvenlik halkı, az miktarda bir kodu analiz etmeye ve programcıların çoğunu {sinir bozucu, sersemletici, paranoyak} güvenlik halkı ile uğraşmaktan kurtarmaya yönelik çabalarına odaklanabilir .
Böyle bir çekirdeği kendi dilinizde yazmak mümkün olmalıdır. Dilinizin güvenlik özelliklerinden biri, yalnızca belirli bir URL alt kümesinin getirileceği durumdaysa, çekirdek yazarlar tüm URL’lerin kodlarını getirerek kanalize etmek için bir şeyler yapabilir mi? Veya statik derleme kontrolleri (ithalatlara bakmak gibi) aynı işlevi görür.
Newspeak gibi bazı diller bir nesne yetenekleri modeli kullanır. Bu harika ve ayrıştırılabilir güvenlik elde etmek için harika bir yol.
Ancak, bunu yapamazsanız, modül grafiğini statik olarak analiz edilebilir bir eser haline getirmek size biraz yarar sağlar. Bir modülün dosya G / Ç modülüne ulaşamadığını ispatlayabilirsem (TCB'deki bir modülde kod çağırmak hariç), o zaman bu modülden tüm sorun sınıflarını ekarte edebilirim.
Katıştırılmış komut dosyası dillerinin yetkisini sınırlandırın
Çok sayıda yararlı sistem, dinamik (hatta işlevsel) dillerde yazılmış çok sayıda kodu başlatan statik bir çekirdek olarak düzenlenir.
Ve komut dosyası dillerinin gömülmesi bir sistemi çok daha genişletilebilir hale getirebilir.
Ancak bir betik dili, VM'nin tam yetkisine sahip olmamalıdır.
Katıştırılmış komut dosyası dillerine izin vermeyi tercih ederseniz, istilacının yapabileceklerini sınırlandırmasını kolaylaştırın. Bir nesne yetenekleri modeli (yukarıdaki Newspeak hakkındaki yoruma bakınız) burada çok uygundur; bu nedenle, kodlama dilinde bir kod değerlendirilirken, arayan kişinin yürütmek üzere koddan ve bu kodun tüm genel değişkenlerinden geçmesi gerekir .
eval
Kendisini bir betik dili olarak yerleştiren bir dil gibi davran
Diliniz bir dizgiyi koda dönüştürmek için kendi derleyicisini çağırabilirse, gömülü bir betik diliyle aynı şekilde işaretlenmesini sağlayın.
Basit bir eşzamanlılık modeli kullanın
Biz güvenlik görevlileri, bir güvenlik mülkünün korunup korunmadığını anlamaya çalışırken yarış koşulları hakkında endişelenmek zorunda değiliz.
Lütfen dişlere takmadan önce diş açmaya alternatifleri neredeyse güvenli bir varsayılan seçenek olarak düşünün.
Basit bir tanesi, E, Verilog ve JavaScript'te olduğu gibi olay döngüsü eşzamanlılığıdır.
Karışıklık alıntı alıntı yapmayın
Bazı diller tutkal dilleridir ve çok sayıda farklı dilde karakter dizileriyle uğraşırlar.
Örneğin, JavaScript genellikle HTML, CSS, XML, JSON ve hatta JavaScript dizelerini oluşturur. Programcıların, diğer dillerde dizeleri yapmak için bunları birleştirirken düz metin dizelerini düzgün bir şekilde kodlamayı hatırlamaları çok zordur, bu nedenle JS programları, şaşırtıcı olmayan bir şekilde, her türlü alıntı karışıklığı sorununu yaşar: XSS en kötüsüdür.
Dize bileşimi özelliklerini eklemek istiyorsanız , programcının güvenlik yükünü azaltmaya çalışın. DSL'ler, hijyenik makrolar ve gömülü şablonlama dilleri, kütüphane veya dil geliştiricilere düzgün bir şekilde kaçmak için yükü taşıyarak ve son geliştiriciden uzağa taşıyarak bunu yapmanın harika bir yolu olabilir.