Uygulamanızın diske yazdığı bir DLL ya da veri dosyası, bir saldırganın gözünde kolay vakadır. Klasörde kopyalanabilir bir dosyadır. Programınız hiç çalışmıyorken bile bir disassembler'da açılabilir, yamalanıp geri yerleştirilebilir ve ihtiyaç duyduğu oturum çoktan bittikten sonra da diskte kalmaya devam eder.
Bellekte yükleme, bu sorunun yanıtıdır: hassas modül, şifreli bir kaynaktan çalışan sürece eşlenir; böylece çalıştırılabilir düz baytlar hiçbir zaman diske yazılmaz. Bu rehber, diskteki dosyaların neden kolayca ele geçirildiğini, bellekte yüklemenin gerçekte ne yaptığını, PapelShip'in dosyaları belleğe nasıl eşlediğini, tekniğin nerede durduğunu ve neyle eşleştirilmesi gerektiğini anlatıyor.
Diskteki dosyalar neden kolayca ele geçirilir?
Diskteki bir dosyanın zayıflığı tek bir kusurdan değil, dosya olmanın kendisinden kaynaklanır. Hassas mantık bir klasörde bayt olarak dağıtıldığında, beraberinde dört sorun birden gelir.
- Kopyalanır. Dosya diskte yalnızca bayttır; klasörü okuyabilen herkes onu başka yere taşıyabilir.
- Durgunken incelenir. Diskte duran bir DLL, program hiç çalışmadan bir disassembler'da açılabilir.
- Yamalanır. Dosya değiştirilip geri yerleştirilebilir; böylece programın bir sonraki açılışta yaptığı şey değişir.
- Kalıcıdır. Uygulama kapandıktan sonra da diskte kalır; ihtiyaç duyduğu oturum çoktan bitmiş olsa bile bulunmayı bekler.
Diskte dosya olarak dağıtılmış
- Klasörde kopyalanabilir bir dosya
- Durgunken statik araçlarla okunabilir
- Yamalanıp geri yerleştirilebilir
- Uygulama kapandıktan sonra da kalır
Belleğe eşlenmiş
- Diske düz metin dosyası yazılmaz
- Yalnızca çalışan süreçte çözülür
- Süreç kapanınca yok olur
- Yalnızca kimliği doğrulanmış bir oturuma teslim edilir
Bu iki sütun arasındaki fark, bellekte yüklemenin bütün savunmasıdır. Diskteki bir dosya, programınız çalışsın ya da çalışmasın, makineye erişimi olan herkese, her zaman açıktır. Yalnızca çalışan ve kimliği doğrulanmış bir süreç içinde var olan bir modül ise çok daha dar bir pencerede, çok daha dar bir kitleye açıktır ve sonradan boş zamanında incelenebilecek hiçbir iz bırakmaz.
Bellekte yükleme gerçekte ne yapar?
Program normal bir DLL kullandığında işletim sistemi bu DLL'i diskten okur ve işlemcinin çalıştırabilmesi için programın belleğine eşler. Bellekte yükleme, eşleme adımının kendisini yapar: modülü şifreli bir kaynaktan alır ve doğrudan sürecin adres alanına yerleştirir; böylece çalıştırılabilir düz baytlar hiçbir zaman bir dosya olarak diske yazılmaz. PapelShip'in Map Files özelliği bir PE loader gibi çalışır ve dosyalarınızı belleğe eşler; bellekte çalıştırma yolu da şifreli DLL'leri diske bayt yazmadan belleğe akıtabilir.
Pratik etki şudur: kolay saldırılar ortadan kalkar. Kopyalanacak, klasörde duran bir dosya yoktur; durgunken statik bir aracın açabileceği bir şey diskte yoktur ve süreç kapandığında geriye bir şey kalmaz. Saldırgan, hareketsiz duran bir dosya yerine çalışan bir süreçle uğraşmak zorunda kalır; bu da çok daha yüksek bir çıtadır.
“Güvenli” kelimesi üzerinde net olmak gerekir. Bir dosyayı belleğe eşlemek tek başına yalnızca bir yükleme tekniğidir; güvenlik, baytların nereden başladığından ve nasıl taşındığından gelir. PapelShip'te modül sunucuda şifreli olarak tutulur ve yalnızca zaten kimliği doğrulanmış bir istemciye gönderilir. Dolayısıyla belleğe eşleme adımı, korunmasız ortada duran bir dosyaya uygulanan bir hile değil, korunan bir yolun sonudur.
PapelShip dosyaları belleğe nasıl eşler?
PapelShip'te bu, sunucu tarafı teslimat üzerine kuruludur. Modül sunucuda şifreli olarak tutulur ve yalnızca kimliği doğrulanmış bir lisansa teslim edilir; aynen sunucu tarafı string'ler ve dosyalarda olduğu gibi. Ardından diske düşmek yerine sürece eşlenir. Sıra kısadır.
- 01
Kimlik doğrulayın
Uygulama bir oturum başlatır ve lisansı bu cihaz için doğrular. Bu başarılı olmadan korunan hiçbir şey teslim edilmez.
- 02
Modülü isteyin
Kimliği doğrulanmış istemci, korunan kanal üzerinden sunucudan şifreli modülü ister.
- 03
Şifreli akıtın
Baytlar şifreli olarak gelir. Bu yolda hiçbir yerde bir dosyaya yazılmış düz bir kopya yoktur.
- 04
Belleğe eşleyin
Map Files modülü, bir PE loader'ın yapacağı gibi sürecin adres alanına yerleştirir; böylece çalışmaya hazır olur.
- 05
Çalıştırın, ardından kaldırın
Modül, oturum boyunca bellekten çalışır ve süreç kapandığında yok olur.
Yayınlanan çalıştırılabilir dosya için qPapelPacker+, müşterinin indirdiği binary'nin durgunken de okunmasını zorlaştıran ek bir paketleme katmanı ekler. Bellekte yükleme, kimlik doğrulamadan sonra teslim ettiğiniz modülleri korur; paketleme ise bu modülleri isteyen başlatıcıyı (launcher) korur.
Belleğe neler girmeli, neler girmemeli?
Bellekte yüklemenin bir maliyeti vardır: modülün çalışma zamanında alınıp eşlenmesi gerekir; bu yüzden bunu gerçekten önem taşıyan parçalar için saklamaya değer. Test basittir. Bu içeriği diskte okuyarak bir saldırgan kullanışlı bir şey öğrenir ya da gerçek bir çaba tasarrufu sağlar mı? Evetse, bellekte teslimat için bir adaydır. Hayırsa, karmaşıklık kendini hak etmiyordur.
- İyi adaylar: gerçek mantığınızı, premium özellikleri ya da bir lisansın neyi yapabileceğine karar veren kodu içeren modüller.
- Sunucuya taşımaya da değer: anahtarlar, URL'ler ve sabitler; herhangi bir istemci dosyasında değil, sunucu tarafı string'ler ve dosyalarda bulunmalıdır.
- Genellikle diskte sorun olmaz: büyük, hassas olmayan varlıklar ve zaten herkese açık olan her şey; belleğe eşleme, koruma eklemeden maliyet ekler.
Sınırları dürüstçe kabul edin
Bellekte yükleme, maliyeti artıran bir tekniktir; sihirli bir çözüm değildir. Çalışan kodun işlemcinin çalıştırabilmesi için yine bellekte var olması gerekir ve bir makinenin tam kontrolüne sahip biri prensipte, üzerinde çalışan bir sürecin belleğini inceleyebilir. Bu, bilgisayarların nasıl çalıştığının bir özelliğidir; herhangi bir ürünün eksikliği değildir.
Bellekte yükleme, ucuz ve tekrarlanabilir saldırıyı ortadan kaldırır: dosyayı kopyalamak, durgunken okumak, yamalayıp geri yerleştirmek. Canlı süreç üzerinde çalışan kararlı bir saldırganı ise ortadan kaldırmaz. Bunu tüm savunma olarak görmek hatadır; güçlü bir katman olarak görmek doğrudur.
Dürüst çerçeve mutlak değil, ekonomiyle ilgilidir. Koruma, bir saldırının maliyetini sonucunun değerinden yüksek tutmaktır; bunu, biri başarılı olana kadar ürününüz çoktan ilerlemiş olacak kadar uzun süre yapmaktır. Bellekte yükleme bu dengeyi sizin lehinize değiştirir; oyunu bitirmez. Tek bir özelliğin kodu çıkarılamaz hâle getirdiğini söyleyen her satıcı, güvenlik değil güven satıyordur.
Bütünlük kontrolleri ve qPAnalyzer ile eşleştirin
Bellekteki bir modül, yalnızca diskten gizlenmekle kalmayıp izlenmelidir. Bunu yapan iki şey vardır ve bunlar eşlemenin kendisinden farklı sorunları çözer.
Birincisi, çalışma zamanı bütünlük kontrolleri, bellekteki kodun gönderdiğiniz kod olduğunu doğrular. qPapel Auth, komut yamalama gibi yetkisiz değişiklikleri (JMP ve NOP düzenlemeleri dahil) tespit eden auth.CheckMemoryIntegrity() ile CRC, oturum tabanlı ve JMP/NOP kontrolleri yapan auth.CheckTextIntegrity() fonksiyonlarını sunar. Eşlenmiş bir modüle güvenmeden önce bunları çalıştırın.
// Check the running code before using a mapped module.
if (!auth.CheckMemoryIntegrity()) {
// Memory was patched (for example JMP/NOP edits). Stop here.
return;
}
if (!auth.CheckTextIntegrity()) {
// CRC or session-based check failed. Stop here.
return;
}
// Only now request and map the protected module.İkincisi, qPAnalyzer sürecin çalıştığı ortamı izler; statik kara listelerin kaçırdığı dumper'ları, bellek tarayıcılarını ve yeniden adlandırılmış analiz araçlarını işaretler. Birlikte değerlendirildiğinde dosya diskte değildir, bellekteki kod doğrulanmıştır ve ona ulaşmaya çalışan araçlar tespit edilir.
Bellekte yükleme
Diskte düz metin dosya yok
Sunucu tarafı teslimat
Modüller yalnızca kimlik doğrulamadan sonra gönderilir
Bütünlük kontrolleri
Bellek ve kod çalışma zamanında doğrulanır
qPAnalyzer
Dumper'lar ve yeniden adlandırılmış araçlar işaretlenir
Bu katmanların birbirine nasıl kenetlendiğinin tam resmi için C++ ve C# için yazılım koruma katmanları ve korumanın neden statik kara listelerin ötesine geçmesi gerektiği yazılarına bakın.
Parçalar kadar sıra da önemlidir. Önce kimlik doğrulayın, böylece lisans doğrulanana kadar korunan hiçbir şey hareket etmez; modülü şifreli teslim edip belleğe eşleyin, böylece ele geçirilecek bir dosya kalmaz; çalışma zamanında doğrulayın, böylece kurcalanmış bir modül yakalanır; ve ortamı izleyin, böylece ona saldırabilecek araçlar işaretlenir. Her adım bir öncekini varsayar; bu yüzden tek tek değil, birlikte benimsenmeye değerler.
Sıkça sorulan sorular
auth.CheckMemoryIntegrity() ve auth.CheckTextIntegrity() kullanın.Değerli parçaları diskten uzak tutun
Bellekte yükleme basit bir fikirdir ve gerçek bir getirisi vardır: ürününüzün çalmaya değer parçaları, kolayca ele geçirilebilecekleri diske hiç yazılmaz. Onları şifreli, kimliği doğrulanmış bir kaynaktan belleğe eşleyin, çalışma zamanında doğrulayın ve qPAnalyzer'ın çevrelerindeki ortamı izlemesine izin verin.
Bunların hiçbiri kodunuzu dokunulmaz kılmaz; yazılım koruması hakkındaki dürüst her anlatım bunu söyler. Yaptığı şey, hızlı bir kopyalama işini uzun ve belirsiz bir işe çevirmektir; çoğu ürün için tam da yapmaya değer bir takas budur.
qPapel Security Team
Lisanslama ve yazılım koruması