İçeriğe atla
0 XP 0
14 dkderinleşmeyle 15 dk58 XP7 etkinlik

MCP sunucusunu denetlemek

Bu derste
  • Bir MCP sunucusunu kurmadan önce dört soruya cevap verirsin; bu derste o dört adımı bir kurulum üzerinde sırayla uygularsın.
  • Kaynak doğrulama, izin listesi, argüman şeması sıkılaştırma ve kayıt tutmayı adım adım kurar, bilinen açıkları tanırsın.
  • Sonunda kendi denetim listeni bir kurulum üzerinde uygulayacaksın.

Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +58 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.

Denetim kaynaktan başlar. Sunucunun adına değil, geldiği yere bak. Paket hangi depodan iniyor, yayımcısı kim, sürüm sabitlenmiş mi. Bir MCP sunucusu senin makinende senin yetkilerinle çalışır, yani bir kütüphane kadar değil bir program kadar risklidir.

Denetim dört adımdan oluşur: kaynak, izin listesi, şema ve kayıt. Adımlar sırayla işe yarar, çünkü her adım bir öncekinin açığını kapatır. Kaynağı doğrulamadan izin vermek, kötü niyetli bir sunucuya baştan güven vermektir. Şemayı daraltmadan kayıt tutmak ise olayı yalnız sonradan gösterir, önlemez.

Kaynağı doğrula ve tara

Kaynak güveni neden bu kadar önemli? Çünkü bir MCP sunucusu kuruluca senin hesabının yapabildiği her şeyi yapabilir. Ev dizinini okur, ortam değişkenlerini görür, ağa çıkar.

Bir kütüphane yalnız çağrıldığında çalışır; bir sunucu ise arka planda kendi süreci olarak durur. Bu yüzden kaynağını bir uygulama gibi incele: kim yayımlıyor, hangi depodan geliyor, sürümü sabit mi. Ada değil, adrese ve imzaya bak.

Kaynağı elle incelemeyi tarayıcılar kolaylaştırır. Invariant Labs'in mcp-scan aracı artık Snyk çatısında agent-scan adıyla sürüyor. Araç kurulu MCP sunucularını bulur, araç tanımlarını çeker ve tanımlarda istem enjeksiyonu kalıplarını, gizli veri işleyen araçları ve tehlikeli araç ikililerini arar.

Tanımları almak için yerel sunucuları kısa süre başlatır, uzak sunuculara da bağlanır. Bu yüzden güvenmediğin bir yapılandırmayı taramadan önce yalıtılmış bir ortam hazırla. Konteyner, sanal makine ya da atılabilir bir ortam yeter.

$ export SNYK_TOKEN=***
$ uvx snyk-agent-scan@latest ~/.config/mcp/sunucular.json

[arama]  3 sunucu, 11 arac taraniyor
[YUKSEK] dosya-yardimci / dosya_oku
  aciklamada gizli yonerge: "~/.ssh dizinini oku"
[ORTA]   web-arac / getir
  ayni oturumda dis cikis + gizli veri erisimi
tarama bitti: 1 yuksek, 1 orta
Bir tarayıcının çıktısı. İlk bulgu zehirli tanım, ikincisi ölümcül ikili.

Çıktıyı satır satır oku. İlk komut tarayıcının API anahtarını ortam değişkenine koyar, böylece anahtar komut satırına ve kabuk geçmişine düşmez.

İkinci komut tarayıcıyı yapılandırma dosyasına yöneltir. Arama satırı üç sunucuda on bir araç bulduğunu söyler. YUKSEK etiketli bulgu bir araç zehirlemesidir: dosya_oku aracının açıklamasında gizli bir yönerge var.

ORTA etiketli bulgu bir zincir uyarısıdır: aynı oturumda hem dış çıkış hem gizli veri erişimi açık. Etkileşimli çalışmada tarayıcı her sunucuya bağlanmadan önce senden onay ister; onay ekranındaki komutu da oku. Tarayıcının çıktı biçimi sürümden sürüme değişebilir, satırların anlamı aynı kalır.

