AWS - Lambda Layers Persistence
Lambda Katmanları
Bir Lambda katmanı, ek kod veya diğer içeriği içerebilen bir .zip dosyası arşividir. Bir katman, kütüphaneler, özel çalışma zamanı, veri veya yapılandırma dosyaları içerebilir.
Bir fonksiyonda beş katmana kadar dahil edilebilir. Bir katmanı bir fonksiyona dahil ettiğinizde, içerikler yürütme ortamında /opt
dizinine çıkarılır.
Varsayılan olarak, oluşturduğunuz katmanlar AWS hesabınıza özeldir. Bir katmanı diğer hesaplarla paylaşabilir veya katmanı genel yapabilirsiniz. Eğer fonksiyonlarınız, farklı bir hesabın yayınladığı bir katmanı tüketiyorsa, fonksiyonlarınız katman sürümünü silindikten sonra veya katmana erişim izniniz iptal edildikten sonra kullanmaya devam edebilir. Ancak, silinen bir katman sürümünü kullanarak yeni bir fonksiyon oluşturamaz veya mevcut fonksiyonları güncelleyemezsiniz.
Bir konteyner görüntüsü olarak dağıtılan fonksiyonlar katmanları kullanmaz. Bunun yerine, görüntüyü oluştururken tercih ettiğiniz çalışma zamanını, kütüphaneleri ve diğer bağımlılıkları konteyner görüntüsüne paketlersiniz.
Python yükleme yolu
Lambda'da Python'ın kullanacağı yükleme yolu aşağıdaki gibidir:
İkinci ve üçüncü pozisyonların lambda katmanları tarafından dosyalarının açıldığı dizinleri kontrol edin: /opt/python/lib/python3.9/site-packages
ve /opt/python
Bir saldırgan, kullanılan bir lambda katmanını geri kapı olarak kullanmayı başarırsa veya bir tane eklerse ve bir ortak kitaplık yüklendiğinde keyfi kod yürütülüyorsa, her lambda çağrısıyla kötü amaçlı kodu yürütebilir.
Bu nedenle, gereksinimler şunlardır:
Kurbanın kodu tarafından yüklenecek kitaplıkları kontrol edin
Lambda katmanlarıyla birlikte çalışacak bir proxy kitaplık oluşturun ve özgün kitaplığı yürütün.
Önceden yüklenmiş kitaplıklar
Bu teknikleri kötüye kullanırken bir zorlukla karşılaştım: Bazı kitaplıklar, python çalışma zamanında kodunuzun yürütüldüğünde zaten yüklenmiş durumdadır. os
veya sys
gibi şeyler bekliyordum, ancak hatta json
kitaplığı bile yüklendi.
Bu kalıcılık tekniğini kötüye kullanmak için, kodun yürütüldüğünde yeni bir kitaplık yüklemesi gerekmektedir.
Aşağıdaki gibi bir python koduyla lambda içindeki python çalışma zamanında önceden yüklenmiş kitaplıkların listesini elde etmek mümkündür:
Ve işte liste (zaten os
veya json
gibi kütüphanelerin olduğunu kontrol edin)
Ve bu, lambda'nın varsayılan olarak yüklenmiş olduğu kütüphanelerin listesidir: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Lambda Katmanı Geri Kapı
Bu örnekte hedeflenen kodun csv
'yi içe aktardığını varsayalım. csv
kütüphanesinin içe aktarımını geri kapılayacağız.
Bunu yapmak için, lambda tarafından yüklenen bir yol olan /opt/python/lib/python3.9/site-packages
içinde __init__.py
adlı bir dosya ile csv adında bir dizin oluşturacağız.
Ardından, lambda çalıştırıldığında ve csv yüklenmeye çalışıldığında, __init__.py
dosyamız yüklenecek ve çalıştırılacak.
Bu dosya şunları yapmalıdır:
Payload'ımızı çalıştırın
Orijinal csv kütüphanesini yükleyin
Her ikisini de şu şekilde yapabiliriz:
Ardından, bu kodu python/lib/python3.9/site-packages/__init__.py
yolunda içeren bir zip oluşturun ve bir lambda katmanı olarak ekleyin.
Bu kodu https://github.com/carlospolop/LambdaLayerBackdoor adresinde bulabilirsiniz.
Entegre edilmiş payload, lambda konteynerinin ilk kez çağrıldığında veya lambda konteynerinin sıfırlanmasından sonra (kod değişikliği veya soğuk lambda) IAM kimlik bilgilerini bir sunucuya gönderecektir, ancak aşağıdaki gibi diğer teknikler de entegre edilebilir:
AWS - Steal Lambda RequestsHarici Katmanlar
Dikkat edilmesi gereken nokta, harici hesaplardan lambda katmanları kullanmanın mümkün olmasıdır. Dahası, bir lambda, izinlere sahip olmasa bile harici bir hesaptan bir katman kullanabilir. Ayrıca, bir lambdanın sahip olabileceği maksimum katman sayısı 5'tir.
Bu nedenle, saldırganın bu tekniklerin kullanışlılığını artırmak için şunları yapması mümkündür:
Kullanıcının mevcut bir katmanını backdoorlamak (hiçbir şey harici değil)
Kendi hesabında bir katman oluşturmak, kurban hesabına erişim vermek için katmanı kullanmasına izin vermek, katmanı kurbanın Lambda'sında yapılandırmak ve izinleri kaldırmak.
Lambda, hala katmanı kullanabilecek ve kurbanın katmanın kodunu indirmenin kolay bir yolunu (lambda içinde bir ters kabuk almadıkça) olmayacak.
Kurban,
aws lambda list-layers
ile kullanılan harici katmanları görmeyecektir.
Last updated