Lua Engine’deki Kritik Güvenlik Açıkları İçin PoC İstismarı Yayınlandı


Redis 7.4.5 tarafından kullanılan Lua komut dosyası oluşturma motorundaki üç ciddi güvenlik açığı için yeni bir kavram kanıtı istismarı yayımlandı.

Güvenlik araştırmacıları, saldırganların Lua ayrıştırıcısındaki, unpack() işlevindeki ve temel türdeki meta tabloların korunmasındaki kusurları kötüye kullanarak uzaktan kod yürütmeyi ve ayrıcalık yükseltmeyi tetikleyebileceğini keşfetti.

Bu sorunlar, EVAL komutu aracılığıyla güvenilmeyen komut dosyalarına izin veren ve anında yama uygulanmasını gerektiren sistemler için doğrudan bir tehdit oluşturur.

Redis 7.4.5’in rutin denetimi sırasında Lua motorunda üç kritik kusur bulundu. İlki, CVE-2025-49844, Lua ayrıştırıcısında serbest kullanım sonrası bir kusur içeriyor.

Komut dosyalarını ayrıştırırken motor, yığında koruma altına almadan bir TString nesnesi ayırır.

Bir çöp toplama döngüsü bu nesneyi çok erken serbest bırakabilir ve saldırganın belleğin üzerine yazmasına ve rasgele kod çalıştırmasına olanak tanır.

İkinci kusur olan CVE-2025-46817, unpack() işlevindeki tamsayı taşmasından kaynaklanmaktadır. Saldırgan aşırı endeks değerleri sağlayarak Lua yığınını bozabilir ve kontrol akışını ele geçirebilir.

Üçüncüsü, CVE-2025-46818, metatablo değişikliği yoluyla ayrıcalık yükseltmeyle ilgilidir. Dizeler, sayılar ve diğer temel öğeler için çekirdek türü metatablolar değiştirilebilir ve diğer kullanıcıların bağlamlarında çalışan kötü amaçlı kodlar enjekte edecek şekilde değiştirilebilir.

Teknik Detaylar

Serbest bırakıldıktan sonra kullanma sorunu deps/lua/src/lparser.c dosyasının 387. satırında ortaya çıkıyor. Ham ayrıştırıcı kodu luaS_new(L, name) öğesini çağırır ancak sonucu Lua yığınına aktaramaz ve korumasız bırakır.

Buna karşılık, yamalı sürüm, yeni dizeyi korumak için ayrıştırmadan önce setvalue2s(L, L->top, tname) ve incr_top(L)’yi kullanır.

deps/lua/src/lbaselib.c dosyasındaki tamsayı taşması güvenlik açığı, öğe sayısını n = e – i + 1 olarak yanlış hesaplıyor ve e çok büyük olduğunda taşma oluyor.

Bu hata, yığın sınırlarının ötesinde yazmaya yol açar. Metatablo sorunuyla ilgili olarak, src/script_lua.c ve src/eval.c dosyalarında temel türdeki metatablolara yazmayı önleyecek kontroller yoktu ve bu da yetkisiz kod enjeksiyonuna olanak sağlıyordu.

Aşağıda bu güvenlik açıklarını özetleyen kısa bir tablo bulunmaktadır:

CVE Güvenlik Açığı Darbe Kullanım Önkoşulları CVSS 3.1 Puanı
CVE-2025-49844 Lua Ayrıştırıcıda Ücretsiz Kullanım Sonrası Uzaktan Kod Yürütme EVAL erişimi 9.8
CVE-2025-46817 unpack()’te Tamsayı Taşması Uzaktan Kod Yürütme EVAL erişimi 9.8
CVE-2025-46818 Değiştirilebilir Ayrıcalık Yükseltmesi Ayrıcalık Yükseltmesi EVAL erişimi 9.8

PoC ve Azaltma

Eksiksiz bir Python PoC, canlı bir Redis sunucusuna karşı üç kusurun tamamını test eder. Örneğin, serbest kullanımdan sonra testi, ayrıştırma sırasında çöp toplamayı zorlamak için Lua belleğini doldurur:

# Step 1: Create memory pressure

for i in range(50):

    huge_script = "local t={}; " + ";".join([f"t[{j}]=string.rep('X',10000)" for j in range(50)]) + "; return 'ok'"

    client.eval(huge_script, 0)

# Step 2: Trigger GC during parse

client.eval("collectgarbage('collect'); return 'gc'", 0)

unpack() taşma kontrolü, hataları tespit etmek için return {unpack({1,2,3}, -2, 2147483647)} gibi komut dosyalarını kullanırken metatablo koruması, sıfır metatabloyu değiştirme girişimleriyle onaylanır.

Kuruluşlar, yamaların ayrıştırıcıda yığın koruması, unpack()’te sınır kontrolleri ve temel metatablolarda salt okunur uygulama içeren Redis 7.4.6 veya sonraki bir sürümüne yükseltme yapmalıdır.

Bu güncellemelerin uygulanması saldırı yüzeyini kapatacak ve komut dosyası izolasyonunu geri yükleyecektir. Beklenmeyen EVAL etkinliğinin sürekli izlenmesi ve sıkı erişim kontrolleri de riski azaltmak için önerilir.

Anında Güncellemeler Almak ve GBH’yi Google’da Tercih Edilen Kaynak Olarak Ayarlamak için bizi Google Haberler, LinkedIn ve X’te takip edin.



Source link