- #1
Konu Sahibi
: serkankacan
[REHBER] vSRO Temel Exploit & Paket Güvenliği Fix Kodları
Filter / Guard Altyapınız İçin Shard & GameServer Çökertme Saldırılarını Önleme Yöntemleri
Filter / Guard Altyapınız İçin Shard & GameServer Çökertme Saldırılarını Önleme Yöntemleri
Merhaba değerli forum sakinleri,
vSRO sunucularında en sık karşılaşılan güvenlik zafiyetlerinin başında, istemci (client) tarafından sunucuya gönderilen manipüle edilmiş veya hatalı yapılandırılmış paketlerin ShardManager veya GameServer bileşenlerini çökertmesi (crash exploit) gelmektedir.
Aşağıda paylaşılan kontrolleri, C# tabanlı özel Guard veya Filter projenizin paket ayrıştırma (
PacketHandler / OnPacketReceived) döngüsüne entegre ederek bu zafiyetlerin büyük çoğunluğunu sunucuya ulaşmadan engelleyebilirsiniz.Önemli Uyarı' Alıntı:Lütfen Dikkat: Kodları doğrudan projenize kopyala-yapıştır yapmayınız! Her Guard yazılımının paket okuma kütüphanesi (PacketReader,Packet), değişken isimleri ve oturum sonlandırma (Disconnect) metotları farklılık gösterebilir. Kod mantığını kendi yapınıza uyarlayınız.
1. Opcode 0x7005 (Karakter / Sunucu Seçim Ekranı Kontrolü)
- Tehdit: İstemci bu pakette geçersiz bayrak (flag) değerleri enjekte ederek Shard tarafında beklenmedik durum oluşturabilir ve belleği kitleyebilir.
- Mantık: İlk bayt değerinin 2'den büyük olmaması gerekir. Geçersiz bir aralıkta ise paket derhal sonlandırılmalıdır.
C#:
// 0x7005: Character / Server Selection Check
if (_pck.Opcode == 0x7005)
{
// Değer 0, 1 veya 2 dışında ise manipüle edilmiş pakettir
if (_pck.ReadUInt8() > 2)
{
client.Disconnect(); // Bağlantıyı kes
return;
}
}
2. Opcode 0x7007 (Karakter Yönetim İşlemleri Kontrolü)
- Tehdit: Karakter oluşturma, silme veya geri getirme isteklerinde eksik/fazla bayt gönderildiğinde sunucu tarafında
IndexOutOfRangeExceptionhatası ile crash oluşur. - Mantık: Alt işlem kimliğine (
actionType) göre paket gövdesi katı uzunluk ve tip kontrolünden geçirilir; olası taşmalara karşıtry-catchbloğuna alınır.
C#:
// 0x7007: Karakter Aksiyonları (Oluşturma, Silme, Geri Yükleme)
if (_pck.Opcode == 0x7007)
{
byte actionType = _pck.ReadUInt8();
switch (actionType)
{
#region Create Character
case 1:
try
{
string charName = _pck.ReadAscii();
uint refObjId = _pck.ReadUInt32();
byte scale = _pck.ReadUInt8();
// Başlangıç eşya ID'leri (4 slot)
uint item1 = _pck.ReadUInt32();
uint item2 = _pck.ReadUInt32();
uint item3 = _pck.ReadUInt32();
uint item4 = _pck.ReadUInt32();
}
catch
{
// Paket boyutu eksikse veya okuma başarısızsa bağlantıyı düşür
client.Disconnect();
return;
}
break;
#endregion
#region Character Screen Call
case 2:
// Bu eylem tipi gövdede ek bayt içermemelidir
if (_pck.GetBytes().Length > 1)
{
client.Disconnect();
return;
}
break;
#endregion
#region Delete / Restore Character
case 3: // İsimle karakter silme
case 4: // Silinen karakteri geri alma
case 5: // Karakter onay / yedek işlem
try
{
int nameLength = _pck.ReadAscii().Length;
// Paket boyutu: isim uzunluğu + 2 bayt (uzunluk belirteci) + 1 bayt (actionType)
// Fark 3 değilse paket verisi manipüle edilmiştir
if ((_pck.GetBytes().Length - nameLength) != 3)
{
client.Disconnect();
return;
}
}
catch
{
client.Disconnect();
return;
}
break;
#endregion
default:
// Tanımlanmamış alt komutlar düşürülür
client.Disconnect();
return;
}
}
3. Opcode 0x750E (Boş Payload Doğrulaması)
- Tehdit: Normal şartlarda boş olması gereken bu bildirime sahte veri enjekte edilerek sunucu tampon belleği (buffer) taşırılmaya çalışılır.
- Mantık: Paket içeriğinde 0 bayttan fazla veri varsa paket doğrudan reddedilir.
C#:
// 0x750E: Boş Gövde Kontrolü
if (_pck.Opcode == 0x750E)
{
if (_pck.GetBytes().Length > 0)
{
client.Disconnect();
return;
}
}
4. Opcode 0x3012 (Durum / Keep-Alive Sorgu Kontrolü)
- Tehdit: Canlılık veya durum sorgularına yetkisiz payload yerleştirilerek bağlantı protokolünün bozulması hedeflenir.
- Mantık: Gövde uzunluğu sıfırdan büyük olan tüm istekler düşürülür.
C#:
// 0x3012: State / Ping Kontrolü
if (_pck.Opcode == 0x3012)
{
if (_pck.GetBytes().Length > 0)
{
client.Disconnect();
return;
}
}
5. Opcode 0x3510 (Geçersiz / Güvenilmeyen Paket Engelleme)
- Tehdit: Normal şartlarda istemci tarafından gönderilmemesi gereken bir sistem paketidir. GameServer'a iletilmesi durumunda kilitlenmelere yol açabilir.
- Mantık: Paket Shard veya GameServer'a ulaştırılmadan döngüden atlanır (Drop edilir).
C#:
// 0x3510: Yetkisiz Paket Engelleme
if (_pck.Opcode == 0x3510)
{
// Paketi GameServer'a yönlendirmeden atla
continue;
}
Geliştirici Notu & Güvenlik Tavsiyesi:
Tüm paket okuma adımlarınızda mutlaka
try-catch blokları kullanın. Saldırganların en çok başvurduğu yöntem, beklenen türden daha kısa bayt dizisi göndermektir. Eğer kodunuzda koruma bloğu yoksa istemci değil, doğrudan sizin Guard uygulamanız çöker.Sorularınızı ve eklemek istediğiniz diğer opcode kontrollerini konu altından paylaşabilirsiniz. Herkese iyi forumlar!

