MemoDokümantasyon
TR

Güvenlik Modeli

Memo, yerel-öncelikli ve gizliliğe saygılı bir güvenlik mimarisi ile tasarlanmıştır.

API Anahtarı Şifreleme

Tüm sağlayıcı API anahtarları (OpenAI, Anthropic, Google vb.) bekleme durumunda AES-256-GCM ile şifrelenir. Anahtarlar, mümkün olduğunda işletim sistemi anahtar kasasında saklanan makineye özel bir sırdan türetilir; bunun mümkün olmadığı durumlarda kısıtlı izinlere sahip dosya tabanlı bir sırra başvurulur. Anahtarlar hiçbir zaman günlüğe kaydedilmez, dışa aktarılmaz veya düz metin olarak iletilmez.

Hız Sınırlama

API sunucusunda IP başına hız sınırlaması için token bucket algoritması uygulanır:

Uç Nokta Hız
/api/chat 30 istek / dakika
/api/embeddings 60 istek / dakika
Diğer tüm uç noktalar 120 istek / dakika

Patlama kapasitesi sürekli hızın 2 katıdır. API yanıtlarında hız sınırı başlıkları (X-RateLimit-*) bulunur.

Dosya Yükleme Güvenliği

  • MIME Algılama: Dosya türleri, uzantılara göre değil sihirli baytlar (magic bytes) ile doğrulanır. Yalnızca izin verilen listedeki türler kabul edilir.
  • İçe Aktarma Yol Doğrulama: İçe aktarılan dosya yolları, dizin gezinme saldırılarını önlemek için filepath.Clean ile temizlenir.
  • Boyut Sınırı: İstek gövdeleri 50 MB ile sınırlıdır. Daha büyük yükler 413 Request Entity Too Large yanıtı alır.

Dosya Sistemi Güvenliği

  • Yapılandırma dosyaları (config.yaml, memo.db) 0600 izinleriyle (yalnızca sahibin okuma/yazma) oluşturulur.
  • Veri dizini (~/.memo/) 0700 izinleriyle oluşturulur.
  • Geçici dosyalar os.CreateTemp kullanır ve süreç sonlandığında temizlenir.

Bulut Senkron Şifreleme

Senkron verileri uçtan uca şifrelidir:

  1. Kullanıcının parolasından Argon2id kullanılarak 256 bitlik bir anahtar türetilir.
  2. Her senkron girişi AES-256-GCM ve rastgele bir nonce ile ayrı ayrı şifrelenir.
  3. Sunucu yalnızca şifreli metin alır — kullanıcı verilerini okuyamaz.
  4. Parola hiçbir zaman sunucuya iletilmez; tüm şifreleme/çözme istemci tarafında gerçekleşir.

Ajan Kum Havuzu

Bir ajan araçları çalıştırdığında:

  • Dosya sistemi erişimi, belirlenen çalışma dizini ile sınırlıdır.
  • Kabuk komutları yapılandırılabilir bir zaman aşımı ile çalışır (varsayılan: 30 saniye).
  • Araçlardan gelen ağ erişimi, bir alan adı izin listesi ile kısıtlanmıştır.
  • Her ajan oturumunun, oturum sonunda temizlenen benzersiz bir kum havuzu dizini vardır.
  • v3.3.3 düzeltmesi: Tehlikeli-komut filtresindeki bir desen eşleştirme boşluğu, birkaç yıkıcı komutun (bir kök/ev dizinini silmek gibi) güvenlik kontrolünü atlatabilmesine yol açıyordu — kapatıldı. Her ajan eylemi yine de açık kullanıcı onayı gerektirir; bu, altındaki ek güvenlik ağını güçlendirir.
  • v3.3.3 düzeltmesi (sandbox kaçışı): Proje içinde henüz var olmayan bir hedefe işaret eden bir symlink, bir dosya-düzenleme aracının kum havuzu proje dizini dışına yazmasına izin verebiliyordu — kapatıldı.

Uzaktan Erişim Token'ı

Uzaktan erişim (LAN veya ngrok) açıldığında, her istek Ayarlar'da gösterilen erişim token'ını sunmak zorundadır (v3.3.3). Daha önce, o adrese ulaşabilen herkes (aynı Wi-Fi'daki biri, ya da ngrok linkine sahip biri) hiçbir kimlik doğrulaması olmadan sağlayıcı API anahtarlarını okuyabiliyor, veri silebiliyor veya makinede komut çalıştırabiliyordu. Mobil uygulama bu token'ı zaten gönderiyor; yalnızca yerel kullanım (uzaktan erişim kapalıyken, varsayılan durum) bundan etkilenmez.

Sağlayıcı Katmanı Düzeltmeleri

  • v3.3.3: Claude aktif sağlayıcıyken, model alanı boş bırakılan her normal sohbet mesajı yapılandırılmış modele düşmesi gereken fallback hiç uygulanmadığı için boş bir model alanıyla gönderilebiliyordu — düzeltildi ve regresyon testiyle kapsandı; Gemini ve diğer tüm sağlayıcıların etkilenmediği doğrulandı.
  • Bağımlılık güvenlik düzeltmeleri: govulncheck'in işaretlediği golang.org/x/text (WhatsApp entegrasyonunun profil fotoğrafı sorgusu üzerinden erişilebilen bir sonsuz döngü açığı) ve ilişkili golang.org/x/net bulguları, her iki bağımlılık güncellenerek yamalandı.

WhatsApp Entegrasyonu

WhatsApp köprüsü, aynı konuşmadan eş zamanlı mesaj işlemeyi önlemek için bir mutex kullanır; böylece oturum durumunda yarış koşulları engellenir. Mesajlar kuyruğa alınır ve sohbet başına sıralı olarak işlenir.