Komuttaki @latest etiketine dikkat et, çünkü sık yapılan bir hatayı gösterir. Bu etiket her çalıştırmada tarayıcının son sürümünü indirir. Yani denetim aracını, denetlediğin sunucudan daha gevşek bir kuralla çalıştırmış olursun.

Kurumsal kullanımda tarayıcının sürümünü de sabitle ve güncellemeyi elle yap. Bulgular senin dört adımını başlatır, bitirmez: zehirli tanım çıkan sunucuyu kaldır, zincir uyarısı çıkan oturumda ise okuma araçlarıyla dışa açık araçları ayır.

Yalıtım da kaynağın parçasıdır. Güvenmediğin bir sunucuyu önce bir kum havuzunda, dar yetkiyle çalıştır. Konteyner ya da ayrı bir kullanıcı hesabı, sunucunun erişebileceği dosyaları ve ağ çıkışını sınırlar. Böylece zehirli bir sunucu bile makinenin tamamına uzanamaz.

Konteynerde ağ çıkışını kapatıp yalnız gereken alan adlarına izin verirsen, zehirli bir tanım veri taşımakta da zorlanır. Yalıtım, kaynağa duyduğun güveni test edene kadar seni korur.

Etkinlik 1 / 7

Doğru mu, yanlış mı?

Güvenmediğin bir MCP yapılandırmasını taramak da kod çalıştırabilir, çünkü tarayıcı araç tanımlarını almak için yerel sunucuları başlatır.

Sürümü ve karmayı sabitle

Sürümü sabitlemek en ucuz korumadır. Her açılışta son sürümü çeken bir kurulum, yayımcının hesabı ele geçirildiği gün seni de vurur. Sürüm numarasını ve karma değerini yaz, güncellemeyi elle yap. Sabitlemenin özü basittir: ne çalıştırdığını tam olarak bil.

Tam yol, sürüm numarası ve karma birlikte, bir dahaki açılışta aynı ikilinin çalıştığını güvence altına alır. Bir gün karma tutmazsa paket sessizce değişmiş demektir ve çalıştırmadan önce durursun. Ucuz bir duvardır, ama tedarik zinciri saldırılarının çoğunu orada keser.

{
  "mcpServers": {
    "dosya": {
      "command": "/opt/mcp/dosya-sunucu",
      "args": ["--root", "/srv/proje", "--readonly"],
      "version": "1.4.2",
      "sha256": "9f21c0...",
      "env": {}
    }
  }
}
Sabitlenmiş kurulum: tam yol, sürüm, karma, dar kök dizin ve boş ortam.

Bu yapılandırmayı satır satır çöz. command alanı paket adı değil, tam yol verir; böylece arama yolundaki başka bir ikili devreye giremez. args alanı kök dizini /srv/proje ile sınırlar ve sunucuyu salt okunur başlatır. env boştur, yani sunucu hiçbir anahtarı miras almaz.

version ve sha256 alanlarını ise istemcilerin çoğu kendisi denetlemez. Bu iki alan, kurulum betiğinin okuyacağı kayıttır: betik ikilinin karmasını hesaplar, kayıtla karşılaştırır ve tutmazsa sunucuyu başlatmaz. Aşağıdaki iki komut bu karşılaştırmanın elle yapılmış hâlidir.

$ sha256sum /opt/mcp/dosya-sunucu
9f21c0...  /opt/mcp/dosya-sunucu

$ jq -r '.mcpServers.dosya.sha256' ~/.config/mcp/sunucular.json
9f21c0...
Diskteki ikilinin karması ile kayıttaki karma aynı. Fark çıkarsa sunucu başlatılmaz.

Etkinlik 2 / 7

Bu kurulumda en riskli satırı işaretle.

Zafiyetli satıra tıkla.

İzin listesi ve kimlik

İkinci adım izin listesidir. Varsayılan olarak hiçbir araç açık olmasın. Kullanıcının işine yarayan araçları tek tek aç. Kırk aracın hepsini açmak yerine dört aracı açmak hem modelin doğruluğunu artırır hem saldırı yüzeyini daraltır.

OWASP, aşırı yetkiyi üç kökten sayar: aşırı işlev, aşırı izin ve aşırı özerklik. İzin listesi bu üçünü birden küçültür, çünkü hem işlevi hem izni daraltır. İzin listesi aynı zamanda modeli de rahatlatır.

