- 16 yaşındaki bir lise öğrencisi, Mintlify platformundaki bir zafiyeti kullanarak X, Vercel, Cursor, Discord gibi büyük şirketlerin dokümantasyon sitelerinde cross-site scripting (XSS) saldırısının mümkün olduğu bir vakayı derleyip yayımladı. Bu zafiyet sayesinde bug bounty olarak 11.000 dolar aldı
- Mintlify’nin dahili yolu
/_mintlify/static/[subdomain]/[...route], alan adı doğrulaması olmadan harici dosyaları yükleyebilecek şekilde tasarlanmıştı
- Saldırgan, SVG dosyasına JavaScript enjekte ederek Discord gibi büyük servislerin alan adlarında kötü amaçlı betikler çalıştırabildi
- Zafiyet, Mintlify kullanan neredeyse tüm müşterileri etkiledi ve tek bir bağlantı tıklamasıyla hesap ele geçirme mümkün olabildi
- Bu olay, tedarik zinciri güvenliğindeki tek bir zafiyetin büyük ölçekli zarara yol açabileceğini gösteren bir örnek olarak değerlendiriliyor
Discord’da keşif
- 2025 Kasım’ında Discord’un yapay zeka tabanlı dokümantasyon platformu Mintlify’a geçmesiyle zafiyet araştırması başladı
- Araştırmacı, mevcut özel platformdan Mintlify’a geçişin hemen ardından yeni dokümantasyon sisteminin yapısını analiz etti
- Discord’un dokümantasyon alan adı (
discord.mintlify.app), Mintlify’nin dahili yolunu (/_mintlify/*) olduğu gibi açığa çıkarıyordu
- Bu yolun, kimlik doğrulama gibi temel işlevler için erişilebilir olması gerekiyordu
Mintlify platform yapısı
- Mintlify, Markdown tabanlı dokümantasyon yazımını destekleyen ve bunu otomatik olarak web dokümantasyonuna dönüştüren bir servis
- Tüm dokümantasyon siteleri
*.mintlify.app alt alan adında veya özel alan adlarında çalışıyor
- Dahili olarak
/_mintlify/api/user, /_mintlify/markdown/, /_mintlify/static/ gibi endpoint’ler kullanıyor
Zafiyetin araştırılma süreci
/_mintlify/_markdown/_sites/[subdomain]/[...route] endpoint’inin alan adı doğrulaması olmadan başka dokümanların dosyalarını döndürdüğü keşfedildi
- Ancak bu yol yalnızca render edilmemiş Markdown metni döndürdüğü için kod çalıştırmak mümkün değildi
- Sonrasında Mintlify CLI paketi analiz edilerek
/_mintlify/static/[subdomain]/[...route] endpoint’i de bulundu
- Bu yol statik dosyaları döndürüyor ve dosya uzantısı whitelist’i uyguluyordu
- HTML ve JS dosyaları engellenmişti, ancak SVG dosyalarına izin veriliyordu
Saldırının gerçekleştirilmesi
- Saldırgan, içine JavaScript enjekte edilmiş bir SVG dosyasını kendi Mintlify dokümanına yükledi
- Discord alan adında bu dosya çağrıldığında (
https://discord.com/_mintlify/_static/.../lmao.svg) betik çalışıyordu
- Bu sayede yalnızca Discord’da değil, Mintlify kullanan tüm şirketlerin dokümantasyon alan adlarında XSS çalıştırmak mümkün oldu
İş birliği ve bildirim
- Araştırmacı, zafiyeti doğrulamak için diğer güvenlik araştırmacılarıyla birlikte çalıştı
- Discord, bildirimden hemen sonra geliştirici dokümantasyonunun tamamını 2 saatliğine devre dışı bıraktı ve ardından eski platformuna geri döndü
- Mintlify, zafiyetten Discord üzerinden haberdar olduktan sonra mühendislik ekibi ile araştırmacılar arasında bir Slack kanalı açarak düzeltme çalışmalarına hemen başladı
Etki alanı
- X(Twitter), Vercel, Cursor, Discord gibi Mintlify müşterilerinin büyük bölümü etkilendi
- Her şirketin resmi alan adında tek bir kötü amaçlı bağlantıyla hesap ele geçirme ihtimali vardı
- Tedarik zincirindeki tek bir zafiyet, yüzlerce şirketin güvenliğinde zincirleme risk yaratabiliyor
Ödül ve sonuç
- Araştırma ekibi toplamda yaklaşık 11.000 dolarlık bug bounty aldı
- Discord 4.000 dolar ödedi, Mintlify ise her bir zafiyet için ek ödül verdi
- Bu vaka, tedarik zinciri güvenliğinin önemi ile tek bir platform zafiyetinin etki alanını gösteren temsilî bir örnek olarak kaldı
1 yorum
Hacker News yorumları
Bu exploit gerçekten korkutucu bir örnek
Tek bir bağlantıya tıklamak bile yeterli; örneğin https://discord.com/_mintlify/static/evil/exploit.svg gibi bir bağlantıya basıldığında, Discord alan adında JavaScript çalıştırılıyor
Bunun sonucunda oturum çerezleri veya token'lar çalınabiliyor, hesap tamamen ele geçirilebiliyor; geliştirici uygulamaları ya da webhook'lar manipüle edilebiliyor, API üzerinden sunucular silinebiliyor veya ödeme bilgileri kullanılarak Nitro satın alınabiliyor; yani etki çok büyük
Bu ölçekte bir zararı düşününce 4.000 dolarlık bug bounty ödülü fazla düşük geliyor
Oturum çerezleri her zaman HTTP-only olarak ayarlanırsa bu tür saldırılara karşı çok daha dayanıklı olunur
Frontend geliştiricileri arasında bu temel güvenlik kavramlarını bilmeyen bu kadar çok kişi olması şaşırtıcı
Karaborsada bunun değeri çok daha yüksek olabilirdi
SVG dosyalarına script gömülebilmesinin kendisi başlı başına bir güvenlik hatası gibi geliyor
Etkileşimli demoları veya oyunları tek bir SVG ile yapabilmek havalı olsa da, bu aynı zamanda büyük bir zafiyet kaynağı
Bu yüzden birçok platform SVG yüklemeyi yasaklıyor ya da önizlemeyi engelliyor
Discord'da da SVG yükleyince kod olduğu gibi görünüyor ve Facebook Messenger ya da WeChat gibi yerlerde de paylaşılamıyor
Dosya boyutunun küçük olması ve çözünürlükten bağımsızlık gibi avantajlarına rağmen, raster görüntü formatlarının hâlâ daha yaygın kullanılmasına üzülüyorum
Rails'in Active Storage'ı varsayılan olarak SVG'leri sanitize etmez, buna dikkat etmek gerekir
Ayrıntılar için OWASP belgesine bakılabilir
<script>etiketini sadece yok saysa bu çözüm olur mu diye merak ediyorumAma muhtemelen bu tek başına yeterli olmaz
Raster formatlarda bu tür sorunlar neredeyse yok
Bu olay sanki günümüz yapay zeka startup ekosisteminin bir kesitini gösteriyor
VC parasıyla büyüyen bir yapay zeka dokümantasyon startup'ı, güvenlik doğrulaması olmadan büyük müşteriler kazanıyor ve sonunda milyonlarca insanı riske atıyor
Mintlify kısa süre önce karmaşık bir caching mimarisiyle övünen bir blog yazmıştı, ama görünüşe göre en temel güvenliği bile bilmiyorlar
Böyle bir açığı bulan kişi ise sadece 5.000 dolar alıyor
Bence bu, günümüzdeki yapay zeka temelli geliştirme kültürünün ne kadar kırılgan olduğunu gösteren bir örnek
Karmaşık bağımlılık zincirleri ve çok sayıda üçüncü taraf DLL cehennemi asıl neden
Discord API belgelerini doğrudan discord.com üzerinden sunmasaydı bu sorun yaşanmazdı
Sadece CDN yetmez mi?
Bu, müşteri hesaplarının tamamen ele geçirilmesine yol açabilecek bir hata ve ödül miktarı çok düşük
Bu çağda XSS'ye izin vermek için bir gerekçe olmamalı
Anubis'te bu yıl iki tane reflected XSS bulundu
Üçüncü taraf bağımlılıklarını mutlaka denetlemek gerekiyor
İlgili güvenlik duyuruları için buraya ve buraya bakılabilir
Büyük sosyal ağlar dışında bunlardan para kazanmak zordur
Böyle bir zafiyeti bulan 16 yaşındaki hackeri tam zamanlı ya da yarı zamanlı işe alıp sürekli güvenlik denetimi yaptırmak nasıl olur diye düşündüm
Yıllık 50.000 dolar bile verseniz şirket güvenliği muhtemelen ciddi şekilde güçlenir
Bug bounty sonuç odaklı ödeme yaptığı için daha verimli
Yine de ödül düşükse araştırmacı bunu üçüncü taraflara satmaya yönelebilir
XSS, IAM, shell exploit gibi herkesin ayrı uzmanlığı var; tek bir kişinin her şeyi kapsaması zor
16 yaşında birinin bunu bulmuş olması etkileyici
Ama XSS'yi supply chain attack olarak adlandırmak bana biraz yabancı geliyor
Sorun Mintlify gibi bir ara katmanda çıkarsa son kullanıcıların kendilerini savunacak bir yolu kalmıyor
Kötü amaçlı kod güvenilen zincirin içinden taşınıyor; bu yüzden bir tür supply-chain düzeyinde XSS sayılabilir
İşbirlikçinin raporunda daha da ciddi bir RCE zafiyeti de yer alıyor
Ayrıntılar için bu bloga bakılabilir
Bu tür örnekleri görünce,
1️⃣ Content Security Policy (CSP) mutlaka ayarlanmalı
2️⃣ NodeJS sunucularında
--disallow-code-generation-from-stringsseçeneği varsayılan olarak kullanılmalıVercel gibi servis sağlayıcılar, CSP kullanılmadığında uyarı göstermeli
NodeJS için ek güvenlik bayrakları bu yazıda özetlenmiş
Kullanıcı kimliğinin bağlı olduğu ana alan adında üçüncü taraf bir hizmeti proxy'lemek yapılabilecek en kötü tercihlerden biri
Mintlify,
dev-docs.discord.comgibi ayrı bir alt alan adına ayrılmalıydıMüşteri istese bile güvenlik riski fazla büyük
Yine de SEO nedeniyle dokümantasyonu ana alan adında tutmak isteyen çok oluyor
Mintlify açısından bu olayın çok stresli olduğunu tahmin edebiliyorum
Üçüncü taraflar için ayrı bir alt alan adı kullanılmalı ve ana uygulamanın kimlik doğrulama çerezleri host-only olarak sınırlandırılmalı
Mümkünse tamamen farklı bir alan adı kullanmak (
discorddocs.comgibi) daha da güvenli olurAma güvenlik riskine kıyasla bu tercih fazla tehlikeli
Artık SVG dosyalarını asla açmayacağım
16 yaşında birinin bunu bulmuş olması gerçekten efsanevi