Açık Kaynak · Tamamen Şifreli · Bulut Yok
PlainApp Güvenlik Detaylı İncelemesi
PlainApp verilerinizi yerel Wi-Fi üzerinde nasıl koruyor — açık kaynak koddan kanıtlarla.
Android 9.0+ · Google Play · F-Droid · GitHub
İndirYerel Ağ Güvenliği Neden Önemlidir?
Android telefonunuzu bir PC tarayıcısından yönetmek için bir uygulama kullandığınızda SMS'leriniz, fotoğraflarınız, kişileriniz ve dosyalarınız Wi-Fi ağınız üzerinden gidip gelir. Çoğu uygulama tüm bu verileri okunabilir düz metin olarak gönderir. Aynı ağdaki herkes bunları görebilir.
"Ev Wi-Fi'ım, kim gözetleyecek ki?" diye düşünebilirsiniz. Ama şunları göz önünde bulundurun:
- Halka Açık Wi-Fi — Kafeler, havalimanları, oteller — yakındaki herkes trafiği yakalayabilir
- Paylaşılan ağlar — Ev arkadaşları, misafirler veya ele geçirilmiş IoT cihazları
- Router açıkları — Bilinen güvenlik açıklarına sahip güncel olmayan yazılımlar
Bir uygulama SMS mesajlarınızı HTTP üzerinden düz metin olarak gönderiyorsa, Wireshark gibi ücretsiz bir araçla herkes bunları okuyabilir. Bu teorik bir şey değil — son derece kolaydır.
Çoğu telefon yönetim uygulaması tam olarak bunu yapar. Web arayüzlerini kullanırken Chrome DevTools'u (F12 → Network sekmesi) açın, her API çağrısını düz JSON olarak okuyabilirsiniz — SMS içerikleri, dosya yolları, kişi adları, her şey.
PlainApp Farkı
PlainApp birden fazla şifreleme ve kimlik doğrulama katmanı uygular. İşte her katmanın ne yaptığı, sade bir dille.
GraphQL API — Yalnızca İhtiyacınız Olanı İsteyin
Çoğu uygulama eski tarz REST API'ler kullanır: her kaynak için bir URL, ihtiyacınız olsun ya da olmasın her şeyi döndürür. PlainApp, tarayıcının yalnızca ihtiyaç duyduğu veriyi istediği modern bir yaklaşım olan GraphQL kullanır.
Bunun önemi:
- Daha az veri açığa çıkar — Yalnızca dosya adına ihtiyacınız varsa, yalnızca o gönderilir
- Tek endpoint — Düzinelerce URL yerine tek bir /graphql URL'si vardır, bu da saldırı yüzeyini azaltır
- Sorgu bazlı izinler — Her sorgu kendi iznini kontrol eder (örn. SMS okuma, giriş yaptıktan sonra bile READ_SMS izni gerektirir)
Şifreli API Çağrıları (XChaCha20-Poly1305)
Bu, PlainApp ile çoğu rakip arasındaki en büyük farktır.
Her API isteği ve yanıtı — HTTP ve WebSocket trafiği dahil — hem HTTP hem HTTPS modunda XChaCha20-Poly1305 ile şifrelenir. Bu, WireGuard VPN, Cloudflare ve Google'ın Tink kütüphanesi tarafından kullanılan modern bir AEAD şifreleme algoritmasıdır.
Basitçe anlatmak gerekirse:
- 1Tarayıcınız bir istek oluşturur (örneğin, "SMS'lerimi göster")
- 2Yeniden oynatma koruması için bir zaman damgası ve rastgele nonce ekler
- 3Tüm yükü XChaCha20-Poly1305 ile okunamaz ikili veriye şifreler
- 4Şifrelenmiş ikili veri ağ üzerinden gönderilir — base64 yok, JSON yok, saf ikili
- 5Yalnızca telefonunuz şifreyi çözebilir ve doğrulayabilir
Birisi trafiği yakalasa bile anlamsız ikili veri görür — okunabilir JSON değil.
Şifreleme hakkında:
- 256-bit anahtar (son derece güçlü)
- 192-bit nonce (diğer şifreleri etkileyen belirli saldırı türlerini önler)
- Yerleşik müdahale algılama — birisi aktarım sırasında veriyi değiştirirse şifre çözme başarısız olur
- Android tarafı: Google Tink tarafından desteklenir
- Web tarafı: @noble/ciphers tarafından desteklenir (kapsamlı denetimden geçmiş bir JavaScript şifreleme kütüphanesi)
Dijital İmzalar (Ed25519) — Cihazdan Cihaza
İki PlainApp cihazı birbiriyle iletişim kurduğunda (örneğin, telefondan telefona sohbet), yalnızca şifreleme yeterli değildir — her cihazın mesajın gerçekten diğer cihazdan geldiğini ve sahte olmadığını doğrulaması gerekir.
zaman damgası
Alıcı cihaz, gönderenin açık anahtarıyla imzayı doğrular ve zaman damgası 5 dakikayı aşan istekleri reddeder. Bu, hem sahtecilik hem de yeniden oynatma saldırılarını önler.
Güvenli Cihaz Eşleştirme (ECDH Anahtar Değişimi)
İki PlainApp cihazı birbiriyle eşleştiğinde (örn. iki telefon), paylaşılan bir şifreleme anahtarına ihtiyaç duyarlar. Ancak anahtarı ağ üzerinden göndermek amacı boşa çıkarır.
PlainApp bunu TLS, Apple'ın Secure Enclave'i ve WebAuthn'da kullanılan aynı matematiğe dayanan ECDH (Elliptic Curve Diffie-Hellman) anahtar değişimi ile çözer:
- 1Her cihaz bir anahtar çifti oluşturur (açık + özel)
- 2Yalnızca açık anahtarlarını birbirleriyle paylaşırlar
- 3Her cihaz kendi özel anahtarını diğerinin açık anahtarıyla birleştirir
- 4Her ikisi de aynı paylaşılan sırra ulaşır — bu sır hiçbir zaman ağ üzerinden geçmez
Şifreli URL'ler — Dosya Yollarını Gizleme
Çoğu kişinin fark etmediği bir ayrıntı: URL yolları da bilgi açığa çıkarır.
Bir dosya indirdiğinizde URL, sunucuya hangi dosyayı istediğinizi söyler. Birçok uygulamada URL şöyle görünür:
/fs?path=/sdcard/DCIM/Camera/photo_2024.jpgTrafiği izleyen (veya tarayıcı geçmişine bakan) herkes tam olarak hangi dosyaya eriştiğinizi ve telefonunuzun klasör yapısını görebilir.
PlainApp, URL'deki dosya yolunu şifreler:
/fs?id=AxK9f2mQ7vR3xP8nWz...id parametresi, URL Token adlı rastgele bir anahtar kullanılarak XChaCha20-Poly1305 ile şifrelenmiş dosya yoludur. Varsayılan olarak bu anahtar kalıcıdır ve uygulama yeniden başlatıldığında değişmez; böylece paylaşılan bağlantılar çalışmaya devam eder. Anahtar olmadan gerçek yolu tahmin etmek, dosyalarınızı listelemek veya indirme URL'si oluşturmak mümkün değildir.
Kendinden İmzalı Sertifikalarla HTTPS
PlainApp telefonunuzda kendinden imzalı bir TLS sertifikası oluşturur. Bu, bankaların ve web sitelerinin kullandığı aynı teknoloji olan şifreli bir HTTPS tüneli oluşturur.
Sertifika şunları kullanır:
- P-256 eğrisi ile ECDSA (büyük web siteleriyle aynı)
- SHA256 imzası
- Uygulamanın özel dizininde saklanır
Uygulama katmanındaki XChaCha20 şifreleme ile birleştiğinde, birbirinden bağımsız iki şifreleme katmanı elde edersiniz. Birini kırmak, diğerini de kırmadan işe yaramaz.
Giriş Koruması
PlainApp, parola tahmin saldırılarını önlemek için giriş denemelerini sınırlar:
- IP adresi başına 60 saniyede 5 deneme
- Ardından bağlantılar reddedilir
- Eski hız sınırlama kayıtları otomatik olarak temizlenir
HTTP ve HTTPS: Dürüst Bir Açıklama
PlainApp hem HTTP hem de HTTPS modları sunar. İşte aralarındaki gerçek fark:
| HTTP Modu | HTTPS Modu | |
|---|---|---|
| Dosya yolu URL'leri | Şifreli (XChaCha20) | Şifreli (XChaCha20) |
| API çağrıları | Şifreli (XChaCha20) | Şifreli (XChaCha20 + TLS) |
| Dosya indirmeleri | Aktarımda şifrelenmez | TLS ile şifreli |
| Kime yönelik | Başlangıç seviyesi kullanıcılar (tarayıcıda SSL uyarısı yok) | Gizliliğe önem veren kullanıcılar |
Her iki mod da API çağrılarını XChaCha20-Poly1305 ile şifreler — SMS'leriniz, kişileriniz ve diğer verileriniz HTTP veya HTTPS fark etmeksizin her zaman şifrelidir.
HTTP modu, kendinden imzalı sertifikaların tarayıcıda uyarı tetiklemesi nedeniyle vardır ("Bağlantınız gizli değil"). Teknik bilgisi daha az olan kullanıcılar için bu uyarı kafa karıştırıcı ve ürkütücüdür. HTTP bu sürtünmeyi ortadan kaldırır.
Ancak HTTP modu dosya transferlerini şifrelemez. Paylaşılan veya halka açık bir ağdaysanız mutlaka HTTPS kullanın.
Öneri: Mümkün olduğunca HTTPS kullanın. Tarayıcının kendinden imzalı sertifika uyarısını kabul edin — yerel ağ uygulamaları için bu normal ve beklenen bir durumdur.
Tedarik Zinciri Güvenliği — Daha Az Bağımlılık, Daha Az Risk
Birçok kullanıcının düşünmediği bir güvenlik tehdidi: tedarik zinciri saldırıları. Bir uygulama yüzlerce üçüncü taraf kütüphane kullandığında, bunların herhangi biri ele geçirilebilir — veri çalan, kripto para madenciliği yapan veya arka kapı açan kötü amaçlı kod enjekte edebilir.
Bu özellikle JavaScript ekosisteminde tehlikelidir. Son yıllarda event-stream, ua-parser-js ve colors gibi popüler npm paketleri ele geçirilerek milyonlarca projeye kötü amaçlı kod enjekte edildi. Bir telefon yönetim uygulamasının web arayüzü yüzlerce JS paketi çekiyorsa, her biri potansiyel bir saldırı noktasıdır.
PlainApp bilinçli bir yaklaşım benimser: mümkün olduğunca az bağımlılık kullanmak ve mantıklı olduğunda özel kod yazmak.
Android Uygulaması (plain-app)
- Dependency injection framework kullanılmaz (Hilt yok, Dagger yok) — basit singleton'lar kullanılır
- Şifreleme yalnızca 3 tanınmış kütüphane ile yapılır: Google Tink, Bouncy Castle ve yerleşik Java Cryptography Extension
- Sunucu Ktor üzerinde çalışır (JetBrains'in resmi Kotlin framework'ü) — belirsiz üçüncü taraf sunucu kütüphaneleri yoktur
Web Arayüzü (plain-desktop)
Yalnızca 28 çalışma zamanı bağımlılığı — tipik web uygulamalarından çok daha az. Normalde npm paketleri gerektiren birçok şey sıfırdan yazılmıştır:
| Özellik | Tipik Uygulama | PlainApp |
|---|---|---|
| Bildirim sesleri | howler.js / tone.js | Özel Web Audio API synth |
| UUID oluşturma | uuid npm paketi | Elle yazılmış RFC 4122 implementasyonu |
| Dosya yüklemeleri | uppy / axios | Kuyruklu özel parçalı yükleme |
| WebRTC video | Twilio / Daily.co SDK | Elle yazılmış PeerConnection kodu |
| HTTP istemcisi | axios / ky | Yerel tarayıcı fetch |
Web tarafında şifreleme, büyük ve şişkin alternatifleri kullanmak yerine kapsamlı denetimden geçmiş, sıfır bağımlılıklı bir JavaScript şifreleme kütüphanesi olan @noble/ciphers kullanır.
Bunun önemi
Eklediğiniz her bağımlılık, kontrol edemediğiniz koddur. PlainApp'in yaklaşımı şu anlama gelir:
- Kötü amaçlı kodun gizlenebileceği daha az yer
- Daha küçük saldırı yüzeyi
- Denetimi daha kolay (tüm kod tabanı açık kaynaktır)
- Terk edilmiş veya ele geçirilmiş npm paketleri riski yok
Birçok Rakibin Yanlış Yaptığı Şeyler
Bu belirli uygulamaları isimlendirmek değil. Bu kategorideki yaygın kalıplar hakkında:
| Güvenlik Yönü | PlainApp | Rakiplerde Yaygın Olan |
|---|---|---|
| API trafiği | Hem HTTP hem HTTPS'te şifreli (XChaCha20) | HTTP üzerinden düz JSON |
| WebSocket trafiği | Şifrelenmiş ikili çerçeveler (XChaCha20) | Düz metin JSON veya WebSocket yok |
| Kimlik doğrulama token yönetimi | Şifreleme anahtarı olarak kullanılır, başlıklarda asla yer almaz | HTTP başlıklarında gönderilir (kolayca sızar) |
| Dosya URL'leri | Şifreli yol kimlikleri | Düz metin yollar açığa çıkar |
| Anahtar değişimi | ECDH (P-256) | Yok |
| İstek imzalama | Ed25519 (yalnızca cihazlar arası) | Yok |
| Yeniden oynatma koruması | 30 s + nonce (Web); 5 dk + imza (cihaz) | Yok |
| Giriş koruması | Hız sınırlama + iki faktörlü onay | Sınırsız deneme |
| Veri yönlendirme | %100 yerel, bulut yok | Bazıları bulut üzerinden yönlendirir |
| Bağımlılıklar | Minimal, tanınmış kütüphaneler | Yüzlerce npm paketi |
| Kaynak kodu | Açık kaynak (GPL-3.0) | Çoğunlukla kapalı kaynak |
Herhangi bir uygulamayı kontrol etmenin en kolay yolu: uygulamayı kullanırken Chrome DevTools'u (F12) → Network sekmesini açın. API yanıtlarını JSON olarak okuyabiliyorsanız, uygulamada şifreleme yoktur.
Kendiniz Doğrulayın
PlainApp tamamen açık kaynaktır. Bu makaledeki her iddia kodda doğrulanabilir.
github.com/plainhub/plain-app (GPL-3.0)Otomatik, izlenebilir ve kurcalamaya dayanıklı sürüm hattı
Tüm kurulum paketleri GitHub ve F-Droid altyapısında otomatik olarak derlenir. Derlemeler izlenebilir, güvenlidir ve manuel derleme müdahalesi izi bırakmaz. PlainApp, doğrulanabilir derlemeler (SLSA) ve VirusTotal taramalı sürümler sunan az sayıdaki Android uygulamasından biridir.
GitHub ve F-Droid üzerinde otomatik derlemeler
Sürüm artefaktları yerel manuel paketleme yerine CI hatlarıyla üretilir. Her artefakt kaynak commit’lerine ve yeniden üretilebilir derleme iş akışlarına kadar izlenebilir.
SLSA Provenance (Seviye 3) + VirusTotal Taraması
Her sürüm SLSA provenance kanıtları ve VirusTotal tarama sonuçları içerir. Böylece tedarik zinciri denetlenebilir olur ve kullanıcılar kurulumdan önce bütünlüğü doğrulayabilir.
Sıkça Sorulan Sorular
HTTP modu kullandığımda PlainApp gerçekten şifreli mi?
Evet. Tüm API çağrıları (SMS, kişiler, dosya listesi vb.) hem HTTP hem de HTTPS modlarında XChaCha20-Poly1305 ile şifrelenir. HTTP modu yalnızca dosya indirmelerini şifrelemeden bırakır. Tam koruma için HTTPS kullanın.
Tarayıcım neden güvenlik uyarısı gösteriyor?
PlainApp şifreleme için kendinden imzalı bir TLS sertifikası kullanır. Bir kamu Sertifika Yetkilisi tarafından verilmediğinden tarayıcınız uyarı gösterir. Yerel ağ uygulamaları için bu normal ve beklenen bir durumdur. Devam etmek için 'Gelişmiş' ve 'Devam Et' seçeneklerine tıklayın.
Aynı Wi-Fi'daki biri verilerimi görebilir mi?
PlainApp ile hayır. API çağrıları XChaCha20-Poly1305 ile şifrelenir ve HTTPS modunda dosya transferleri de TLS ile şifrelenir. Çoğu rakip uygulamada evet — API çağrıları düz metin JSON olarak gönderilir.
PlainApp bir VPN ile nasıl karşılaştırılır?
VPN, cihazınız ile VPN sunucusu arasındaki trafiği şifreler. PlainApp, telefonunuz ile tarayıcınız arasındaki yerel ağ trafiğini şifreler. Farklı amaçlara hizmet ederler — PlainApp yerel cihaz yönetimini güvence altına alırken, VPN internet trafiğini güvence altına alır.
Kod gerçekten açık kaynak mı?
Evet. PlainApp GPL-3.0 lisansı altındadır. Tam kaynak kodu github.com/plainhub/plain-app adresinde mevcuttur. Her şifreleme implementasyonunu inceleyebilir, kaynaktan derleyebilir veya katkıda bulunabilirsiniz.
Telefonunuzun kontrolünü geri alın.
Bulut aracısı yok. Aylık ücret yok. Sadece telefonunuz ve tarayıcınız.