Hasan Merkit

Moderasyon Üyesi
Geliştirici
Katılım
30 Ocak 2025
Mesajlar
5.757
Makaleler
13
Çözümler
114
Beğeniler
9.515
İster yapay zekâya yazılım yazdıran ve tek satır kod bilmeyen bir birey olun. İsterseniz de benim gibi ömrünüzün büyük bir bölümünü yazılıma vermiş olun. Şöyle bir gerçek var: Tersine mühendislik ve güvenlik açıkları.

Artık yeni dönemdeyiz. "Yapay zekâ çağı." Ve artık yıllarca süren tersine mühendislik işlemleri, günlere düşmüş durumda.

Tersine mühendislik olayını en basitinden anlatayım:

Daha yapay zeka çağından önce benim de yapmam gereken bir tersine mühendlislik vardı. Çalıştığım firma, 2009'dan kalma inanılmaz eski arayüze sahip bir web panel ile tarih öncesi Asterisk yazılımı kullanıyordu.

Sorun şu: Firmanın içerisindeki çalışanlar arasında 2009'da yazılmış yazılımın nasıl çalıştığını artık bilen yok. Web panelinin Asterisk ile nasıl iletişim kurduğunu okumak bir yol. Bu tersine mühendislik pek sayılmaz, farkındayız. Ancak PHP bilenlerin de bileceği gibi, başka bir geliştiricinin yazdığı sınıflandırma biçimiyle kodları okumak insanı ciddi bir seviyede yoruyor.

Yapılması gereken görev olarak şunu söyledim: /bin/asterisk yerine gelen parametreleri yakalayacak farklı bir sahte yazılım yerleştirmek. Web arayüz, bir ayar kaydettiğimizde gidip bunu Asterisk'e söylüyor. Bunu biliyoruz. O zaman bir ayarı yapıp kaydete bastığımızda /bin/asterisk yoluna giden veriyi, parametreyi yakalamak bir yoldur. Oraya sahte bir program koyup gelen istekleri loglamak, bir minik tersine mühendisliğin başlangıcıdır.

Gerçekten tersine mühendislik ile uğraşanlara bu örnek zaten komedi gelecektir.


Şimdi bu, çok basit bir örnek. Çok detaylı konular da var aslında: @Cruslan tarafından yazılmış:


Kısaca, elimize kapalı kutu bir uygulama var. Kodları yok. Nasıl çalıştığını (ister debugger veya farklı araçlar ile olsun, ister yanıltıcı dış program olsun, onların da yardımıyla) anlamak için inceleyerek yapılıyor.

Bu durum, korsancılıkta da kullanılıyor.

Peki günümüzdeki sorun nedir?

Tersine mühendislik bugüne kadar yok muydu? Vardı. Forumda aratma yaparsanız, @uintptr tarafından yapılmış sağlam çalışmalar da çıkacaktır. Kendisi bu çalışmaları yaparken de yapay zekâ bu kadar ilerlemiş durumda değildi.

Ama asıl sorun, bu çalışmaların kötüye de kullanılacağı. Yapay zekâlar da tersine mühendislik yapıyor. OpenAI ve Anthropic tarafından getirilecek kurallara güvenmeyin. Yapay zekâları kandırıp işi yaptırmakta mümkün. Mesela kafasını karıştırarak normalde yapmayacağı işleri yaptırabiliyorsunuz. Ya da sansürsüz dedikleri yapay zekâ modelleri de var. Olmadı, yapay zekâ için üretilmiş ekran kartlarını ve sunucuları satın alacak kadar zengin birileri de var. Yerel sunucusunda çalıştıracağı yapay zekaları sansürsüz de kullanabilir.

Makine diliymiş falanmış filanmış. Yerim makine dilini şimdi. Kodlama dili bilmeyen elemanlar bile AI kullanarak artık bir şeyler çıkaracağı bir sevimsiz döneme geldik.

1. Programlarınızın, oyunlarınızın taklit edilebilmesi:

Sorun şu: Sizin yıllarca verdiğiniz emeği tek kod bilmeyen biri bile taklit edebilir. Alın size benim yaptığım bir örnek:

Gerçek Half-Life:

1794337358940.webp


