2015-04-15 42 views
5

TL; DR: Gerçek adı kayıt olmaksızın, belirtilen isimle seçicinin nasıl kaydedildiğini nasıl kontrol edebilirim?Sayfasına geri dön sel_getUid() 'nin özgün davranışı

Teşekkürler!


Merhaba, objc yazılmış basit vekil kitaplığı aracılığıyla Lua duruma ihraç edilmektedir NSObjects bir Objective-C uygulaması ve grup var. Tüm Lua tarafı bunlar gibi çağırır:

exported_objc_object:myMethodName(...) 

-- same as -- 
exported_objc_object.myMethodName(exported_objc_object, ...) 

-- same as -- 
key = 'myMethodName' 
exported_objc_object[key](exported_objc_object, ...) 

birisi denilen sanki iletilir:

[objc_object lua_myMethodName:L]; 

// declared as 
- (int)lua_myMethodName:(lua_State *)L { ... } 

Aslında herhangi Lua ihraç nesne üzerinde işlem kodu 'get' önbelleğe alınmış Lua-kapatılmasını döndüren çağırma sprintf(s, "lua_%s:", key)) & & sel_getUid(s) ile yapılan seçici üzerinden ilgili Objective-C yöntemini çağırır (tüm kontroller dahil). Üretilen seçici -[respondsToSelector:] açısından uygulanmazsa, exported_objc_object.myMethodName sadece nil değerini döndürür.

Açıkçası, vekil kütüphane sel_getUid() veya yoluyla dinamik aramalarını yapmak zorundadır (ben hem @selector ve NSSelectorFromString() orada da sona inanmak). Elkitabı sel_getUid()'un selektör isimlerini (SEL kayıt defterine hemen kaydettirmenin tersine) arama yapmak için tasarlandığını, ancak modern uygulamanın şimdi birisinin tehcodez'undaki hatalara bağlı olarak ile aynı şeyi yaptığını belirtiyor.

davranışıyla uğraşabilirim, ancak bu bellek tüketen saldırı vektörünü bırakır, çünkü bazı kötü amaçlı komutlar bir döngüde object[makeRandomKey()] sml aracılığıyla uzun rasgele/geçersiz seçicilere bakmaya başlayabilir ve bu nedenle SEL kayıt defterine sonsuza kadar taşınır. sel_getUid() planlandığı gibi çalışmışsa, proxy lib seçici varlığını test edebilir ve ancak o zaman nesneye aşırı kayıt olmaksızın yanıt verip vermediğini kontrol edebilir. Ama öyle değil.

cevap

4

İşte, bir seçicinin bir C dizesi olduğu uygulamaya bağlı gerçekliği kullanan, işe yarayan bir saldırıdır.

sel_isMapped((SEL)(void *)"lua_myMethodName:") 
İlgili konular