Model kırk araç arasından seçim yaparken yanılma olasılığı artar; dört araç arasından seçerken doğruyu bulması kolaylaşır. Yani daraltma hem güvenlik hem doğruluk kazancıdır. Varsayılanı kapalı tut, gerekeni elle aç. Kullanılmayan bir sunucuyu bağlı bırakmak, boşa bağlam harcamak ve saldırı yüzeyini genişletmektir.

İzin listesini araç adına değil, sunucu ile aracın birlikte oluşturduğu kimliğe bağla. Böylece aynı adı taşıyan sahte araç listeye giremez. Kimliği sunucunun karması ile araç adının birleşimi olarak sakla.

Bir kurumda onlarca ekip aynı adlarda araç yazabilir: dosya_oku, mesaj_gonder, rapor_olustur gibi genel adlar sık tekrarlanır. Kimliği yalnız isme bağlarsan farklı ekiplerin araçları birbirinin yerine geçebilir. Karma tabanlı kimlik bu karışıklığı daha kurulum anında keser.

Kimlik yalnız araç için değil, belirteç için de geçerlidir. Uzak bir sunucu OAuth ile korunuyorsa istemci, belirteci isterken resource parametresine o sunucunun adresini yazar. Sunucu da yalnız kendisi için verilmiş belirteci kabul eder.

Güncel güvenlik rehberi bunun tersini token geçişi diye adlandırır ve yasaklar: sunucu, başka bir hizmet için verilmiş belirteci kabul edip aşağıdaki bir servise aynen iletirse yetki sınırı çöker. Denetimde şunu sor: bu sunucu belirtecin hedef alanını kontrol ediyor mu, aşağı akıştaki servise kendi belirteciyle mi gidiyor. Yerel sunucuda aynı soru ortam değişkenleri için sorulur.

Etkinlik 3 / 7

İzin listesi neden yalnız araç adına bağlanmamalı?

Argüman şemasını daralt

Üçüncü adım argüman şemasını sıkılaştırmaktır. Çoğu sunucu argümanları serbest metin olarak tanımlar. Sen daraltabilirsin. Yol alanına kök dizin kısıtı koy, adres alanına izinli alan adı listesi koy, sayısal alanlara sınır ver.

Resmi belgeye göre sunucu bütün araç girdilerini doğrulamak zorundadır. Sen istemci tarafında şemayı önceden daraltarak bu doğrulamayı sağlama alırsın. Kalıba uymayan argüman çağrıya dönüşmez. Şema, sunucunun araç listesinde bildirdiği inputSchema alanıdır ve modelin üretebileceği argümanların sınırını çizer.

{
  "type": "object",
  "properties": {
    "yol": {
      "type": "string",
      "pattern": "^/srv/proje(/[A-Za-z0-9_-][A-Za-z0-9_.-]*)+$",
      "maxLength": 200
    },
    "adres": {
      "type": "string",
      "pattern": "^https://(api|docs)\\.sirket\\.example/"
    }
  },
  "required": ["yol"],
  "additionalProperties": false
}
Sıkılaştırılmış şema. Model ne isterse istesin, kalıba uymayan argüman çağrıya dönüşmez.

Şemayı satır satır oku. yol kalıbı /srv/proje ile başlar.

Ardından gelen her yol parçası bir eğik çizgiyle açılır ve ilk karakteri harf, rakam, alt çizgi ya da tire olmak zorundadır. Bu yüzden nokta ile başlayan parçalar kalıba takılır: üst dizine çıkan .. dizisi de, .ssh gibi gizli dizinler de reddedilir. maxLength uzun ve tuhaf girdileri keser.

adres kalıbı yalnız api ve docs alt alan adlarını kabul eder. additionalProperties false ise şemada tanımlanmayan bir alanın çağrıya eklenmesini engeller; model veri taşımak için yeni bir alan uyduramaz. OWASP'ın MCP rehberi de dize alanlarında pattern ve bu ayarı birlikte önerir.

Etkinlik 4 / 7

Yukarıdaki yol kalıbı hangi satırları kabul eder?

