CVE-2025-68664: Ne Oldu
2025'in sonlarında güvenlik araştırmacıları, LangChain'in serileştirme işlevlerinde — özellikle `dumps()` ve `dumpd()`'de — kritik bir güvenlik açığı olan CVE-2025-68664'ü açıkladı. CVSS puanı 9,3 (Kritik).
Güvenlik açığı şu şekilde işliyor: LangChain'in serileştirme yöntemleri, Python nesnelerini kapatma bağlamlarını yakalayarak serileştiriyor. Saldırgan, bir LangChain zincirindeki LLM yanıtını kontrol ettiğinde — alınan bir belgedeki prompt enjeksiyonu, kötü niyetli bir araç sonucu veya zehirlenmiş bir vektör deposu girişi yoluyla — `dumps()`'ın Python sürecinin erişebildiği ortam değişkenlerini serileştirmesine neden olan yanıtlar üretebilir.
Sonuç: API anahtarları, veritabanı bağlantı dizeleri, JWT sırları ve AWS kimlik bilgileri LangChain zincirinin ortamına gömülü olarak modelin çıktısı aracılığıyla sızdırılabilir. RAG hattınızın kaynak belgelerine metin enjekte edebilen saldırgan, belirli zincir yapılandırmalarında prodüksiyon sırlarınızı okuyabilir.
Etkilenen sürümler: LangChain < 0.3.22 (Python). Düzeltme 0.3.22'de yayınlandı, ancak benimseme yavaş kaldı — pypi indirme verileri Mart 2026'ya kadar savunmasız sürümlerin önemli ölçüde kullanıldığını gösteriyor.
RAG Hatlarında KKB Nasıl Sızıyor — Genel Sorun
CVE-2025-68664, daha geniş, daha sessiz bir sorunun çarpıcı bir örneğidir: KKB, RAG hatlarından rutin olarak sızıyor, CVE ve saldırgan gerektirmeyen mekanizmalar aracılığıyla.
Typik bir kurumsal RAG kurulumunu ele alalım:
- Alım: Şirket belgelerinizi — destek biletleri, müşteri e-postaları, hukuki sözleşmeler, İK kayıtları — bir vektör veritabanına (Pinecone, Weaviate, pgvector) indeksliyorsunuz.
- Alıntı: Bir kullanıcı soru sorduğunda, sistem semantik açıdan en benzer 5 belge parçasını alıyor.
- Üretim: Bu parçalar bir LLM'ye (GPT-4o, Claude, Gemini) bağlam olarak iletiliyor ve yanıt üretiliyor.
Sorun 2. adımda. Alınan parçalar, orijinal belgelerinde ne varsa onu içeriyor:
- Müşteri adları, e-posta adresleri, telefon numaraları
- Sözleşme değerleri, hesap numaraları, vergi tanımlayıcıları
- Çalışan maaş verileri, performans değerlendirme içeriği
- Klinik notlardaki hasta adları (sağlık RAG'ı için)
- Göç belgesi hatlarındaki ulusal kimlik numaraları
Bu KKB, bağlam penceresinde LLM'ye kelimesi kelimesine iletilir. Sorgu bunu tetiklerse modelin çıktısında görünür. LLM sağlayıcı tarafından günlüğe kaydedilir. LangChain konuşma geçmişinizde depolanır. Gözlemlenebilirlik platformunuza akar.
Bunların hiçbiri güvenlik açığı gerektirmiyor. Bu, bir RAG sisteminin amaçlanan davranışıdır — ve sistematik KKB maruziyeti yaratır.
68 Sır Deseni
RAG hatlarını izleyen güvenlik araçları, kurumsal belge depolarında sıklıkla görünen 68 bilinen sır desenini takip eder:
- AWS Erişim Anahtarı Kimlikleri (`AKIA...`)
- OpenAI API anahtarları (`sk-...`)
- Anthropic API anahtarları (`sk-ant-...`)
- Veritabanı bağlantı URI'leri (`postgresql://kullanıcı:parola@sunucu/db`)
- JWT token'ları (base64 kodlu başlıklar)
- GitHub Kişisel Erişim Token'ları
- Stripe gizli anahtarları (`sk_live_...`)
- SendGrid API anahtarları
- Twilio hesap SID'leri ve kimlik doğrulama token'ları
- Özel anahtar PEM blokları
Bu desenler, geliştiricilerin beklediğinden çok daha sık kurumsal belgelerde görünür. Bir destek bileti, hata ayıklarken müşterinin yapıştırdığı API anahtarını içerebilir. Bir sözleşme, teknik entegrasyon sırasında paylaşılan veritabanı kimlik bilgileri içerebilir. Yanlışlıkla indekslenen bir yapılandırma dosyası tüm sırlar deposunu açığa çıkarır.
Bu belgeler temizlenmeden bir vektör veritabanına indekslendiğinde, bunları alan her sorgu sırları LLM'ye iletir — ve potansiyel olarak sorguyu gönderen kullanıcıya.
Düzeltme: Gömme İşleminden Önce Anonimleştirin
KKB güvenli bir RAG hattı için doğru mimari, belgeler öbeklenmeden ve gömülmeden önce anonimleştirir. Bu, müşteri verilerini işleyen prodüksiyon sistemleri için isteğe bağlı değildir.
İşte anonym.legal API'sini kullanan bir Python uygulaması:
```python import requests import os
ANONYM_API_KEY = os.environ["ANONYM_API_KEY"] ANONYM_BASE_URL = "https://anonym.legal/api"
def anonymize_before_embedding(text: str) -> tuple[str, dict]: """ Gömme işleminden önce belge metnindeki KKB'yi anonimleştir. İsteğe bağlı anonimleştirme geri alımı için (anonymized_text, entity_map) döndürür. """ response = requests.post( f"{ANONYM_BASE_URL}/presidio/anonymize", json={ "text": text, "language": "en", "anonymizers": { "DEFAULT": {"type": "replace", "new_value": "[REDACTED]"}, "PERSON": {"type": "mask", "masking_char": "*", "chars_to_mask": 4, "from_end": False}, "EMAIL_ADDRESS": {"type": "replace", "new_value": "[EMAIL]"}, "PHONE_NUMBER": {"type": "replace", "new_value": "[PHONE]"}, "CRYPTO": {"type": "replace", "new_value": "[SECRET]"}, "URL": {"type": "keep"}, # URL'leri koru — alıntılar için gerekli } }, headers={"Authorization": f"Bearer {ANONYM_API_KEY}"} ) result = response.json() return result["text"], result.get("items", [])
def build_rag_index(documents: list[str], vectorstore): """ KKB gömme işleminden önce anonimleştirilmiş şekilde RAG indeksi oluştur. """ anonymized_docs = [] for doc in documents: clean_text, entities = anonymize_before_embedding(doc) anonymized_docs.append(clean_text) # İsteğe bağlı olarak denetim izi için varlık sayısını günlüğe kaydet print(f"Belgeden {len(entities)} KKB varlığı kaldırıldı")
# Şimdi temiz belgeler gömülüyor — vektör deposuna KKB ulaşmıyor
vectorstore.add_texts(anonymized_docs)
```
anonym.legal API'si 285'ten fazla varlık türünü destekler. Kurumsal belge hatları için bu, isimler, e-postalar, telefon numaraları, ulusal kimlik numaraları, finansal tanımlayıcılar, API anahtarları (CRYPTO varlık türü aracılığıyla), veritabanı URI'leri ve 270'ten fazla ek desenin herhangi bir belge vektör deponuza ulaşmadan önce tespit edilip ayıklandığı anlamına gelir.
CVE-2025-68664'ü Özellikle Düzeltme
LangChain < 0.3.22 çalıştırıyorsanız hemen güncelleyin:
```bash pip install "langchain>=0.3.22" "langchain-core>=0.3.22" ```
Yamalamadan sonra prompt enjeksiyonu riski için zincir yapılandırmalarınızı denetleyin:
- Alınan parçaları LLM'ye iletmeden önce doğrulayın — bilinen enjeksiyon desenlerini (`önceki talimatları yoksay`, `system:`, `<INST>`) eşleştiren içerikleri ayıklayın
- Alım hattınızda anonymize_before_embedding kullanın — enjeksiyon gerçekleşse bile, hassas veriler alınan parçalarda bulunmadığından saldırı yüzeyi azalır
- Zincir izinlerini kısıtlayın — LangChain zincirleri, ihtiyaç duydukları şeyin ötesinde ortam değişkenlerine erişememelidir. Minimum izinlere sahip özel bir hizmet hesabı kullanın.
CTA: Hattınızı Güvene Alın
Prodüksiyon RAG sistemleri oluşturan geliştiriciler için CVE-2025-68664 ve genel bağlam içi KKB riski kombinasyonu önemli bir sorumluluk oluşturuyor. Düzeltme mimariseldir: alımda değil sorgu zamanında anonimleştirin.
- anonym.legal API belgeleri — 285'ten fazla varlık türüyle belge anonimleştirme için REST API
- Geliştiriciler için kullanım senaryoları — LangChain, LlamaIndex ve özel RAG sistemleri için entegrasyon desenleri
CVSS puanı 9,3. Düzeltme belge başına bir API çağrısı. Matematik basit.
Kaynaklar:
- NVD CVE-2025-68664, CVSS 9,3, LangChain serileştirme güvenlik açığı
- LangChain güvenlik danışmanlığı, langchain-ai/langchain GitHub, 2025
- OWASP LLM İlk 10: LLM01 Prompt Enjeksiyonu, LLM06 Hassas Bilgi İfşası
- anonym.legal varlık türü belgeleri — 285'ten fazla desteklenen varlık türü