Merhaba yabancı bir forumda
Bu güvenlik açığı her sunucuyu etkilemelidir. Öğe ödüllerini çoğaltabilir ve ayrıca sarkan işaretçiler aracılığıyla sunucuyu çökertebilirsiniz.
Bu hatanın tehlikesi, sunucunuzda kaç adet özel sistem ve kaç adet üretim görevi (örneğin, canlılık cevheri arayışı, küp sistemi değil) bulunduğuna göre artar.
Nasıl tetiklenir:
Select & wait ve bundan sonraki item lua modülünü kullanan herhangi bir görev savunmasızdır.
Sunucu select() veya wait()'i kullandıktan sonra oyuncunun görev durumu askıya alınır. Oyuncu, CG paketini kullanarak yanıt verdikten sonra, görev durumu kurtarılır.
Öyleyse bunda yanlış olan ne? Saklanan görev öğesi ptr'nin süresinin dolup dolmadığını doğrulamaz.
Görevin ödüllerini çoğaltmak için temel olarak seçilen öğe ptr'yi yok etmeniz gerekiyor. Birkaç denemeden sonra oyunda çekirdek çökmesi yaşayabilirsiniz. (sallanan işaretçiler genellikle yalnızca bu bellek sektörü yeniden yazıldıktan sonra çökmelere neden olur)
Dosyalarımda, (birkaç yıl öncesinden beri) exchange, cube, shop gibi varsayılan pencereler için görev durumunun askıya alınıp alınmadığını kontrol ettim.
Bu hata, çevrimdışı mağazalarda veya bunu kontrol etmeyen diğer yeni sistemlerde çok kolay çalışabilir.
Select() veya wait() çağrıldıktan sonra, seçili öğeyi (örn.) offlineshop sistem penceresine gönderirsiniz. Oyundaki ptr öğesini siler. Artık görevde "Tamam"a basabilirsiniz ve görev, öğe hala varmış gibi devam edecektir.
Öğe hala çevrimdışı mağazada var, ancak ptr öğesi artık yok. Öğe, item.remove() çağrıldıktan sonra bile görev tarafından silinmez.
Bu düzeltme:
Bir görev açıkken pencerelerinizi taşımak üzere istemcinin kilidini açmak için bunu interfacemodule.py'den düzenlersiniz:
Hatta daha iyi bir sonuç için TopBar ve BottomBar'ı uiQuest.py'den gizleyebilirsiniz.
Önemli: Bu düzeltmeden sonra, enter tuşuna bastıktan sonra ptr öğesi nullptr olabilir, bu nedenle bu işlevi kullanarak ptr öğesinin hala geçerli olup olmadığını kontrol etmeniz gerekir:
Daha fazla denemek ve ptr öğesinin değiştirilmediğinden emin olmak istiyorsanız, görev aracılığıyla aşağıdakileri yapabilirsiniz:
Metin2 Lobby forumunda Metin2 özel sunucularında geliştirilen sistemlerin güvenliği ve stabilitesi oldukça önemlidir. Özellikle PvP sistemlerinde kullanılan görevlerde ve eşya transferlerinde karşılaşılan güvenlik açıkları, sunucuların adil oynanışını bozabilir. Bu yazıda eşya kopyalama gibi ciddi güvenlik açığı barındıran bug fix konusuna değineceğiz.
Metin2 özel sunucularda geliştirilen görevler (quest), oyunculara belirli ödüller vererek oyun içi döngüyü destekler. Ancak bazı geliştirme hataları sonucu eşya kopyalama gibi ciddi sorunlar oluşabilmektedir. Bu durum genellikle görev sisteminde yapılan mantık hatalarından veya kontrol eksikliklerinden kaynaklanmaktadır.
Örneğin bir görev, oyuncuya belirli bir eşyayı verdiğinde, bu eşyanın zaten envanterde olup olmadığını kontrol etmeyen sistemlerde, aynı eşya tekrar tekrar verilebilir. Bu da eşya kopyalama olarak bilinen güvenlik açığını doğurur.
Bu hatayı düzeltmek için öncelikle C++ server-side[/CHAR] üzerinde yapılan kontrol mekanizmalarını gözden geçirmek gerekir. Görev scriptlerinde, ödüllendirme işlemi öncesinde oyuncunun envanterinde ilgili eşyanın olup olmadığı kontrol edilmelidir. Ayrıca, eşya ID'si, miktarı ve slot durumu gibi veriler doğrulanmalıdır.
Ayrıca, Python GUI tabanlı sistemlerde de benzer kontroller yapılmalıdır. PyRoot dosyalarında tanımlanan görev fonksiyonları, sunucu tarafında gerekli kontroller yapılmadan çalıştırılmamalıdır.
Bu tip güvenlik açıklarının önüne geçmek için aşağıdaki adımlar önerilir:
- Görev öncesi eşya kontrolü yapılmalı
- Eşya ID'leri karşılaştırılmalı
- Miktar kontrolleri sağlanmalı
- Sunucu tarafında loglama aktif edilmeli
Metin2 Lobby, bu tarz güvenlik açıklarını önlemeye yönelik sürekli gelişmeler sunmaktadır. Metin2 Development sürecinde, hem game core hem de db core üzerinden alınan önlemler, sunucu güvenliğini artırmaktadır.
Sonuç olarak, eşya kopyalama bug gibi güvenlik açıklarının erken tespiti ve onarılması, Metin2 özel sunucularının uzun vadeli başarısı için hayati öneme sahiptir.
Metin2 Lobby forums emphasize the importance of security and stability in systems developed for Metin2 private servers. Particularly in PvP systems, vulnerabilities such as item duplication bugs can disrupt fair gameplay. In this article, we'll discuss how to fix such critical security flaws like the item duplication bug.
In Metin2 private servers, quests support the in-game loop by rewarding players with specific items or bonuses. However, due to development errors, serious issues such as item duplication may occur. Such problems often stem from logical mistakes or missing checks within quest systems.
For example, if a quest grants an item without checking whether that item already exists in the player’s inventory, the same item might be given repeatedly, leading to the well-known item duplication exploit.
To fix this bug, it's crucial to review validation mechanisms implemented in C++ server-side code. Before awarding items, the system must check if the player already has the same item in their inventory. Additionally, checks should verify item ID, quantity, and slot availability.
Similarly, in Python GUI-based systems, similar validations must be applied. Quest functions defined in PyRoot files should not execute rewards without proper server-side checks.
To prevent such exploits, consider implementing the following steps:
- Check for existing items before awarding
- Validate item IDs
- Ensure correct quantity handling
- Enable logging on the server side
Metin2 Lobby consistently provides updates to help avoid these types of vulnerabilities. Throughout the Metin2 Development process, preventive measures taken on both game core and db core levels enhance server security.
In conclusion, early detection and fixing of security flaws like the item duplication bug are vital for the long-term success of Metin2 private servers.
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
'a ait bir fix buldum sanırım önceden forumda paylaşılmadı yada ben görmedim konuyu direkt google çeviri ile kopyala yapıştır yapıyorum umarım işinize yarar katkılarından dolayı
Ziyaretçiler için gizlenmiş link,görmek için üye olmalısınız!
Giriş yap veya üye ol.
'a teşekkürler.Bu güvenlik açığı her sunucuyu etkilemelidir. Öğe ödüllerini çoğaltabilir ve ayrıca sarkan işaretçiler aracılığıyla sunucuyu çökertebilirsiniz.
Bu hatanın tehlikesi, sunucunuzda kaç adet özel sistem ve kaç adet üretim görevi (örneğin, canlılık cevheri arayışı, küp sistemi değil) bulunduğuna göre artar.
Nasıl tetiklenir:
Select & wait ve bundan sonraki item lua modülünü kullanan herhangi bir görev savunmasızdır.
Sunucu select() veya wait()'i kullandıktan sonra oyuncunun görev durumu askıya alınır. Oyuncu, CG paketini kullanarak yanıt verdikten sonra, görev durumu kurtarılır.
Öyleyse bunda yanlış olan ne? Saklanan görev öğesi ptr'nin süresinin dolup dolmadığını doğrulamaz.
Görevin ödüllerini çoğaltmak için temel olarak seçilen öğe ptr'yi yok etmeniz gerekiyor. Birkaç denemeden sonra oyunda çekirdek çökmesi yaşayabilirsiniz. (sallanan işaretçiler genellikle yalnızca bu bellek sektörü yeniden yazıldıktan sonra çökmelere neden olur)
Dosyalarımda, (birkaç yıl öncesinden beri) exchange, cube, shop gibi varsayılan pencereler için görev durumunun askıya alınıp alınmadığını kontrol ettim.
Bu hata, çevrimdışı mağazalarda veya bunu kontrol etmeyen diğer yeni sistemlerde çok kolay çalışabilir.
Select() veya wait() çağrıldıktan sonra, seçili öğeyi (örn.) offlineshop sistem penceresine gönderirsiniz. Oyundaki ptr öğesini siler. Artık görevde "Tamam"a basabilirsiniz ve görev, öğe hala varmış gibi devam edecektir.
Öğe hala çevrimdışı mağazada var, ancak ptr öğesi artık yok. Öğe, item.remove() çağrıldıktan sonra bile görev tarafından silinmez.
Bu düzeltme:
Kod:
diff --git a/s3ll_server/Srcs/Server/game/src/char.cpp b/s3ll_server/Srcs/Server/game/src/char.cpp index 0ea307fa..65b1dd65 100644 --- a/s3ll_server/Srcs/Server/game/src/char.cpp +++ b/s3ll_server/Srcs/Server/game/src/char.cpp @@ -303,7 +303,10 @@ void CHARACTER::Initialize() m_dwQuestNPCVID = 0; m_dwQuestByVnum = 0; - m_pQuestItem = NULL; + m_dwQuestItemVID = 0; m_dwUnderGuildWarInfoMessageTime = get_dword_time()-60000; @@ -6123,33 +6126,37 @@ LPCHARACTER CHARACTER::GetQuestNPC() const void CHARACTER::SetQuestItemPtr(LPITEM item) { - m_pQuestItem = item; + m_dwQuestItemVID = (item) ? item->GetVID() : 0; } void CHARACTER::ClearQuestItemPtr() { - m_pQuestItem = NULL; + m_dwQuestItemVID = 0; } LPITEM CHARACTER::GetQuestItemPtr() const { - return m_pQuestItem; + if (!m_dwQuestItemVID) + return nullptr; + return ITEM_MANAGER::Instance().FindByVID(m_dwQuestItemVID); } diff --git a/s3ll_server/Srcs/Server/game/src/char.h b/s3ll_server/Srcs/Server/game/src/char.h index cc4da2bb..74b3470e 100644 --- a/s3ll_server/Srcs/Server/game/src/char.h +++ b/s3ll_server/Srcs/Server/game/src/char.h @@ -1674,9 +1674,9 @@ class CHARACTER : public CEntity, public CFSM, public CHorseRider private: DWORD m_dwQuestNPCVID; DWORD m_dwQuestByVnum; - LPITEM m_pQuestItem; + DWORD m_dwQuestItemVID{}; // @fixme304 (LPITEM -> DWORD) // Events
Bir görev açıkken pencerelerinizi taşımak üzere istemcinin kilidini açmak için bunu interfacemodule.py'den düzenlersiniz:
Hatta daha iyi bir sonuç için TopBar ve BottomBar'ı uiQuest.py'den gizleyebilirsiniz.
Önemli: Bu düzeltmeden sonra, enter tuşuna bastıktan sonra ptr öğesi nullptr olabilir, bu nedenle bu işlevi kullanarak ptr öğesinin hala geçerli olup olmadığını kontrol etmeniz gerekir:
Kod:
ALUA(item_is_available) { auto item = CQuestManager::instance().GetCurrentItem(); lua_pushboolean(L, item != nullptr); return 1; } ... { "is_available", item_is_available }, // [return lua boolean]
Kod:
when 169.take begin local s1=select("Yes", "No") if s1==2 then return end if not item.is_available() then return end end
Daha fazla denemek ve ptr öğesinin değiştirilmediğinden emin olmak istiyorsanız, görev aracılığıyla aşağıdakileri yapabilirsiniz:
Metin2 Lobby forumunda Metin2 özel sunucularında geliştirilen sistemlerin güvenliği ve stabilitesi oldukça önemlidir. Özellikle PvP sistemlerinde kullanılan görevlerde ve eşya transferlerinde karşılaşılan güvenlik açıkları, sunucuların adil oynanışını bozabilir. Bu yazıda eşya kopyalama gibi ciddi güvenlik açığı barındıran bug fix konusuna değineceğiz.
Metin2 özel sunucularda geliştirilen görevler (quest), oyunculara belirli ödüller vererek oyun içi döngüyü destekler. Ancak bazı geliştirme hataları sonucu eşya kopyalama gibi ciddi sorunlar oluşabilmektedir. Bu durum genellikle görev sisteminde yapılan mantık hatalarından veya kontrol eksikliklerinden kaynaklanmaktadır.
Örneğin bir görev, oyuncuya belirli bir eşyayı verdiğinde, bu eşyanın zaten envanterde olup olmadığını kontrol etmeyen sistemlerde, aynı eşya tekrar tekrar verilebilir. Bu da eşya kopyalama olarak bilinen güvenlik açığını doğurur.
Bu hatayı düzeltmek için öncelikle C++ server-side[/CHAR] üzerinde yapılan kontrol mekanizmalarını gözden geçirmek gerekir. Görev scriptlerinde, ödüllendirme işlemi öncesinde oyuncunun envanterinde ilgili eşyanın olup olmadığı kontrol edilmelidir. Ayrıca, eşya ID'si, miktarı ve slot durumu gibi veriler doğrulanmalıdır.
Ayrıca, Python GUI tabanlı sistemlerde de benzer kontroller yapılmalıdır. PyRoot dosyalarında tanımlanan görev fonksiyonları, sunucu tarafında gerekli kontroller yapılmadan çalıştırılmamalıdır.
Bu tip güvenlik açıklarının önüne geçmek için aşağıdaki adımlar önerilir:
- Görev öncesi eşya kontrolü yapılmalı
- Eşya ID'leri karşılaştırılmalı
- Miktar kontrolleri sağlanmalı
- Sunucu tarafında loglama aktif edilmeli
Metin2 Lobby, bu tarz güvenlik açıklarını önlemeye yönelik sürekli gelişmeler sunmaktadır. Metin2 Development sürecinde, hem game core hem de db core üzerinden alınan önlemler, sunucu güvenliğini artırmaktadır.
Sonuç olarak, eşya kopyalama bug gibi güvenlik açıklarının erken tespiti ve onarılması, Metin2 özel sunucularının uzun vadeli başarısı için hayati öneme sahiptir.
Metin2 Lobby forums emphasize the importance of security and stability in systems developed for Metin2 private servers. Particularly in PvP systems, vulnerabilities such as item duplication bugs can disrupt fair gameplay. In this article, we'll discuss how to fix such critical security flaws like the item duplication bug.
In Metin2 private servers, quests support the in-game loop by rewarding players with specific items or bonuses. However, due to development errors, serious issues such as item duplication may occur. Such problems often stem from logical mistakes or missing checks within quest systems.
For example, if a quest grants an item without checking whether that item already exists in the player’s inventory, the same item might be given repeatedly, leading to the well-known item duplication exploit.
To fix this bug, it's crucial to review validation mechanisms implemented in C++ server-side code. Before awarding items, the system must check if the player already has the same item in their inventory. Additionally, checks should verify item ID, quantity, and slot availability.
Similarly, in Python GUI-based systems, similar validations must be applied. Quest functions defined in PyRoot files should not execute rewards without proper server-side checks.
To prevent such exploits, consider implementing the following steps:
- Check for existing items before awarding
- Validate item IDs
- Ensure correct quantity handling
- Enable logging on the server side
Metin2 Lobby consistently provides updates to help avoid these types of vulnerabilities. Throughout the Metin2 Development process, preventive measures taken on both game core and db core levels enhance server security.
In conclusion, early detection and fixing of security flaws like the item duplication bug are vital for the long-term success of Metin2 private servers.
