· kaynak dev.to (home feed)
MCP tarayıcısının path-traversal kuralı, 9.1 puanlı bir RCE dahil 2026'daki tüm yazma tarafı MCP CVE'lerini kaçırdı
Bir dev.to gönderisi, mcpscan MCP güvenlik tarayıcısının path-traversal kuralının yalnızca okuma sink'lerini izlediğini ve 2026'daki tüm yazma tarafı MCP CVE'lerinin bu sayede sıyrıldığını gösteriyor. Bir write-sink regex yaması bu boşluğu kapatıyor.

MCP sunucularındaki hataları yakalamak için geliştirilen bir güvenlik tarayıcısının, avladığı kusurları bizzat yansıttığı ortaya çıktı. Bir dev.to gönderisinde, mcpscan'ın — Model Context Protocol sunucularını command injection, SSRF ve path traversal için tarayan bir statik analiz aracının — yazarı, aracı 2026'da MCP sunucularına karşı açıklanan dört path-traversal CVE'si ile karşılaştırarak inceledi. Path-traversal kuralı, CVSS 9.1 puanlı kimlik doğrulaması gerektirmeyen bir uzaktan kod yürütme (RCE) açığı dahil hepsini kaçıracaktı. Gönderi bu boşluğu adım adım anlatıyor ve tek kurallık bir düzeltme yayımlıyor.
Kör nokta
Gönderiye göre dört CVE dört farklı geliştiriciyi etkiliyor ancak tek bir kök nedeni paylaşıyor: çağıran tarafın kontrolündeki girdiden oluşturulan ve hedeflenen dizin içinde kalıp kalmadığının hiçbir şekilde denetlenmediği bir dosya yolu.
Liste şunları kapsıyor: excel-mcp-server'daki CVE-2026-40576 (dosya yazımı yoluyla path traversal), appium-mcp-server'daki CVE-2026-84201 (write_file aracı yoluyla path traversal), PraisonAI MCP'deki CVE-2026-44336 (site-packages içine bir Python .pth dosyası yazarak RCE) ve mcp-atlassian'daki CVE-2026-27825; burada confluence_download_attachment yolu kimlik doğrulaması gerektirmeyen bir RCE'ye izin veriyordu. Gönderiye göre bu açık, SSRF sorunu olan CVE-2026-27826 ile zincirlenerek ~/.ssh/authorized_keys dosyasının üzerine yazabiliyor veya bir cron girdisi bırakabiliyor — kimlik doğrulaması da yeniden başlatma da gerekmiyor.
mcpscan'ın dördünü birden kaçırmasının nedeni, kuralın kendi docstring'inde yatıyor diye yazıyor yazar: MCP007, dosya okuma araçlarındaki path traversal'ı tespit ettiği şeklinde belgelenmiş. İlk günden itibaren okuma tarafına kapsamlanmışken, 2026'daki her gerçek sömürü yazma tarafında işledi.
Kural nasıl çalışıyor
mcpscan'ın kuralları tasarım gereği basit: AST olmadan satır satır regex eşleştirmesi, böylece tek bir kural aracın desteklediği tüm dillerde çalışıyor. Bir path-traversal bulgusu için üç regex katmanının aynı anda tutması gerekiyor — dosya açma veya okuma çağrılarını eşleyen bir SINK pattern, dinamik olarak oluşturulan yolları (f-string, birleştirme, .format, değişkenli os.path.join) eşleyen bir INTERP pattern ve satırda bir literal ../ göründüğünde şiddeti yükselten bir TRAVERSAL pattern.
Boşluk sink katmanında yaşıyor. Python pattern'i open(, .read_text(, .read_bytes(, send_file( ve FileResponse( ile eşleşiyordu; JavaScript pattern'i readFile ailesini eşliyordu. Python'ın open() fonksiyonu yazma sink'i olarak da hizmet verdiği için bazı yazma işlemleri tesadüfen yakalanıyordu — ancak write_text, write_bytes, shutil.copy ve os.rename hiç eşleşmiyordu. Bu eksiklik mcp-atlassian hatasının geçmesine izin verdi.
Düzeltme
Yama eklemeli: aynı hattı besleyen ikinci bir sink regex ailesi. Python yazma pattern'i .write_text, .write_bytes, w/a/x mod dizgileriyle yapılan open() çağrıları, shutil copy ve move çağrıları ile os.rename ve os.replace'i kapsıyor. JavaScript pattern'i fs.writeFile, appendFile, createWriteStream, copyFile ve renameSync'i kapsıyor. Her satır her iki sink ailesine karşı denetleniyor ve herhangi bir write-sink eşleşmesi, literal ../ olmasa bile HIGH seviyesine yükseliyor — yazar, saldırgan kontrollü bir hedefin saldırgan kontrollü bir kaynaktan daha tehlikeli bir primitive olduğunu savunuyor, çünkü payload genellikle aynı istekte seyahat ediyor.
Bulgu metni artık geliştiricileri yolu çözümlemeye (gönderi os.path.realpath artı bir önek denetimi öneriyor) ve yazmadan önce izin verilen temel dizin içinde kaldığını doğrulamaya yönlendiriyor. Doğrulama olarak yazar, mcp-atlassian hatası biçiminde bir fixture ekledi — /data/attachments/ artı çağıranın kontrolündeki bir dosya adına çağıranın verdiği baytları yazan bir fonksiyon. Bu, yamadan önce sıfır bulgu, yamadan sonra ise bir HIGH write-sink bulgusu üretti.
Bilinen sınırlamalar
Gönderi sınır durumlarda açık sözlü. open(path, 'r+') hem okuma hem yazmadır ve regex karmaşık mod dizgilerini ayrıştırmıyor. Yol artı '.tmp' şeklinde yazılan meşru atomik kaydetme pattern'leri artık işaretlenecek; yazar bunu doğru buluyor: hâlâ doğrulanmamış bir hedef. Tüm yazma eşleşmelerini HIGH'a yükseltmek triage birikimini büyütecek ki bu bilinçli bir tercih. Ve kural regex tabanlı olduğundan, kullanıldığı yerden farklı bir fonksiyonda oluşturulan yolu hâlâ yakalayamıyor — yazar bu sınırlamanın, kullanıcıların temiz bir taramaya aşırı güvenmemesi için dokümantasyona girmesi gerektiğini söylüyor.
Neden önemli
MCP sunucuları çalıştıran herkes için pratik nokta şu: yazma yolları path traversal'ın tehlikeli yarısıdır. 2026 CVE seti, saldırgan kontrollü hedeflerin pratikte neleri mümkün kıldığını gösteriyor: import sırasında kod yürütme için site-packages'a .pth enjeksiyonu ve kalıcı shell erişimi için authorized_keys veya cron üzerine yazma. Tek bir çağrıda dosya adı ve dosya içeriği kabul eden her MCP aracı, yazmadan önce hedefi çözümlemeli ve sınırlamalı.
Tarayıcı geliştiricileri için kapanış dersi, kuralları düzenli olarak güncel gerçek CVE listeleriyle yeniden test etmek. Kurallar sessizce bayatlar: hiçbir şey bozulmaz, sadece açıklanmaya devam eden zafiyetleri yakalamayı sessizce bırakırlar.
- #mcp
- #security
- #static-analysis
- #vulnerabilities
- #rce