- GPT5.6 Sol Ultra, en güncel kararlı WordPress sürümünü analiz ederek kimlik doğrulama öncesi SQL enjeksiyonundan yönetici hesabı oluşturmaya ve uzaktan kod çalıştırmaya (RCE) uzanan saldırı zincirini yaklaşık 10 saat içinde tamamladı
- Başlangıç noktası, WordPress 5.6’dan beri sunulan Batch API’deki dizi indeksi uyumsuzluğu oldu; özyinelemeli Batch istekleri birleştirilerek GET kısıtı ve parametre doğrulaması aşıldı
- Doğrulanmamış
author_excludedizesiyle UNION enjeksiyonu tetiklendikten sonra, manipüle edilmiş gönderi bellek önbelleğine yerleştirilip oEmbed önbelleği·changeset·döngüsel referans·hook zincirleme biçimde kötüye kullanıldı customize_changesetiçindekiuser_id: 1ile geçici yönetici yetkisi alınıpparse_requesthook’u üzerinden Batch isteği yeniden çalıştırılarak yeni bir yönetici oluşturuldu; ardından arka kapı eklentisi ZIP’i yüklenerek kod çalıştırmaya ulaşıldı- Aylık 200 dolarlık aboneliğin haftalık kullanımının %50’si oransal hesaplandığında maliyet yaklaşık 25 dolar oldu; insanın rolünün ürün ve saldırı yüzeyi seçimi, prompt ayarlama gibi üst düzey araştırma yönlendirmesine kayma olasılığı artıyor
Keşif süreci ve deney koşulları
- OpenAI’nin Cycle Double Cover varsayımını çözmek için kullandığını açıkladığı prompt, güvenlik araştırması için değiştirilerek GPT5.6 Sol Ultra’ya verildi
- En güncel kararlı WordPress sürümü
main/içine klonlandı ve.gitdizini silindi; bağımlı kodları inceleyebilmesi için boş birthird_party/dizini hazırlandı - Prompt, en fazla 4 ajanı paralel kullanarak en az 6 saat boyunca çeşitli saldırı yollarını sürdürmesini istedi
- Girdi ayrıştırma, karakter kümesi, dosya yükleme, hata işleme, yerleşik yollar, serileştirme, önbellek, yarış koşulları, şifreleme, tipler, toplu atama gibi alanları araştırdı
- Yaklaşım ailelerini kaydedip ajanlar belirli bir stratejiye yığıldığında daha az araştırılmış alanlara yeniden dağıttı
- Somut hataları karşıt ajan yeniden doğruladı; başarısız yollar da yeni bir mekanizma ortaya çıktığında yeniden açıldı
- Değişiklik geçmişi veya yama sürümleriyle farklar ya da internet ipuçları kullanılmadan kaynak kodun kendisinden yeni açıklar bulunmasıyla sınırlandırıldı
- Gerçek dışı yapılandırmalardan veya saldırganın sağlayamayacağı ön koşullardan kaçınmak için hedef “MySQL kullanan tipik bir prodüksiyon dağıtımında kimlik doğrulama öncesi RCE” olarak belirtildi
- Yaklaşık 6 saat sonra model kimlik doğrulama öncesi SQL enjeksiyonu buldu; varsayılan bir WordPress uzak sunucusunda yönetici e-postasını dakikalar içinde çıkararak yeniden üretildi
- RCE’ye yükseltme ayrıca istendiğinde, yaklaşık 4 saat sonra parola kırma veya çevrimdışı hesaplama olmadan salt okunur SQL enjeksiyonundan yönetici yetkisine çıkan zinciri tamamladı
- Toplam çalışma süresi 10 saatten biraz fazla oldu ve haftalık kullanımın %50’si tüketildi. Aylık 200 dolarlık abonelik ücreti oransal hesaplandığında maliyet yaklaşık 25 dolardı
- Yayın öncesi hafta sonu boyunca operatörlere WordPress’i yükseltmeleri için zaman tanındı; bu sırada Calif ve Hacktron, GitHub’daki diğer PoC’lerden önce tüm zinciri bağımsız olarak yeniden üretti
- Çalışan örneklerin savunmasız olup olmadığı wp2shell.com üzerinden kontrol edilebilir
Batch API’deki doğrulama uyumsuzluğu
- WordPress 5.6’da tanıtılan Batch API, tek bir istekle birden fazla sanal API isteğini işler. Endpoint’in kendisine kimlik doğrulama olmadan erişilebilir, ancak her alt isteğe kimlik bilgileri aktarılır
- Normal REST istekleri şu sırayla işlenir
- Zorunlu değerler ve geçerlilik
has_valid_params()ile kontrol edilir - Değerler
sanitize_params()ile temizlenir - Yetki callback’i çalıştırılır
- Endpoint callback’i çalıştırılır
- Zorunlu değerler ve geçerlilik
- Batch API performans için doğrulama ve çalıştırmayı iki döngüye ayırır
- İlk döngüde tüm istekler doğrulanır ve temizlenir
- İkinci döngüde doğrulama sonucu kontrol edilip yetki ve endpoint callback’leri çalıştırılır
- Uygulama, rota eşleşme sonucu olan
$matchesile doğrulama sonucu olan$validationiçinde aynı indekslerin birbirine karşılık geldiğini varsayar - Hatalı bir istek
is_wp_error($single_request)dalına girerse$validationiçine bir öğe eklenir, ancakcontinuenedeniyle$matchesiçine eklenmez- Sonrasında tüm
$matchesöğeleri bir sıra kayar - Bir isteğin parametreleri başka bir isteğin kurallarıyla doğrulandıktan sonra, başlangıçta amaçlanmayan endpoint handler’ında çalıştırılabilir
- Sonrasında tüm
- Bu indeks uyumsuzluğu, parametreleri temizlemeyen başka bir endpoint’in doğrulama sonucunu Batch destekli bir endpoint’e uygulamayı sağlar
author__not_in içinde oluşan SQL enjeksiyonu
GET /wp/v2/posts, belirli yazarları sonuçlardan hariç tutmak için dahili sorgu değişkeniauthor__not_inkullanır- Değer bir diziyse her elemana
absintuygulanarak tamsayıya çevrilir; skaler değerse olduğu gibiimplodeedildikten sonra SQL’dekiNOT INifadesine eklenir - Normal çağrıda herkese açık
author_excludeparametresinin tamsayı dizisi olması gerektiğinden sorun ortaya çıkmaz - Batch indeks uyumsuzluğu kullanılarak
author_excludedizesi, bunu tanımayanDELETE /wp/v2/posts/1kurallarıyla doğrulanıpGET /wp/v2/posts’a geçirilebilir - Batch API’nin GET alt isteklerine izin vermeme kısıtı da özyinelemeli Batch çağrısıyla aşılır
- Dış Batch’te indeks uyumsuzluğu oluşturularak iç isteğin
methoddoğrulaması atlanır - İç Batch’te yeniden indeks uyumsuzluğu oluşturularak
author_excludedoğrulaması aşılır
- Dış Batch’te indeks uyumsuzluğu oluşturularak iç isteğin
0) OR 1=1 --gibi bir değer girilirse tüm gönderi satırları döner ve enjeksiyon doğrulanabilir- Ardından UNION tabanlı enjeksiyonla
wp_postsile aynı biçimde satırlar oluşturulup rastgele veritabanı değerleri sızdırılabilir - Parolalar, sıfırlama token’ları ve API anahtarları veritabanında hash’lendiğinden, yönetici parolası zayıf değilse yalnızca veri sızıntısı hesap ele geçirmeye kadar gitmez
İstek içi gönderi önbelleğini manipüle etme
- WordPress, aynı istek içinde tekrar tekrar başvurulan
WP_Postnesnelerini veritabanı gidiş gelişlerini azaltmak için bellek önbelleğinde saklar - UNION enjeksiyonuyla sahte gönderi satırı döndürülürse gönderi ID’si, tipi, durumu, ebeveyn ilişkisi, gövde gibi birçok alan saldırganın belirlediği şekilde önbelleğe yerleştirilebilir
- API yanıtında da gönderi gövdesi sonradan işlendiği için, manipüle edilmiş gövdeyle ek kod yolları çalıştırılabilir
- Bu önbellek istek bitince kaybolur ve sahte gönderi de veritabanında bulunmaz; bu yüzden yalnızca önbellek manipülasyonu istekler arası kalıcılık sağlamaz
oEmbed önbelleğiyle veritabanı satırı oluşturma
- WordPress’in embeds özelliği, gönderi gövdesindeki
[embed]...[/embed]sözdizimiyle desteklenen uzak içerikleri ekler - Her seferinde HTTP isteği göndermemek için sonuçları
wp_postsiçindeoembed_cachetipinde gönderi olarak veritabanına kaydeder - Yerel bir WordPress gönderisi göreli yolla embed edilirse HTTP isteği atlanır ve başvurulan gönderi ID’sinin gerçekten var olup olmadığı kontrol edilmez
/?p=10gibi var olmayan bir yerel gönderi embed edilse bile bu veri içinoembed_cachesatırı oluşturulabilir- Oluşturulan satır SQL enjeksiyonuyla tekrar sorgulanırken bellekteki gönderi tipi
postvb. olarak manipüle edilirse veritabanı ile önbelleğin gösterimi farklılaşır - WordPress iki gösterimi uzlaştırırken
wp_update_post()çağırır; açıkça belirtilenIDvepost_contentdışındaki alanlarda saldırganın oluşturduğu bellek değerleri tercih edilir - Böylece
oembed_cachesatırı normal gönderiye çevrilebilir, ancak bu çağrıdapost_contentembed sonucuyla üzerine yazıldığı için saldırgan gövdeyi de kontrol edemez
customize_changeset ile geçici yönetici yetkisi
- Tema özelleştirme işlemlerinin taslakları,
wp_postsiçindecustomize_changesettipinde özel gönderiler olarak kaydedilir post_content, ayar anahtarlarına göre değişiklik değerlerini, tipleri ve değişikliği yapan kullanıcı ID’sini içeren JSON barındırır- Changeset uygulanırken WordPress her öğenin
user_iddeğerini okuyupwp_set_current_user()ile geçerli kullanıcıyı geçici olarak değiştirir - Saldırgan
user_id: 1olan bir changeset uygularsa anonim istek sırasında bile kısa süreliğine yönetici kimliğini kullanabilir - Önceki oEmbed uzlaştırma çağrısı
post_contentüzerine yazdığı için, kötü amaçlı changeset JSON’unu koruyacak ayrı birwp_update_post()çağrı yoluna ihtiyaç vardır
Gönderi ebeveyn döngüsüyle gövdeyi koruma
- WordPress gönderileri bir ebeveyne sahip olabilir, ancak kendisini veya alt gönderilerini ebeveyn yapan döngüsel yapılara izin verilmez
wp_insert_post_parentfiltresi ebeveyn hiyerarşisini izleyerek döngü olup olmadığını kontrol eder; döngü bulursa ilgili gönderininpost_parentdeğerini 0 yapanwp_update_post()çağrısı yapar- Bu ikinci çağrı yalnızca
IDvepost_parentbelirtir,post_contentüzerine yazmaz - SQL enjeksiyonuyla bellekteki gönderi kendisini ebeveyn alan bir
customize_changesetgibi düzenlenirse, döngü düzeltme sırasında saldırganın belirttiği kötü amaçlı changeset JSON’u veritabanına yazılır - Geçmiş tarihli ve durumu
futureolan bir changeset oluşturulursa WordPress bunu uygular veuser_id: 1uyarınca yönetici yetkisiyle belirtilen ayar değişikliğini gerçekleştirir - Yönetici yetkisi yalnızca changeset işlemi sırasında korunur; tamamlandıktan sonra tekrar misafir yetkisine döner
Dinamik hook ile tüm isteği yeniden çalıştırma
- WordPress hook’ları, action ve filter olarak ikiye ayrılır; eklentilerin giriş, yayınlama, script kaydı gibi yaşam döngüsünün çeşitli noktalarına müdahale etmesini sağlar
- Gönderi durumu değiştiğinde WordPress
"{$new_status}_{$post->post_type}"biçiminde dinamik bir action çalıştırır- Normal bir gönderide bu ad
publish_postgibi olur - Bellekteki sahte gönderinin durumu ve tipi rastgele belirlenebildiği için içinde en az bir alt çizgi olan istenen action adı oluşturulabilir
- Normal bir gönderide bu ad
- Hook argümanları saldırganın belirlediği gönderi ID’si ve
WP_Postnesnesiyle sınırlı olduğundan, rastgele action’ları doğrudan faydalı biçimde çağırmak zordur - Saldırı zinciri durumu
parse, tipirequestolarak manipüle ederekparse_requesthook’unu çağırır parse_request, istek yaşam döngüsünün erken aşamasında çalışan bir hook olduğundan, yeniden çağrılması orijinal Batch API isteğinin baştan yeniden işlenmesini sağlar- Yeniden işleme, changeset’in ayarladığı geçici yönetici kimliği korunurken gerçekleşir; ilk çalıştırmada yetki eksikliği nedeniyle başarısız olan yalnızca yöneticilere açık istek ikinci çalıştırmada başarılı olur
İki istekle tamamlanan RCE zinciri
- Nihai exploit iki HTTP isteği kullanır ve sahte gönderilere gerçek gönderilerle çakışmayacak kadar büyük ID’ler atar
-
İlk istek: kalıcı satırları hazırlama
- SQL enjeksiyonuyla üç yerel embed içeren sahte bir gönderi döndürülerek
O,C,D’ye karşılık gelen 3oembed_cachesatırı oluşturulur - Üç embed aynı gönderi
S’yi işaret eder, ancak ayrı oEmbed önbellek hash’leri oluşturmak için farklı sorgu dizeleri kullanır
- SQL enjeksiyonuyla üç yerel embed içeren sahte bir gönderi döndürülerek
-
İkinci istek: altı gönderiyi birleştirme
- Bellek önbelleğinde aşağıdaki altı sahte gönderi yapılandırılır
O: durumu/tipipublish/oembed_cacheolan ve ebeveyniColan eski önbellekC: durumu/tipifuture/customize_changesetolan, kendisini ebeveyn alan ve kötü amaçlı changeset JSON’u içeren gönderiP: ebeveyniDolandraft/pageD: durumu/tipiparse/requestolan ve kendisini ebeveyn alan gönderiS: embed verisi sağlayanpublish/postT: dış embed’i içerenpublish/postTnin embed’iOyu sorgular ve eski değiştirilme zamanı nedeniyleSnin önbelleğini yeniletirOyenilenirken ebeveynCde döngü algılanırsaCnin ebeveyni 0 yapılır ve bellektekicustomize_changesetile kötü amaçlı JSON veritabanına yazılır- Geçmiş tarihli
futurechangeset uygulanırkenuser_id: 1yönetici kimliğiylePyayımlanır Pgüncellemesi ebeveynDde döngü bulur,Dyi yazar ve manipüle edilmiş durum ve tip ileparse_requestaction’ını çağırır- Batch isteği en baştan yeni yönetici oluşturma isteği içerir
- İlk işlemede misafir yetkisi olduğundan başarısız olur
parse_requestile yeniden çalıştırıldığında geçici yönetici yetkisi hâlâ kaldığı için başarılı olur- Yeni yönetici hesabıyla giriş yaptıktan sonra arka kapı eklentisi ZIP’i yüklenirse sonunda uzaktan kod çalıştırmaya ulaşılır
Yapay zeka güvenlik araştırmasında değişen roller
- Tüm zincirde özellikle yaratıcı adımlar, özyinelemeli Batch çağrısıyla GET kısıtını aşmak, önbellek ile changeset’i birleştirerek yönetici yetkisi almak ve sahte gönderiyle
parse_requestçağırarak isteği yeniden çalıştırmaktır - Genel bir üstünlük kesin olarak söylenemez, ancak yapay zeka olmadan bir güvenlik araştırmacısının aynı zinciri 10 saat içinde bulup tamamlamasının imkânsız olacağı değerlendiriliyor
- Asıl Batch hatası önceden verilse bile bu süre içinde RCE’ye kadar kurgulanıp kurgulanamayacağı konusunda emin olmak zor görülüyor
- Birbirinden uzak çeşitli kod gadget’larını bulup tek bir zincirde birleştirme yeteneğinde GPT5.6 Sol Ultra’nın önceki GPT5.5’e göre büyük ilerleme kaydettiği değerlendiriliyor
- Model teknik exploit geliştirmeyi daha fazla üstlendikçe insan, incelenecek ürün ve saldırı yüzeyi, ayrılacak zaman, araştırma yönü gibi konuları belirlemeye ve model sapınca düzeltmeye odaklanıyor
- Bu tür meta araştırma becerileri yapay zekanın hâlâ iyi yönetemediği alanlar; modelin teknik yeteneği arttıkça daha da önemli hale geleceği öngörülüyor
1 yorum
Hacker News görüşleri
Bu tür bir exploit için 500 bin dolar ödendiğine ya da ödeneceğine dair bir dayanak yok. Yazıda prompt’un kutsal metin gibi dikkatle değiştirildiği söylenmiş; o halde o prompt’u 500 bin dolara satmak daha mantıklı olurdu
Yazar, otomatik tarama yapan yapay zeka ürünleri sunan https://www.assetnote.io/ şirketinde çalışıyor
Bu tür aracılar genelde büyük meblağı tek seferde ödemez; erişimi devlet aktörlerine sattıktan sonra, hata patch'lenmediği sürece parayı parça parça öder. Yeniden satış ya da erken tükenmeyi önlemeye yönelik bir yapı olduğu için, benzer bir zafiyetten gerçekten tam ödeme alınıp alınmadığını doğrulayabilecek kişi neredeyse yoktur
Buna en yakın örnek, Steam oyunlarına kötü amaçlı yazılım koyup hesap çalarken yakalanan Floridalı gençler. Zaten yakalanırlardı ama sosyal medyada böbürlenmeseler soruşturma çok daha uzun sürerdi
https://github.com/WordPress/WordPress/commit/3a640e1c5e39aa... bağlantısına bakınca 2026'da bile string birleştirmeli SQL injection görüyoruz
SQL'i doğrudan çalıştırmak yerine
dbDeltakullanın deniyor ama her alanın ayrı satırda olması,PRIMARY KEYarasında iki boşluk bırakılması,INDEXyerineKEYkullanılması gibi aşırı hassas biçimlendirme kuralları isteniyor. Alan adlarında tırnak ya da backtick kullanılamıyor, veri türleri küçük harfli, SQL anahtar kelimeleri büyük harfli olmalı ve tüm uzunluk parametreleri de belirtilmelisprintfile SQL sorgusu oluşturuyor olması akıl almazPOSTveGETisteklerinin içinde/wp/v2/widgets?author_exclude=1%29+AND+1%3D0+UNION+ALL+SELECT...biçiminde payload vardıPrincipal Software Engineer @ Bluehost,WordPress Core Committeryazıyor; böyle bir kod görünce o “principal” ifadesi gerçekten tuhaf kaçıyorFOMO tarzı yazılardan bıktım. Bu şey sadece 25 dolarla bulunmadı; nereye bakılacağını ve nasıl araştırılacağını bilen sektör uzmanlığıyla, yıllar içinde birikmiş malzeme de vardı
Kumarvari anlatıları ve herkesin bir fırsatı kaçırdığı yanılsamasını yaymayı bırakmak lazım
Şaşırtıcı olan kısım, zaten bilinen bir zafiyetin bu kadar yüksek fiyatlanması; hatta bu doğru da olmayabilir. WordPress sık sık blog özelliği eklenmiş uzak root shell diye anılır
Ortalama kullanıcıya GitHub deposuna commit atıp Hugo ile build almasını söylemek yerine sürükle-bırak anlatmanın daha kolay olduğunu anlıyorum. Ama güvenlik açısından bakınca, çekirdekte ya da binlerce eklentiden birinde bir zafiyet çıkıp hizmet olarak uzaktan kod çalıştırma açılmasını bekleyen bir yapı bu
İlginç bir yazı ve LLM tabanlı exploit bulma ve yayımlama gerçekten kaygı verici bir konu. Bir modele, bir Linux yerel yetki yükseltme zafiyetinden konteyner kaçış kodu da nispeten hızlı şekilde ürettirmiştim
Yine de GPT-5.6'nın güvenlik önlemleriyle prompt'u engellememiş olması şaşırtıcı. GPT-5.5 ve sonrası, Opus 4.7+/Fable gibi, saldırgan güvenlik işlerine mesafeli olma eğiliminde; bu yüzden yazarın OpenAI'dan güvenlik önlemlerini gevşeten bir siber güvenlik onayı almış olması muhtemel görünüyor
2020 öncesindeki AI olmayan statik uygulama güvenlik testi (SAST) araçları da bu tür SQL enjeksiyonlarının çoğunu yakalıyordu; en azından kod incelemesinde bulunması gerekirdi. WordPress'in kod incelemesi ya da SAST kullanıp kullanmadığı merak konusu
Web sitelerimden biri bu zafiyet yüzünden hacklendi ama neyse ki kullanıcı olmayan bir yerdi
Saldırgan veritabanında iki yönetici hesabı oluşturdu ve
wp-content/plugins/wp-coreiçinewp-core-[rastgele 12 karakter].phpadlı uzaktan komut çalıştırma web shell'i kurdu.mu-pluginsiçineGET ?sergeiile yönetici oluşturanfirewall.phparka kapısını bıraktı vecache-seo-helper.phparka kapısını da ekledi; ayrıcafixer.phpile WordPress sürüm numarasını yamalanmış sürüm gibi gösterdi. Sonunda WordPress kullanmaktan vazgeçmeye karar verdimYazının sonunda gönderileri tuhaf adlarla anmaya başlayınca anlaşılması zorlaştı. Bir ID
O, diğeri0yapılmış; ayrıcaEMBED_01ya daABCDEFyerine tek harfler ve rastgele görünenOCPDSTkullanılmış, bunun nedeni merak uyandırıyorO,publish/oembed_cache;C,future/customize_changeset;P,draft/page;D,parse/request;S, embed verisini sağlayanpublish/post;Tise harici embed içerenpublish/postanlamına geliyor500 bin dolar ödeyecek kişilerin GPT-5.6'yı doğrudan kullanabilecek yeteneğe sahip olmadığının varsayıldığı düşünülebilir
Ben de LLM ile güvenlik zafiyetleri buluyorum ama sonucu olduğu gibi gönderip işi bitiremiyorum; bunu yapmaya çalışan çok kişi var
GPT-5.6 Sol insanüstü mü sorusu basit bir evet-hayır meselesi değil. Bilgisayarlar onlarca yıldır satrançta insanları geride bırakıyordu; bu yazıya bakılırsa artık kodu anlamada da insanları aşmış görünüyor