Claude'a verdiğim prompt:
Haritamı BSP formatına compile etmem, compile edilmiş BSP30 formatındaki haritamı test etmem uzun suruyor.
Çünkü compile esnasında hl_cfg.exe, hl_bsp.exe, hl_vis.exe, hl_rad.exe hesaplamalarını bitirip BSP ortaya çıkartmalarını bekliyorum.
Ardından normal Half-Life açılması için Steam'ın açılmasını bekliyorum.
D:\SteamLibrary\SteamApps\common\Half-Life yapısını incele ve aşırı hızlı açılacak bir benzer grafik motoru yaz. C++ olsun.

Sonuç: Gerçek Half-Life haritası, derlenmemiş Half-Life haritası açabilen ve yüklenmesi 1 saniyeden az süren, tüm silahların, ışıkların çalıştığı bir taklit grafik motoru:

1794337300199.webp


İyi niyet ile yapılabilir. Ben bunu gerçekten CS-HL haritası yapanlar için yayınlayacağım. Onlara nefes aldıracak.
Hatta ileride Source ve Source 2 (CS2) desteği eklemeyi düşünüyorum. Bu sorun değil.

Ancak lisanslara aykırı kötü niyet ile de yapılabilir: Geliştiriciler artık tehdit ediliyor. Hatta bu konuda Claude önlem alacağını duyurmuştu.
1794337719158.webp


Daha çok yeni bir olay: Gerçek oyunları Roblox'a portlayan kitle bile ortaya çıkmaya başladı:

1794338057538.webp



Son zamanlarda maalesef oyun geliştiricileri, birkaç beyinsizin oyunları kopyalacağı tehdidi ile karşı karşıya. Bu yüzden bazı firmalar demo ve fragman bile yayınlamaktan vazgeçti.

2. Korsancılık:

Oyunların korumasını aşma konusunda yapay zekâ nimet. Yapay zekâlara alınan önlem yeterli değil. Artık önlem alınsa da yerel çalışan modellerin önüne geçemeyecekler. Benden söylemesi.

Örnek:

1. Alınan önlem sonucu ChatGPT bunu yapamam diyor.

1794338187909.webp


2. O esnada aynı model, başka sohbette Crack yapıyor:

1794338357607.webp



Bir ara ne diyorduk? "Çıktığı gün kırıldı! The Last of Us Part 2!" Ee zaten. Steam'in düz DRM korumasını kırmak için milletin basit bir steam_api64.dll dosyası yerleştirmesi yetti.

Peki sağlam korunan oyunlar? Tersine mühendislik ile inanın bana PVP sunucularını bile yapacaklar! Araştırmadım ama CS2, Valorant üstünde farklı serverlar ile çalışan korsan sürüm yapmak ile uğraşan kitle bir yerlerde var. Biliyorum!

3. Hile!:

Önlem bile alınmamış ki. Yazıyı yazarken sordum. Bir de kandırılmış örnek gösterecektim gerekmedi. Anında ikna oldu.
Reis yapamayız falan deseydin...

1794338649964.webp


Neyse.. Daha önce yapan bir şahıs, bize kaynak kodlarıyla beraber CS ve HL için çalışan hilesini bize gönderdi.
Yapay zekayı nasıl kandıracağını anlatacaktı. Gerçi pek gerek yokmuş. Ben sorduğum gibi yapalım dedi. Delireceğim...

Bakın bunu iddiaya göre ChatGPT sadece 3 günde yapmış. Windows, Linux ve macOS desteği varmış.

1794338869677.webp

1794338979390.webp


Geliştirici iseniz neler yapmalısınız?

Yapay zekâların bu kadar geliştiği dönemde gerçek bir yazılımcı iseniz, hatta tek kod bilmeyen bir vibe coder iseniz okumaya devam edin:

1. Yazılımınızın kırılabileceğini kabul edin.

İlk yapmanız gereken şey, yazılımınızın hiçbir zaman %100 güvende olmayacağını kabul etmek. İstediğiniz kadar kodlarınızı karmaşıklaştırın, obfuscation uygulayın, DRM kullanın. Sonuçta kullanıcıya gönderdiğiniz bir yazılım, kullanıcının bilgisayarında çalışıyor. Dolayısıyla o bilgisayarda çalışan yazılımı incelemek isteyen birinin önüne tamamen geçemeyeceksiniz.

