SORU
5 Ocak 2010, Salı


Güvenli C yazma ve Güvenli C Cümleler

"Ortalama bir insan özgür olmak istemiyor. O sadece güvende olmak istiyor." - H. L. Menken

Kullandığım bazı teknikler listesi Aşağıda çok güvenli C. yazıp olduklarını düşündüğüm kadar güvenli değildir etmeyi deniyorum. Lütfen parçalara kodu/önyargılarım yüzünden gözyaşı için tereddüt etmeyin. Hatta en önemsiz güvenlik açığı bulur ya bana öğrettiği her cevap yeni bir fikir olacaktırson derece değerli.

Bir akışından okuma:

GNU C Programming Tutorial getline göre:

Olacak getline işlevi otomatik olarak büyütmek bloğu , realloc ile gerekli bellek gibi hiç bir sıkıntısı yoktur çok fonksiyon uzay getline olmasının bir nedeni ... çok güvenli. [..] Getline fark olabilir güvenli bir şekilde giriş kolunuz, hayır işlemek ne kadar olursa olsun.

Bu getline gerekir sanırımtüm girişler altındabir yayını okurken oluşmasını buffer overflow bir engel.

  • Benim varsayım doğru mu? Bu bir neden olabilir giriş ve/veya Ayırma düzenleri istismar var mı? Eğer akışından ilk karakter bizarre control character, belki 0x08 BACKSPACE ise bazı örnek (ctl-H).
  • Yapılmış herhangi bir çalışma matematiksel olarak güvenli olarak getline kanıtlamak zorunda?

Malloc Hatası Null Döndürüyor:

Eğer malloc karşılaşırsa bir hata malloc NULL bir işaretçi döndürür. Bu hala (0x0) NULL bir işaretçi işaretçi aritmetiği uygulamak, recommends wikipedia böylece bu yana bir güvenlik riski oluşturur

/* Allocate space for an array with ten elements of type int. */
int *ptr = (int*)malloc(10 * sizeof (int));
if (ptr == NULL) {
    /* Memory could not be allocated, the program should handle 
       the error here as appropriate. */
} 

Güvenli sscanf:

sscanf kullanırken boyutu-n giriş dizesi umarım bir taşma olasılığı kaçınarak boyutuna dizeleri ayırma alışkanlığı aldım. Örneğin:

const char *inputStr = "a01234b4567c";
const char *formatStr = "a%[0-9]b%[0-9]c":
char *str1[strlen(inputStr)];
char *str2[strlen(inputStr)];

sscanf(inputStr, formatStr, str1, str2);

Str1 ve str2 inputStr boyutunu ve strlen(inputStr) inputStr okunabilir en fazla karakter olduğundan, imkansız, verilmiş gibi görünüyortüm olası değerlerbir arabellek neden inputStr için taşma?

  • Doğru muyum? Düşünmediğim garip köşe durum var mı?
  • Bu yazmak için daha iyi bir yolu var mı? Çoktan çözmüş bu kütüphaneler?

Genel Sorular:

Sorular çok sayıda gönderdiniz olsa herkes hepsini cevap beklemiyorum. Sorulara aradığım cevaplar sıralar için Rehber. Gerçekten güvenli C zihniyet öğrenmek istiyorum.

  • Diğer güvenli C cümleler orada ne var?
  • Hangi köşe durumlarda gerekiyorher zaman kontrol edin?
  • Nasıl bu kuralları uygulamak için birim testleri yazabilirim?
  • Nasıl ya da kanıtlanabilir doğru test edilebilir bir şekilde kısıtlamaları uygulayabilir miyim?
  • C için herhangi bir tavsiye statik/dinamik analiz teknikleri veya araçları?
  • Güvenli C uygulamaları takip ne ve nasıl kendine ve başkalarına haklı mı?

Kaynaklar:

Birçok kaynak cevapları Ödünç alınmış.

CEVAP
9 Ocak 2010, CUMARTESİ


  1. Bir akışından okuma

Aslında o getline() "otomatik olarak büyütmek blok bellek gerektiği gibi" anlamına gelen bu olabilir kullanılan bir hizmet reddi saldırısı gibi olur önemsiz oluşturmak için bir giriş bu kadar uzun olacağını egzoz mevcut bellek işlemi (ya da daha kötüsü, sistem!). Yetersiz bellek durumu oluşur sonra, diğer açıkları da oyun haline gelebilir. Düşük/kod davranışı hayır bellek nadiren güzel, ve tahmin etmek çok zor. IMHO özellikle güvenlik duyarlı uygulamalar her şeyi makul bir üst sınır konulmalıdır, daha güvenlidir.

Ayrıca (olarak tahmin söz ederek özel karakterler), getline() verir misin bir tampon; yok olun herhangi bir garanti hakkında içeriğini tampon (as güvenliği tamamen uygulamaya bağlı). Yani girişi sanitising hala işleme ve doğrulama kullanıcı verilerinin önemli bir parçasıdır.

  1. sscanf

Düzenli ifade Kütüphanesi kullanmayı tercih eğiliminde olacaktır, ve dar bir kullanıcı verisi yerine 6 ** kullanmak için regexps tanımlamış. Bu şekilde giriş sırasında doğrulama iyi bir anlaşma yapabilirsiniz.

  1. Genel yorumlar

    • Fuzzing araçları giriş, kullanım, test için kullanılan rasgele giriş oluşturmak için kullanılabilir (hem geçerli hem de geçersiz
    • Yönetim kritik Buffer: arabellek taşmaları, underflows, bellek
    • Yarış koşulları aksi takdirde güvenli bir kod olarak kullanılabilir
    • İkili dosya biçimi kod kaya gibi sağlam olmalı o yüzden başlıklar halinde geçersiz değerler ya da büyük değerleri enjekte, ve ikili veri geçerli olduğunu varsayalım değil manipüle edilebilir
    • Geçici dosyalar genellikle güvenlik sorunlarının kaynağı olabilir, ve dikkatli bir şekilde yönetilmesi gerekir
    • Kod enjeksiyon sistemi yerine ya da kötü amaçlı sürümleri ile kütüphane çalışma zamanı çağrıları için kullanılabilir
    • Eklentileri saldırı için büyük bir vektör bulunur
    • Bir genel ilke, program önereceğim olması açıkça tanımlanmış arayüzleri kullanıcı verileri (veya herhangi bir veri dışından uygulama) geçersiz kabul edilir ve düşmanca kadar işlenmiş, sanitised ve onaylanmış, ve tek yolu için kullanıcı veri girmek için bir uygulama

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HTC

    HTC

    12 Ocak 2006
  • Tech4Geeks

    Tech4Geeks

    8 Ocak 2012
  • thetrollska

    thetrollska

    2 EKİM 2009