Görev ve diğer sistemlerde eşya kopyalama bugu fix

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 45

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhaba yabancı bir forumda '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ı '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:

132983_e817318a27bc07d56261a92583885434.png

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:


132985_30a2f805d0601058cfc5a3483f7c9f0f.png

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.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Geri
Üst Alt