Üstelik günümüzde saldırganın karşısında sadece debugger, disassembler gibi araçlar yok. Bunlardan çıkan sonuçları analiz edebilen, kodları açıklayan ve otomatik testler yazabilen yapay zekâlar da var.

Burada amaç yazılımınızın kırılmasını imkânsız hâle getirmek değil, saldırganın işini zorlaştırmak ve olası zararı azaltmak olmalı. Hiç önlem almayın demiyoruz.

Hatta gerekirse AI yardımı ile kırılmasını zorlaştırabilirsiniz. Ama her şeye karşı hazırlıklı olun.

2. İstemciye güvenmeyin.

Özellikle çevrim içi oyun geliştiriyorsanız bu madde hayati önem taşıyor.

Oyuncunun bilgisayarında çalışan uygulamanın gönderdiği her verinin doğru olduğunu varsaymayın. Örneğin oyuncunun hareket hızını, sahip olduğu parayı, verdiği hasarı veya envanterindeki eşyaları yalnızca istemcinin bildirdiği değerlere göre belirliyorsanız ciddi bir mimari hata yapıyorsunuz. Bu tür kritik işlemlerin doğrulanmasını mümkün olduğunca sunucu tarafında gerçekleştirin. (Valorant bunun suyunu çıkardı. Elinizdeki silahın animasyonu bile sunucuya göre davranıyor.) Tabii bu da hile problemini tamamen çözmüyor. Aimbot gibi hileler, oyuncunun gerçekleştirebildiği meşru girişleri taklit edebiliyor. Ancak sunucu otoritesine dayalı bir mimari, en azından istemcinin kendi kendine kuralları değiştirmesini ciddi ölçüde sınırlandırıyor.

Bir diğer önemli nokta da istemciye gönderdiğiniz veriler.

Oyuncunun görmemesi gereken bilgileri, gereksiz yere oyuncunun bilgisayarına göndermeyin. Örneğin rakibin konum bilgisi istemcinin belleğinde mevcutsa bu bilginin hile yazılımları tarafından okunması ihtimalini değerlendirmelisiniz.

Sadece oyun geliştiricilerine değil, web geliştiricilerine de buradan sesleniyorum: ""Çalışıyorsa dokunma!"" kafasından tamamen çıkmanız gerekiyor. Gözlemlediğim kadarıyla bu hata çok fazla yapılıyor. PHP güvenlik açığı çıktı. Kıyamet koptu. Devletler bile sitelerini kapattı. Eleman PHP güncellemeye çekiniyor.

