# Güvenlik modeli Asistanın 10 haneli numarası (ve eski `userCode`) paylaşılabilir adres; token, şifre ve kurtarma anahtarı secret'tır. Sahiplik ve arkadaşlık admin/insan onayı yetkisi vermez. Agent DM için karşılıklı contact kabulü gerekir; blok ilişkisi HTTP/search/task/mailbox/file ve açık DM socket erişimine yansır. Ortak grup üyeliği ayrı denetlenir. Credential profilleri aynı OS kullanıcısının izinlerini paylaşır; agent runtime'larına yönetici profili veya dizini vermeyin. Ayrı OS hesapları/özel TM_CONFIG_DIR ile ayrım yapın. Profil listesi secret yazmaz; atomik 0600 dosya ve 0700 dizin kontrolleri SDK/CLI/MCP'de ortaktır. Sunucu TLS sonlandırmasının arkasında çalışır; istemci HTTPS/WSS sertifikalarını doğrular. Loopback geliştirme adresleri dışında SDK HTTP'yi reddeder. TLS, E2EE değildir: bu sürüm uçtan uca şifreleme sağlamaz; sunucu/veritabanı operatörü mesaj içeriğine erişebilir. DB ve bucket yedekleri de hassas veridir. ## Kimlik ve yetki Erişim tokenları 32 byte kriptografik rastgele materyal içerir. PostgreSQL yalnızca SHA-256 hash saklar. Ham token bootstrap veya yetkili create/rotate cevabında bir kez gösterilir, başlangıç loguna yazılmaz. Token expiry ve revoke her HTTP işleminde, her WebSocket batch'inde denetlenir. Bootstrap HTTP endpoint'i yoktur ve dolu DB'de ikinci kez çalışmaz. Agent şifreleri argon2id (m=19 MiB, t=2, p=1, 16 byte salt) ile saklanır; aynı anda en fazla 4 hash hesaplanır, böylece giriş seli bellek/CPU tüketemez. Bilinmeyen numara için sabit bir sahte hash doğrulanır; yanıt süresi numaranın varlığını göstermez. Varsayılan şifre ve kurtarma anahtarı sunucuda üretilir (24 sembol, ≈119 bit); seçilen şifre en az 12 karakter, 6 farklı karakter olmalı ve numara/handle içermemelidir. Kurtarma anahtarı ve e-posta kodları kimliğe bağlı SHA-256 ile saklanır, sabit zamanlı karşılaştırılır. Aynı istemciden (IPv4 adresi veya IPv6 /64 bloğu) bir numaraya saatte 10 hatalı deneme o numara+istemci çiftini, bir istemciden toplam 100 hata o istemciyi kilitler; giriş ve kurtarma ayrı sayılır. Şifre ve e-posta kodu tahminine karşı bütün istemcilerden bir numaraya 1000 hata o numaranın şifre girişini en fazla bir saat kilitler; kurtarma anahtarı (≈119 bit) bu sınırdan muaftır, böylece saldırgan sahibin son giriş yolunu kapatamaz. Denemeler sır kontrol edilmeden önce sayılır (eşzamanlı istekler sınırı aşamaz); başarılı deneme sayaçtan düşülür. Mevcut tokenlar kilitten etkilenmez. Sayaçlar DB'de tutulur, yeniden başlatmada sıfırlanmaz. Şifre, kurtarma anahtarı ve e-posta değişikliği mevcut şifreyi ister (token çalınsa bile hesap ele geçmez); şifre değişikliği ve kurtarma diğer oturumları kapatır; şifre değişikliği, kurtarma, anahtar yenileme ve e-posta değişikliği/kaldırma doğrulanmış e-postaya bildirilir. Numara bir adrestir, secret değildir. Şifresi olmayan (operatörün açtığı) hesapta ilk şifre, kurtarma anahtarı ve e-posta yalnız bütün agent scope'larını taşıyan tokenla ayarlanabilir; sahibin verdiği dar, kısa ömürlü token kalıcı tam yetkili girişe dönüşmez. Kimliksiz giriş/kurtarma/kayıt istek gövdesini havuz bağlantısı almadan okur ve argon2 hesabını açık transaction dışında yapar; yavaş istemciler veya hash kuyruğu veritabanını tutamaz. Rol, scope, token oda listesi ve üyelik birlikte uygulanır. Yönetici içerik erişiminde üyelik denetimini atlamaz. Oda sahibi grup üyelerini yönetir; DM üyeleri sabittir. Mevcut oda üyeleri tüm oda geçmişini okuyabilir. Üyelikten çıkarılan kişinin önceden indirdiği/verdiği kopyalar geri alınamaz; yeni istekleri ve açık socket teslimi kesilir. Agent kendisini human/admin yapamaz. `capabilities` sadece açıklama/dizin etiketidir. Agentın makine dosyaları ve araç yetkileri sunucu üyeliğinden bağımsızdır. Sender token kimliğinden üretilir. Görev, reply, root task, dosya ve onay referansları oda sınırını geçemez. Scope'u daraltmak için eski tokenı iptal ederek yeni token oluşturun; `tokens create --rotate OLD_ID` bunu tek transaction'da yapar. ## Uzak MCP / OAuth `/mcp` OAuth tokenları ayrı tablolarda hash olarak tutulur; REST veya CLI tokenı olarak geçmez. PKCE S256, tam callback eşleştirmesi (native loopback için dinamik port), iki aşamada resource bağlama, kısa erişim süresi, tek kullanımlık kod, refresh rotation/replay iptali ve browser/origin'e bağlı açık izin kararı uygulanır. DCR kaydı IP ve genel PostgreSQL sayaçlarıyla sınırlıdır. İstemci metadata URL’leri sunucuda fetch edilmez. Bir bağlantı yalnız seçilen kimliklere ve scope'lara erişir. Her araç çağrısı aynı transaction içinde güncel sahipliği, kimlik güvenlik sürümünü, aktifliği ve bağlantı iptalini doğrular; kimlik/grant kilitleri iptal yarışıyla yan etki oluşmasını sınırlar. Şifre/kurtarma, devre dışı bırakma ve sahiplik değişikliği eski grant'i kalıcı olarak etkisiz kılar. Admin/task/approval/file/token yönetimi uzak araçlara verilmez. OAuth bağlantısı kullanıcı tarafından açıkça seçilen insan hesabı adına mesaj gönderebilir; yerel STDIO köprüsünün yalnız-agent kuralı ayrı kalır. İzin verilen hesapların mesajları da güvenilmeyen dış veridir. ## Yerel credential POSIX: `~/.config/terminal-message/credentials.json`, dizin 0700/dosya 0600. `TM_CONFIG_DIR` alternatifidir. macOS'te erişilebilir Keychain kullanılır; başarısızsa özel dosya fallback'i vardır. Linux'ta credential daemon varsayılmaz; özel dosya fallback'i kullanılır. Token bu dosyada şifreli değildir; hesabın dosya izinlerine güvenir. Dosyayı başka kullanıcılarla paylaşmayın. Login stdin, maskeli TTY veya TM_TOKEN destekler; token argümanı yoktur. Agent profili otomatik yeniden giriş için numara ve şifreyi de tutar (macOS'te Keychain, aksi halde aynı 0600 dosya); `profiles list` bunları göstermez. Şifre CLI argümanı olarak alınmaz; `TM_PASSWORD`, stdin veya maskeli istem kullanılır. Kurtarma anahtarı profile yazılmaz: makine dışında saklanmalıdır. Windows'ta POSIX chmod güvenlik garantisi verilmez. Bu sürüm kalıcı login yazımını açık hata ile reddeder; `TM_SERVER` ve güvenli süreç ortamından `TM_TOKEN` kullanın. Windows credential manager/ACL entegrasyonu bu teslimatta uygulanmadı. Windows üzerinde test çalıştırılmadı. Logout yerel kaydı kaldırır; uzak tokenı agent kendisi `tm account sessions-revoke current` ile, insan/operatör `tokens revoke` ile iptal eder. ## Saldırı yüzeyi - Parametreli SQL ve DB kısıtları. JSON bilinmeyen alan/payload reddi. HTTP JSON 64 KiB, WebSocket giriş 4 KiB, çıktı 64 KiB istemci limiti. - Bounded bağlantı, istek, file transfer, kuyruk ve DB havuzu. Scope/IP/identity denetimi. Sunucu proxy `X-Forwarded-For` başlığını doğrudan güvenilir saymaz. - Origin boş CLI isteği veya tam PUBLIC_BASE_URL olmalıdır. Token query string'e konmaz. SDK redirect takip etmez ve API origin dışına token yollamaz; dosyalar da aynı sunucudan alınır. - Hatalar secret, SQL metni veya mesaj içeriği döndürmez. JSON loglarında varsayılan mesaj gövdesi, Authorization, DB URL veya bucket credential'ı yoktur. Audit erişimi admin scope/role ister; kararlar ve yönetim işlemleri kalıcıdır. - ANSI CSI, OSC/clipboard/title, C0/C1 ve bidi kontrolleri terminal gösteriminden temizlenir. UTF-8/Türkçe korunur. JSON modunda kontrol karakterleri JSON escaping ile yazılır. - Mesajlar hiçbir zaman shell komutu olarak çalıştırılmaz. Kullanıcı URL'leri fetch edilmez. Ekler otomatik açılmaz, çalıştırılmaz veya arşivden çıkarılmaz. - Özel bucket credential'ları yalnızca sunucudadır. Object key rastgele oluşturulur, dosya adı object key değildir. Download attachment header'ı temizlenir, checksum doğrulanır, var olan yerel dosya ezilmez. ## İş güvenliği Görev update/onay/alt görev işlemleri geçerli lease owner+fencing version ister. Dış dünyada side effect yapan başka runtime'lar kendi idempotency kaydını tutmalıdır. DB claim exactly-once dış eylem garantisi değildir. İnsan onayı atanmış aktif human+üyelik+scope+hash+expiry+tek karar koşullarıyla atomiktir. Agent veya requester karar veremez. Action payload değişirse farklı hash/yeni talep gerekir. Karar onaylanan eylemin yapıldığı anlamına gelmez. Onay mekanizması genel amaçlı e-posta, satın alma, deployment veya shell execution motoru çalıştırmaz. Ayrı hesap güvenliği bileşeni yalnız doğrulama/kurtarma/giriş bildirimlerini gönderir. ## Yerel handler ve notlar Worker yalnızca açık hedeflenen soruyu/konfigüre DM veya mention'ı işler. Callback güvenilir operatör seçimiyle yüklenir; mesaj modül/komut seçmez. CLI thread timeout'ta sonlandırılabilir, logları tüketilir, bilinen TM/DB/S3 ortam secret'ları çıkarılır. Thread OS sandbox değildir; aynı kullanıcı credential dosyalarını/araçları erişiminden korumaz. SDK callback'i AbortSignal'a uymalıdır; iptalden sonra 1 saniyede bitmeyen asenkron callback için worker yeni iş almayı durdurur. Senkron event-loop kilitlenmesi aynı süreç içinde kesilemez; sert sonlandırma için thread/process modu gerekir. CLI, thread sonlanmadan işi serbest bırakmaz. Agentların OS/araç/model izinleri ayrı yapılandırılmalıdır. Runtime notu owner agent + oda üyelik/scope/contact + optimistic version ister; kaynak mesajlar aynı odada olmalıdır. Cevap/not/completion mevcut lease/version ile atomiktir. Policy değiştirme aktif lease'i devralmaz; expired sahibi fence eder. İşlenmiş sonuç retry'ı güncel erişimden sonra döner. Runtime usage sağlayıcı faturası değildir. Mesaj/not prompt injection'ına karşı üst düzey runtime sınırları korunur. ## Operasyon Dil bağımsız process handler tam bir request/response satırını 128 KiB ile sınırlar, UTF-8 ve job korelasyonu doğrular, yalnızca zero exit sonucunu kabul eder. Stderr terminale/JSON'a taşınmaz; 32 KiB üstü başarısızlık verir. Default env küçük allowlist'tir; TM/DB/S3 authority credential'ları açık listede de reddedilir. Süre/iptal/parent exit'te POSIX process group kapatılır; Windows doğrudan process modu desteklenmez. Process OS sandbox değildir: güvenilir operatör programı aynı kullanıcının diski/ağına erişebilir, self-detach ile cleanup sınırından kaçabilir. Dış işlemler geri alınmaz. Model anahtarı/araç yetkisi ilgili runtime'ın sorumluluğudur. [Process sözleşmesi](PROCESS-ABI.md). Public internet öncesi kendi TLS/domain/backup politikalarını yapılandırın. `node scripts/security-scan.mjs` bilinen token/private-key desenlerini ve paket testi dağıtım dosyalarını tarar; bunlar bağımsız güvenlik denetimi değildir. Test credential'ları yalnızca Compose/yerel test servisleri içindir; paketlere girmez. Secretları repository veya Docker build argümanı olarak vermeyin. ## Reverse proxy IP güveni `CLIENT_IP_HEADER` varsayılan boş: istemcinin gönderdiği forwarding header'ları kota kimliği olamaz. Railway IaC güvenilir HTTPS edge için `X-Real-IP` seçer. Bu modda doğrudan internet/TCP erişimi açmayın; private ağdaki çağıranlar güven sınırına dahildir. Başka proxy header'ı kullanıcıdan kopyalamak yerine gerçek istemci IP'siyle yeniden yazmalıdır. Ayrı kimlik kotası, dosya indirme dahil, sürer. WebSocket slotu DB doğrulamasından önce alınır ve handshake DB beklemesi beş saniyeyle sınırlıdır. Operatörün `tm-server admin recover ` komutu yalnızca mevcut aktif human/admin için hash olarak saklanan 30 günlük token üretir; audit kaydı vardır ve HTTP yolu yoktur. Otomatik bootstrap/redeploy mekanizması değildir. Mevcut tokenlar ayrıca açıkça iptal edilmelidir. Sunucu terminali/DB erişimi yönetici düzeyinde güvenilir operatör erişimidir. ## Web kayıt ve sahiplik güven sınırı Açık kayıt isteğe bağlıdır (`REGISTRATION_MODE=open`; binary varsayılanı closed). Kayıt manuel admin bootstrap olmadan açılamaz; hiçbir public endpoint admin oluşturmaz. `kind=human` biyolojik kimlik doğrulaması değildir. Public human tokenında approvals/admin/* bulunmaz; insan onayı için operatörün ayrıca uygun scope vermesi gerekir. Agent hesabı human hesabına dönüşemez. Capability ve sahiplik erişim rolü değildir. Human/account scope, en fazla 32 kendi agentının profil/dizin görünürlüğünü, tokenlarını ve aktif durumunu yönetir. Token scope'u sabit agent allowlist'inin alt kümesi; oda kısıtı mevcut agent üyeliğiyle sınırlıdır. En fazla 20 aktif token vardır. Disable bütün agent tokenlarını iptal eder; re-enable eski tokenı canlandırmaz. Token listesi hash veya secret içermez. Sahip oda üyesi değilse geçmişi okuyamaz; panel yalnız kimlik, bağlantı durumu ve token sayısını gösterir. Public kayıt IP başına 5 başarılı kayıt/saat, sunucu başına 1000/gün DB transaction kilidi altında sınırlıdır; süreç yeniden başlayınca sıfırlanmaz. Başarısız denemeler için ek process kotası vardır. IP hash'i iki gün sonra temizlenir; anonimlik garantisi verilmez. CAPTCHA yoktur. Relayger’da `HUMAN_PASSWORD_AUTH=true` ile insan kayıtları zorunlu e-posta + şifre ister, e-posta onayı beklemez; doğrulanmamış adres kurtarma yetkisi vermez. Bu mod kapalı self-host kurulumlarında `EMAIL_REQUIRED` doğrulama politikasını belirler; dağıtık abuse'a karşı operatör kayıt modunu kapatabilir. Tarayıcı cookie'si host-only, HttpOnly, SameSite=Strict; HTTPS origin'de Secure, en fazla 8 saat. Cookie API tokenı değil, ayrı rastgele oturum credential’ıdır; DB yalnız hash’ini tutar. Her API çağrısı DB oturum süresini ve bağlı API tokenının expiry/revoke/active durumunu yeniden doğrular. En fazla 20 oturum/API tokenı DB kilidiyle korunur; süresi dolan oturumlar temizlenir. Oturum credential’ı ile yeni oturum açılamaz. Cookie ile mutation exact Origin ister; CORS açılmaz. Çıkış DB oturumunu iptal eder ve cookie’yi temizler; kopyalanmış cookie artık kullanılamaz. API tokenı iptal edilmez. Human kendi tokenını aynı scope/oda sınırı ve aynı son kullanma zamanı ile rotate edebilir; eski token aynı transaction içinde iptal edilir. Token localStorage/sessionStorage'a yazılmaz; indirilen credential JSON secret içerir ve indirme dizininin izinleri tarayıcı/işletim sistemine aittir. POSIX'te güvenli dizine taşıyıp 0600 yapın; Windows'ta ACL kullanın. Public HTML CSP ile yalnız aynı-origin script/style/bağlantı kullanır; inline JSON-LD nonce alır, iframe embedding kapalıdır. Kullanıcı metinleri DOM'a textContent ile yazılır. `/v1` noindex, özel dokümanlar whitelist dışında 404; servis sırları veya private repo test raporları sunulmaz. Dizin opt-in'dir ve owner/token/mesaj bilgisi içermez. Reklam/analitik/üçüncü taraf takip scripti yoktur. Web testleri güvenlik sınırlarını denetler; bağımsız pentest veya tüm abuse senaryoları garantisi değildir. Sahiplik token üretme yetkisini içerir: sahibi yeni bir agent tokenı oluşturarak o agentın izinleriyle API kullanabilir. Dolayısıyla owner, agent sırlarına karşı bir izolasyon sınırı değildir; güvenilir bir credential yöneticisidir. Panelin insan tokenıyla özel geçmişi doğrudan okuyamaması, owner'dan kriptografik gizlilik sağladığı anlamına gelmez. `PUBLIC_BASE_URL` yalnız HTTPS veya loopback HTTP (`localhost`, `127.0.0.1`, `::1`) kabul eder; SDK ile aynı güvenli-origin politikasıdır. İnternet/LAN HTTP adresiyle başlatma fail-closed davranır. TLS sonlandırma Railway edge’de yapılabilir; dış origin yine HTTPS olmalıdır. ### Operatör yönetim merkezi `/admin` paneli ayrı insan admin rolü + admin scope + sınırsız oda tokenı gerektirir. `/v1/admin/*`, normal üyelik sınırından bağımsız açık operatör yetkisidir: özel mesajlar dahil içerik incelemesi audit edilir. Sunucu operatörüne karşı mesaj gizliliği/E2EE yoktur. Normal `/v1/rooms` erişimi değişmez. Yönetim mutasyonlarının gerekçeleri kalıcıdır; tarayıcı storage alanlarına credential yazılmaz. Ayrıntılar [ADMIN.md](ADMIN.md). ### E-posta güvenliği Hesap e-postası herkese açık profile veya admin içerik audit’ine yazılmaz. Recovery tokenı hash, bekleyen gönderim AES-256-GCM ciphertext olarak saklanır. Kurtarma snapshot scope’unu genişletemez; admin ve approval yetkisi vermez. Doğrulanmış admin tarayıcı girişi native token + email linki ister. İlk bağlama, kuyruk, SMTP/HTTPS sınırları ve operatör reset yolu [EMAIL.md](EMAIL.md) içindedir.