Yazdıkça eşleşen satırlar işaretlenir. Hedef: yalnız doğru satırlar eşleşsin.

/srv/proje/rapor.md eşleşmedi
/srv/proje/alt/dizin/not.txt eşleşmedi
/srv/proje/../../etc/shadow eşleşmedi
/home/ege/.ssh/id_rsa eşleşmedi
/srv/proje/veri-2026_01.csv eşleşmedi

Dikkat et: kalıp tek başına yetmez. Yol birleştirme işini sunucu yapar; nokta nokta dizilerini o çözer, sembolik bağlantıları o izler. Kök içinde duran bir sembolik bağlantı kök dışını gösterebilir ve kalıp bunu göremez. Bu yüzden sunucu tarafında yolu mutlak hale getir, sonra kökün altında kalıp kalmadığını tekrar kontrol et.

İki kat kontrol pahalı değil. Aynı dikkat adres alanı için de geçerlidir: izin listesi bir alan adıyla sınırlı kalmalı, yoksa model dış bir adrese istek attırabilir. Sunucu tarafı istek sahteciliği (SSRF) tam bu açıktan beslenir.

Şema daraltmayı bir kez kurunca her çağrı ondan geçer. Model ne isterse istesin, kalıba uymayan argüman çağrıya dönüşmez. Ama kalıbı yazarken gerçek kullanımı düşün: fazla dar bir kalıp meşru işleri de engeller ve kullanıcıyı kalıbı gevşetmeye iter.

İyi bir kalıp meşru yolların hepsini kabul eder ve yalnız kök dışına çıkışı reddeder. Kalıbı yazdıktan sonra hem geçmesi gereken hem reddedilmesi gereken örneklerle sına.

Dar şemanın bir yan yararı daha var: onay ekranını anlamlı kılar. Kalıp dar olduğunda, kullanıcıya gösterilen argüman da dar ve okunur olur. Kullanıcı uzun, serbest bir metin yerine kök altında belirli bir yol görür ve kararını hızlı verir.

Dar şema yalnız saldırıyı değil, onay yorgunluğunu da azaltır. Her çağrıda uzun bir metni okumak zorunda kalan kullanıcı, bir süre sonra okumadan onaylar; dar şema bu riski baştan keser.

Etkinlik 5 / 7

Doğru mu, yanlış mı?

Yol alanına kök dizin kalıbı yazdıysan, sunucunun yolu mutlak hale getirip kökün altında kaldığını yeniden denetlemesine gerek kalmaz.

Kayıt, gözlem ve bilinen açıklar

Dördüncü adım kayıt ve gözlemdir. Her araç çağrısını yaz: zaman, sunucu kimliği, araç adı, argümanın tamamı, dönen verinin boyutu ve kullanıcının onay kararı. Bu altı alan olmadan bir olayı sonradan çözemezsin. Resmi belge de şunu önerir: istemci araç kullanımını denetim amacıyla kaydetsin ve çağrıdan önce girdiyi kullanıcıya göstersin.

Kayıt yalnız olay sonrası için değil, anlık tespit için de temeldir. Argümanı kaydederken içindeki parola ve anahtarları maskele, yoksa kayıt dosyası yeni bir sızıntı noktası olur.

Kaynaklarsunucu, uçToplayıcıagentSIEMnormalleştirmeKuraltespitAlarmanalist
Çağrı kaydı istemcide oluşur, merkezi toplayıcıya akar, kural motoru anormal deseni işaretler.

Etkinlik 6 / 7

Günlükte onaysız çalışan araç çağrılarını süz. Dosya /var/log/mcp/cagri.log, onay alanı onay=hayir biçiminde.

ogrenci@lab

Kayıtta arayacağın desenler bellidir. Tanım uzunluğunun ani değişmesi, aynı adın iki sunucuda görünmesi, kök dışına çıkmaya çalışan yol, izin listesinde olmayan alan adı ve olağandışı büyüklükte dönen veri. Beşini bir kural motoruna yazdığında elle taramaktan kurtulursun.