Web geliştiricilerin (Vibe Coder'lar gerekirse bunu prompt olarak verin): SQL Injection, XSS açıkları gibi açıklara karşı projelerini taramaya, istemci tarafından gelebilecek tehlikeli verilere karşı önlem almaya ihtiyacı var.

3. DRM sistemlerine körü körüne güvenmeyin.

Denuvo, Steam DRM veya kendi geliştirdiğiniz lisans kontrol sisteminiz olabilir. Bunların hiçbiri tek başına mutlak koruma sağlamaz. Zaten Steam bu konuda Allah'a emanet.
DRM sistemleri, korumanın aşılmasını zorlaştırabilirsiniz. Ancak bütün güvenlik stratejinizi yalnızca DRM üzerine kurarsanız, bu korumanın aşılması durumunda hazırlıksız yakalanabilirsiniz.
Lisans kontrolünü yalnızca istemci tarafında değerlendiriyorsanız, yazılımcılığı bırakın; vibe codder bile olmayın bir zahmet.

Burada bir ayrıntıyı da atlamamak gerekiyor: Her ürünün sürekli internet bağlantısına veya aşırı agresif DRM sistemlerine ihtiyacı yok. Şöyle ki bu konuyu abartan şirketlerin korsan sürümünün daha performanslı çalıştığını bile duyabilirsiniz. Bunu da yapmayın artık be kardeşim.

Korsan kullanımı önlemeye çalışırken parasını ödeyip ürününüzü satın alan kişilerin deneyimini berbat etmeyin. Bu da benim minik tavsiyem.

4. Yapay zekâyı saldırganlardan önce siz kullanın.

Yazının başından beri yapay zekânın saldırganların işini kolaylaştırmasından bahsediyorum. Peki aynı araçları neden siz kullanmıyorsunuz?

Kendi yazılımınızın güvenliğini incelemek için yapay zekâdan yararlanabilirsiniz. Kodlarınızdaki mantık hatalarını aratın. Girdi doğrulamalarını kontrol ettirin. Yetkilendirme mekanizmalarınızı test edin. Kullanıcıdan gelen beklenmedik verilerin yazılımınızı nasıl etkileyebileceğini araştırın. Hatta mümkünse kendi uygulamanız üzerinde izinli tersine mühendislik testleri gerçekleştirin.

Yazılımınızı kaynak koduna erişmeden incelemeye çalışın. Dışarıdan bakıldığında hangi bilgiler elde edilebiliyor, hangi güvenlik varsayımlarınız geçersiz kalıyor, bunları araştırın.

Ancak yapay zekânın bulduğu her açığın gerçek olduğunu da düşünmeyin. Yanlış pozitifler üretebilir, olmayan sorunları varmış gibi gösterebilir.

Bir de şunu söylemekte fayda var: ""Yapay zekâyı güvenlik uzmanının yerine geçen bir mucize olarak değil, işini hızlandıran bir araç olarak değerlendirin.""

5. Yazılımınızın içerisine gizli bilgiler koymayın.

Bu hata yalnızca amatör geliştiriciler tarafından yapılmıyor. API anahtarları, veritabanı parolaları, özel erişim bilgileri ve benzeri veriler zaman zaman doğrudan uygulamaların içerisine yerleştiriliyor. Ardından kodlar karmaşıklaştırılıyor ve kimsenin bunları bulamayacağı düşünülüyor.

Oysa istemciye dağıttığınız yazılımın içerisindeki bilgileri bir sır olarak kabul edemezsiniz. Özellikle sunucu tarafında kalması gereken anahtarları istemciye göndermeyin. Yetkilendirme işlemlerini güvenilir sunucu bileşenlerinde gerçekleştirin.

6. Hile tespitini ciddiye alın.

Bir anti-cheat sistemi kullanıyor olabilirsiniz. Ancak güvenliği yalnızca oyuncunun bilgisayarındaki bir yazılıma emanet etmek de doğru değil. Sunucu tarafında olağan dışı davranışları tespit etmeye çalışın. Örneğin insanın gerçekleştirmesi güç olan hareket örüntülerini, olağan dışı isabet oranlarını ve mümkün olmayan oyun içi durumları araştırabilirsiniz.

(Minik not: İyi oynayan bir oyuncuyu yalnızca yüksek isabet oranına sahip diye banlamak da kabul edilebilir bir yöntem değil. False-Positive üretip beni suçlamaya gelmeyin sakın. :D) Ayrıca anti-cheat sistemlerinin oyuncuların gizliliğine ve bilgisayarlarının performansına etkisini de unutmayın.

Bu arada hile demişken: Hile dediğimiz kavram sadece oyunlarda olmuyor. Bu yazıyı atlayan web veya program geliştiricilerin haberi olsun: Mantık dışı bir rakam, dize gelmesi, ağ trafiği oluşması gibi durumları değerlendirin.


7. Güncellemeleri ve bağımlılıkları ciddiye alın.

Yapay zekâ ile daha hızlı yazılım geliştiriyoruz. Ancak daha hızlı kod üretmek, otomatik olarak daha güvenli yazılım üretmek anlamına gelmiyor. Kullandığınız üçüncü taraf kütüphaneleri takip edin. Bilinen güvenlik açıklarını kontrol edin. Güncelleme mekanizmanızı güvenli tasarlayın.

Yazılım güncellemelerinde dijital imza doğrulaması gibi mekanizmalar kullanın. Çünkü bazen saldırganların yazılımınızın kendi güvenliğini aşmasına bile gerek kalmıyor. Kullandığınız bağımlılıklardaki veya güncelleme altyapınızdaki bir güvenlik açığı yeterli olabiliyor.

8. Ürününüzü korurken kullanıcılarınızı cezalandırmayın.

Bu konu özellikle oyun sektöründe önemli. Korsancılığa karşı mücadele edeceksiniz diye dürüst kullanıcıların sürekli internet bağlantısına ihtiyaç duymasına, gereksiz performans kayıpları yaşamasına veya kişisel bilgilerinin aşırı derecede toplanmasına neden olmayın. Kötü tasarlanmış koruma sistemleri bazen korsan kullanıcılardan çok ürünü satın alanlara zarar verebiliyor.

Güvenlik, kullanıcı deneyimi ve gizlilik arasında makul bir denge kurmak gerekiyor.

9. Bir güvenlik açığı bulunduğunda ne yapacağınızı önceden planlayın.

Bir gün birileri yazılımınızda güvenlik açığı bulabilir. Hatta bunu kötüye kullanmak yerine size bildirmek isteyen kişiler de olabilir.
Güvenlik bildirimleri için bir iletişim kanalı oluşturun. Gelen raporları değerlendirin. Açığın etkisini analiz edin ve gerekli düzeltmeleri hazırlayın.
Sorunu saklamaya çalışmak veya açığı bildiren herkesi kötü niyetli ilan etmek yerine sorumlu açıklama süreçleri oluşturun.
Çünkü güvenlik yalnızca yazılımı yayınlamadan önce yapılan bir işlem değil. Ürünün yaşam döngüsü boyunca devam etmesi gereken bir süreç.

Sonuç: Artık kurallar değişti.

Yıllardır yazılım geliştiriyorum. Eskiden günlerce uğraştığımız problemleri artık yapay zekâya birkaç cümle anlatarak çözebiliyoruz. Bu olağanüstü bir gelişme. (Benim de baya sinirime dokunuyor ama neyse.) Ama aynı gelişme, kötü niyetli kişilerin de işini kolaylaştırıyor.

Eskiden tersine mühendislik yapmak isteyen kişinin işlemci mimarisini, assembly dilini, bellek yönetimini ve işletim sistemi mekanizmalarını ciddi seviyede öğrenmesi gerekiyordu. Bugün bu bilgilerin tamamına sahip olmayan biri bile yapay zekâ yardımıyla belirli analizleri gerçekleştirebiliyor.

Bir de hayatında kod görmemiş elemanın teki çıktı, WinLove ismini çalmış. AI ile program yapmış. Ne diyeyim ki. :D Çöplüğünde takılsın.

Elbette bu, herkesin bir gecede güvenlik araştırmacısı olacağı anlamına gelmiyor. Yapay zekânın ürettiği kodun çalıştığını doğrulamak, karmaşık problemleri çözmek ve hatalı sonuçlarını ayıklamak hâlâ teknik bilgi gerektiriyor. Ancak giriş bariyerinin düştüğü de ortada.

Asıl tehlike, kötü niyetli insanların bir anda çok bilgili hâle gelmesi değil; eskiden gerçekleştiremedikleri bazı işlemleri artık çok daha az bilgiyle gerçekleştirebilmeleri.

Burada OpenAI, Anthropic veya diğer yapay zekâ şirketlerinin getirdiği güvenlik önlemlerine de değinmek gerekiyor. Bu önlemler bazı kötüye kullanımları zorlaştırabilir. Fakat bütün dünyadaki yapay zekâ modellerinin aynı kurallara uyacağını varsaymak gerçekçi değil. Açık ağırlıklı modeller, yerel sistemler ve farklı sağlayıcılar var. Bu nedenle yazılımınızın güvenliğini yapay zekâ şirketlerinin koyduğu sınırlamalara emanet edemezsiniz.

Son olarak şunu söyleyeyim:

Yapay zekâ çağında yazılım geliştirmek kolaylaşıyor. Ama güvenli yazılım geliştirmek, eskisinden daha az önemli hâle gelmiyor. Tam tersine, çok daha önemli hâle geliyor.

Artık yalnızca yazılımınızı nasıl geliştireceğinizi değil, başkalarının onu nasıl analiz edebileceğini, değiştirebileceğini ve kötüye kullanabileceğini de düşünmek zorundasınız.

Sağlıcakla. :)