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 ve Self-Hosting Kimlik Doğrulaması (v3.5.5)

v3.3.3'ten itibaren, uzaktan erişim (LAN veya ngrok) bağlantısına karşı her istek Ayarlar'da gösterilen erişim token'ını sunmak zorundaydı — öncesinde, o adrese ulaşabilen herkes hiçbir kimlik doğrulaması olmadan sağlayıcı API anahtarlarını okuyabiliyor, veri silebiliyor veya ajan komutları çalıştırabiliyordu. v3.5.5 itibarıyla, o tek-paylaşılan-token şeması, bir Pi/ev sunucusu/VPS/Docker üzerinde self-hosting için inşa edilmiş ama masaüstünde LAN/ngrok/Tailscale Uzaktan Erişim için de aynı şekilde geçerli olan tam bir kimlik doğrulama sistemiyle değiştirildi.

Dört Auth Modu

Ayarlar'dan veya memo remote set-mode ile seçilebilir:

Mod Gereken kimlik
none Yok — sadece tamamen güvenilir bir özel ağda uygun
token (loopback dışına bağlandığında varsayılan) Cihaz-bazlı bir token, X-Memo-Token header'ı veya Authorization: Bearer
password Kullanıcı adı + argon2id-hash'li şifre, imzalı bir oturum verir
token_password Geçerli bir token ya da geçerli bir şifre, ikisi de çalışır

Loopback Muafiyeti

Gerçek kaynak IP'si loopback olan bir istek (127.0.0.0/8, ::1) her modda, kimliksiz güveniliyor — bu, isteğin gerçek kaynağına dayanıyor, istemcinin hangi URL'yle konuştuğunu sandığına değil, yani sadece aynı makinede çalışan yazılımı kapsıyor (kurulu masaüstü uygulamasının 127.0.0.1'le konuşması gibi). Aynı fiziksel kutudan bile olsa, LAN IP'sinden gelen bir istek yine normal şekilde kapıdan geçer.

Şifreler, Oturumlar ve Cihazlar

  • Şifreler argon2id ile hash'lenir; giriş denemeleri brute-force kilitlemesiyle sınırlıdır.
  • Oturumlar kısa ömürlü imzalı token'lardır — varsayılan 12 saat, "beni hatırla" ile 30 gün.
  • Cihaz-bazlı token'lar diskte hash'lidir, sadece oluşturulduğunda bir kez gösterilir, ve başka hiçbir cihazı etkilemeden tek tek iptal edilebilir (memo remote revoke-device <id>). memo remote rotate-token <id>, hemen çalışmaz hale gelmesi gereken sızmış bir token için, bir token'ı iptal edip aynı cihaz adıyla tek adımda yeniden verir.
  • --password/--key asla düz CLI argümanı olarak gerekmez (ps ile görünür, shell history'de kalır) — boş bırak, ihtiyacı olan her CLI komutu terminalden gizli olarak interaktif sorar.

Çoklu Hesap

Self-hosted Memo, Ayarlar → Hesaplar'dan yönetilen admin/kullanıcı rolleriyle çoklu hesabı destekler. Uygulamadaki her ekran — sohbet, Ayarlar, Geliştirici Seçenekleri — her ekranın auth durumunu bağımsız takip etmesi yerine aynı ilk-kurulum kapısından ve giriş kapısından geçer.

CORS Düzeltmesi

Uzaktan erişim kapısındaki bir CORS origin-doğrulama açığı (CWE-346), tüm auth yüzeyi üzerinde yapılan düşmanca bir taramada bulunup v3.5.5'te kapatıldı.

Geliştirici API Ağ Geçidi, kendi "API Anahtarı Gerektir" anahtarı etkinken bu aynı auth sistemini paylaşır. Henüz açıkça kapsanmayanlar için (gömülü TLS, bağımsız bir düşmanca sızma testi) bkz. Self-Hosting → Bilinen Sınırlamalar.

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.