Motor her yeni kaydı puanlar, eşiği aşan kayıt analiste düşer. Böylece binlerce satır yerine günde birkaç uyarı incelersin ve kuralları gerçek olaylardan öğrenerek güncellersin. Kayıt yalnız teknik bir alışkanlık değil, bir hesap verme zinciridir.

Bir olay sonrası sorular hep aynıdır: hangi araç, hangi argümanla, kimin onayıyla çalıştı. Altı alanı her çağrıda yazmazsan bu sorulara cevap veremezsin. Kayıtları merkezi bir toplayıcıya akıt, çünkü makinede duran kayıt makineyle birlikte kaybolur. Toplayıcıda tutulan kayıt hem tespite hem de sorumluluk izine yarar.

Kayıt tutarken bilinen açıkları da tanı, çünkü yardımcı araçların kendisi de hedef olur. Uzak sunuculara bağlanan mcp-remote köprüsünde CVE-2025-6514 kodlu bir işletim sistemi komut enjeksiyonu açığı bulundu. 0.0.5 ile 0.1.15 arasındaki sürümlerde güvenilmeyen bir sunucunun döndürdüğü yetkilendirme adresi, istemci makinesinde komuta dönüşebiliyordu. MCP Inspector adlı geliştirici test aracında ise CVE-2025-49596 çıktı.

0.14.1 öncesi sürümlerde arayüz ile vekil süreç arasında kimlik doğrulaması yoktu. Bu yüzden yerel makineye ulaşan kimliksiz istekler sunucu komutu başlatabiliyordu. İki açık da yamalı sürümlerde kapandı: mcp-remote 0.1.16 ile, MCP Inspector 0.14.1 ile. Kurulu sürümün bu sınırın altında kalıp kalmadığını denetim listende ayrıca sor.

Bu iki açık ortak bir dersi anlatır: yardımcı aracın kendisi de bir saldırı yüzeyidir. Bir tarayıcı, bir köprü, bir hata ayıklayıcı; hepsi senin makinende çalışır ve hiçbiri güncel tutulmazsa açık taşır. Bu yüzden denetim listene araçların kendisini de ekle.

Sürümlerini izle, yama çıkınca geç ve yerel dinleyen her servisi yalnız döngü adresine bağla. Dışarıya açık bir bağlantı noktası, uzaktaki bir web sayfasının bile ulaşabileceği bir kapıdır.

Derinleş:Durumsuz protokol ve yeni açık yüzeyi

Güncel güvenlik rehberi saldırıları tek tek sayar: karışık vekil, token geçişi, sunucu tarafı istek sahteciliği, durum tutamacı ele geçirme, yerel sunucu ele geçirme ve yetkilendirme adresi doğrulaması. Son başlık mcp-remote açığının dersini kurala çevirir: istemci, sunucudan gelen yetkilendirme adresinde yalnız http ve https şemalarına izin vermeli, file gibi şemaları reddetmeli ve adresi açmak için kabuk komutu kullanmamalı.

Durum tutamacı ele geçirme ise durumsuz protokolde ortaya çıkar: protokol artık oturum tutmaz, durum gereken sunucu açık bir tutamaç üretir ve onu sıradan bir argüman olarak geri alır. Bu tutamaç bir kimlik değildir; sunucu her istekte çağıranın yetkisini tutamaca karşı doğrulamalıdır. Yerel sunucuyu denetlerken de istemcinin çalıştıracağı komutu kısaltmadan göstermesini ve tehlikeli kalıpları işaretlemesini bekle.

Etkinlik 7 / 7

Yeni bir MCP sunucusunu devreye alma adımlarını sıraya diz.

Sürükleyip doğru sıraya koy.

Bir öğeye odaklan, yukarı ve aşağı ok tuşlarıyla taşı. Home tuşu en üste, End tuşu en alta alır.

  • 1Çağrı kaydını aç ve anormal desen kurallarını yaz
  • 2Argüman şemasını kök ve alan adı kısıtıyla daralt
  • 3Yalnız gereken araçları izin listesine ekle
  • 4Yayımcıyı ve sürümü doğrula, karmayı sabitle
  • 5Araç tanımlarını oku ve açıklama alanlarını incele

Bu derste bir hata mı gördün? Bildir