Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
211 changes: 211 additions & 0 deletions .sisyphus/security-audit-2026-05-19.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
# BrowserOS Güvenlik Denetim Raporu

**Tarih**: 2026-05-19
**Kapsam**: Tüm monorepo (packages/browseros-agent + packages/browseros)
**Commit**: a59f96f6
**Metod**: 8 paralel güvenlik tarama agentı ile otomatik statik analiz

---

## Yönetici Özeti

BrowserOS kod tabanında **7 kritik/yüksek**, **12 orta**, **8 düşük** seviyede güvenlik bulgusu tespit edildi. En kritik sorunlar:

1. **Tüm kimlik bilgileri düz metin olarak diskte saklanıyor** — API anahtarları, OAuth token'ları, konuşma geçmişi (şifreleme yok)
2. **`filesystem_bash` aracı sınırsız shell komutu çalıştırıyor** — sandbox, allowlist, onay mekanizması yok
3. **Tüm dosya sistemi araçlarında path traversal koruması yok** — `../../../etc/passwd` çalışıyor
4. **Kullanıcı konuşmaları ve ses kayıtları BrowserOS bulutuna yükleniyor** — kullanıcı farkında olmayabilir
5. **Kritik rotalar origin doğrulaması olmadan açık** — `/oauth`, `/mcp`, `/chat` korumasız

Hiçbir arka kapı veya gizli veri sızdırma mekanizması tespit edilmedi. Tüm ağ çağrıları meşru ürün işlevlerine hizmet ediyor.

---

## Bulgu Kataloğu

### 🔴 KRİTİK (7 bulgu)

#### C-1: API Anahtarları Düz Metin chrome.storage.local'da
**Dosya**: `apps/agent/lib/llm-providers/storage.ts:13`
**Etkilenen veri**: OpenAI, Anthropic, Google, OpenRouter, Azure, Bedrock API anahtarları ve AWS kimlik bilgileri
**Sorun**: `@wxt-dev/storage` (→ `chrome.storage.local`) hiçbir şifreleme katmanı içermiyor. `types.ts:37`'deki "encrypted and stored locally" yorumu **yanıltıcı**.
**Risk**: Chrome profil dizinine erişimi olan herhangi bir işlem tüm API anahtarlarını okuyabilir.
**Öneri**: Web Crypto API ile `crypto.subtle.encrypt()` kullanarak depolama öncesi şifreleme ekleyin.

#### C-2: OAuth Token'ları Düz Metin SQLite'da
**Dosya**: `apps/server/src/lib/db/schema/oauth.ts:21-22`
**Etkilenen veri**: ChatGPT Pro/Plus, GitHub Copilot, Qwen Code için `access_token` ve `refresh_token`
**Sorun**: SQLite `oauth_tokens` tablosu düz metin. `better-sqlite3` cipher uzantısı kullanılmıyor.
**Risk**: `~/.browseros/db/browseros.sqlite` dosyasına erişen herkes token'ları çalabilir.
**Öneri**: AES-256-GCM ile sütun seviyesinde şifreleme ekleyin.

#### C-3: `filesystem_bash` Sınırsız Shell Komutu Çalıştırıyor
**Dosya**: `apps/server/src/tools/filesystem/bash.ts:35-39`
**Sorun**: `Bun.spawn([shell, '-c', params.command])` ile herhangi bir komut çalıştırılabilir. Allowlist yok, sandbox yok, environment kısıtlaması yok.
**Risk**: Prompt injection yoluyla veya kötü niyetli LLM çıktısıyla `rm -rf /`, `curl evil.com`, `dd if=/dev/zero` gibi komutlar çalıştırılabilir.
**Öneri**: Komut allowlist'i ekleyin, container içinde çalıştırın, tehlikeli komutları engelleyin.

#### C-4: Kullanıcı Konuşmaları BrowserOS Bulutuna Yükleniyor
**Dosya**: `apps/agent/lib/conversations/uploadConversationsToGraphql.ts`
**Sorun**: Tüm sohbet mesajları (prompt'lar, yanıtlar, tool çağrıları) `api.browseros.com/graphql`'e senkronize ediliyor.
**Risk**: README'deki "Your data never leaves your machine" iddiası ile çelişiyor. Kullanıcılar bu senkronizasyondan haberdar olmayabilir.
**Öneri**: Açık kullanıcı onayı mekanizması ekleyin, privacy policy'de belirtin.

#### C-5: Build-Time Secret Inlining
**Dosya**: `scripts/build/server/compile.ts:34-42`
**Sorun**: Production build'de `SENTRY_DSN`, `POSTHOG_API_KEY`, `BROWSEROS_CONFIG_URL` binary içine gömülüyor.
**Risk**: `strings` komutu ile binary'den çıkarılabilir.
**Öneri**: Bu değerleri runtime'da fetch edin veya environment variable'dan okuyun.

#### C-6: Tüm Dosya Sistemi Araçlarında Path Traversal
**Dosyalar**: `read.ts`, `write.ts`, `edit.ts`, `grep.ts`, `ls.ts`, `find.ts`, `framework.ts`, `page-actions.ts`
**Sorun**: `path.resolve(cwd, params.path)` tüm araçlarda kullanılıyor ama sonucun workspace içinde kalıp kalmadığı kontrol edilmiyor.
**Risk**: `../../../etc/passwd` okuyabilir, `/etc/cron.d/evil` yazabilir.
**Öneri**: `resolve()` sonrası `relative()` ile workspace sınır kontrolü ekleyin.

#### C-7: Kritik Rotalarda Origin Doğrulaması Yok
**Dosya**: `apps/server/src/api/server.ts`
**Sorun**: `/oauth`, `/klavis`, `/mcp`, `/chat` rotaları `requireTrustedAppOrigin()` middleware'i olmadan mount edilmiş. Server `0.0.0.0`'e bind oluyor.
**Risk**: Aynı ağdaki herhangi biri OAuth token ekleyebilir, MCP komutu gönderebilir, LLM sağlayıcısını kullanabilir.
**Öneri**: Ya bu rotalara `requireTrustedAppOrigin()` ekleyin, ya da default bind'i `127.0.0.1` yapın.

---

### 🟠 YÜKSEK (5 bulgu)

#### H-1: Arama Önerileri 5 Arama Motoruna Tuş Tuş Gönderiliyor
**Dosya**: `apps/agent/entrypoints/newtab/index/lib/searchSuggestions/getSearchSuggestions.ts`
**Sorun**: Yeni sekmede yazılan her harf Google, Bing, Yahoo, DuckDuckGo, Brave'e aynı anda gönderiliyor.
**Risk**: Kısmi arama sorguları 5 farklı şirkete sızıyor.
**Öneri**: Sadece varsayılan arama motoruna gönderin veya opt-in yapın.

#### H-2: Sentry `sendDefaultPii: true`
**Dosya**: `apps/server/src/lib/sentry.ts:19`
**Sorun**: Her hatada IP adresi ve request header'ları Sentry'ye gönderiliyor.
**Öneri**: PII gönderimini kapatın veya sanitizasyon listesini genişletin.

#### H-3: Ses Kayıtları BrowserOS Bulutuna
**Dosya**: `apps/agent/lib/voice/transcribe-audio.ts`
**Sorun**: Kullanıcı ses kayıtları `.webm` olarak `llm.browseros.com/api/transcribe`'a gönderiliyor.
**Öneri**: Yerel transcription veya kullanıcı onayı.

#### H-4: Favicon İstekleri ile Gezinti Geçmişi Google'a Sızıyor
**Dosya**: `apps/agent/lib/getFavicons.ts`
**Sorun**: Ziyaret edilen her sitenin domain'i `google.com/s2/favicons`'a gönderiliyor. DuckDuckGo alternatifi yorum satırına alınmış.
**Öneri**: DuckDuckGo favicon servisine geri dönün veya privacy-preserving alternatif kullanın.

#### H-5: `codex-fetch.ts` BrowserOS Kullanıcılarını OpenAI'ye İşaretliyor
**Dosya**: `apps/server/src/lib/clients/oauth/codex-fetch.ts`
**Sorun**: Tüm ChatGPT isteklerine `originator: browseros` header'ı ekleniyor, istekler `chatgpt.com/backend-api/codex`'e yönlendiriliyor.
**Risk**: BrowserOS kullanıcıları OpenAI sistemlerinde tanımlanabilir hale geliyor.
**Öneri**: Bu header'ın gerekliliğini değerlendirin, dokümante edin.

---

### 🟡 ORTA (12 bulgu)

| # | Bulgu | Dosya |
|---|-------|-------|
| M-1 | CORS overly permissive (`origin: '*'` + credentials) | `api/utils/cors.ts` |
| M-2 | SSRF riski: MCP transport probe URL doğrulaması zayıf | `lib/mcp-transport-detect.ts` |
| M-3 | ReDoS: grep aracında regex backtracking koruması yok | `tools/filesystem/grep.ts:133` |
| M-4 | URL injection: `javascript:` ve `file:` protokolleri engellenmiyor | `tools/navigation.ts`, `browser/browser.ts` |
| M-5 | `dangerouslySetInnerHTML` Shiki çıktısı ile kullanılıyor | `components/ai-elements/code-block.tsx` |
| M-6 | Container image'leri için imza doğrulaması yok | `lib/container/image-loader.ts` |
| M-7 | Container'larda kaynak limiti yok (CPU/memory/pids) | `lib/container/container-cli.ts` |
| M-8 | `zod-from-json-schema@0.1.0` — olgunlaşmamış paket | `apps/server/package.json` |
| M-9 | `chrome-devtools-mcp: "latest"` — versiyon sabitlenmemiş | `apps/server/package.json` |
| M-10 | OpenClaw gateway auth token'ı düz metin dosyada | `~/.openclaw/openclaw.json` |
| M-11 | JTBD anket verileri üçüncü parti Fly.io sunucusuna | `apps/agent/entrypoints/app/jtbd-agent/` |
| M-12 | Host-process agent'lar (Claude/Codex) container izolasyonu olmadan çalışıyor | `lib/agents/runtime/host-process-agent-runtime.ts` |

---

### 🟢 DÜŞÜK (8 bulgu)

- OAuth client ID'leri kaynak kodda (PKCE için normal)
- Test dosyalarında mock credential'lar (`sk-test` vb.)
- `upload_file` aracında path doğrulaması yok
- `/tmp/browseros-tool-output-*` temizlenmiyor
- Terminal WebSocket'te ek authentication yok
- MCP transport probe log'larında URL'ler görünüyor
- `.openclaw/` için `.gitignore` girişi yok
- `@types/bun: "latest"` eval paketinde sabitlenmemiş

---

## Hiçbir Arka Kapı veya Gizli Veri Sızdırma Tespit Edilmedi

Tüm ağ çağrıları meşru ürün işlevlerine hizmet ediyor:
- **LLM sağlayıcıları** (OpenAI, Anthropic, Google, vb.) — beklenen davranış
- **BrowserOS altyapısı** (api.browseros.com, llm.browseros.com, cdn.browseros.com)
- **Telemetri** (Sentry hata takibi, PostHog analitik)
- **Arama önerileri** (Google, Bing, Yahoo, DDG, Brave)
- **OAuth akışları** (standart PKCE/Device Code)

---

## Veri Akış Haritası

```
Kullanıcı Verisi → Nereye Gidiyor?
├── Konuşmalar → chrome.storage.local (düz metin) + api.browseros.com/graphql
├── API Anahtarları → chrome.storage.local (düz metin) + LLM sağlayıcıları
├── OAuth Token'ları → ~/.browseros/db/browseros.sqlite (düz metin)
├── Ses Kayıtları → llm.browseros.com/api/transcribe
├── Arama Sorguları → Google, Bing, Yahoo, DDG, Brave (5 motor)
├── Gezinti Verileri → Chromium profili + google.com/s2/favicons
├── Hata Raporları → Sentry (IP ve header'larla)
├── Kullanım Verileri → PostHog (tüm etkileşimler, session recording)
├── Bellek (Memory/Soul) → ~/.browseros/memory/*.md + ~/.browseros/SOUL.md
└── Dosya İşlemleri → Kullanıcının workspace dizini (path traversal riski var)
```

---

## Öncelikli Aksiyon Planı

### Faz 1 — Hemen (1-2 gün)
1. ✅ Kritik rotalara origin doğrulaması ekle (`/oauth`, `/mcp`, `/chat`)
2. ✅ Path traversal korumasını tüm dosya sistemi araçlarına ekle
3. ✅ `filesystem_bash` için minimum komut allowlist'i

### Faz 2 — Kısa Vade (1 hafta)
4. API anahtarları için Web Crypto API şifreleme
5. OAuth token'ları için AES-256-GCM şifreleme
6. `javascript:` ve `file:` URL protokollerini engelle
7. `sendDefaultPii: true` ayarını kapat veya sanitize et
8. `latest` ile sabitlenmiş paketleri pinle

### Faz 3 — Orta Vade (2-4 hafta)
9. Container image imza doğrulaması
10. Container kaynak limitleri
11. ReDoS koruması
12. Arama önerilerini sadece varsayılan motora indir
13. Favicon için privacy-preserving alternatif
14. Konuşma senkronizasyonu için kullanıcı onay mekanizması

### Faz 4 — Uzun Vade
15. `filesystem_bash` için container sandbox
16. Host-process agent'lar için container izolasyonu
17. CI/CD pipeline'a otomatik güvenlik taraması (gitleaks, npm audit, snyk)
18. Privacy policy güncellemesi — tüm veri akışlarını belgele

---

## Metodoloji

Bu denetim 8 paralel güvenlik tarama agentı ile gerçekleştirildi:

| Agent | Kapsam | Bulgu Sayısı |
|-------|--------|-------------|
| Ağ/Veri Sızdırma | Tüm outbound HTTP/WS çağrıları | 10 |
| Secret Yönetimi | API key, token, env var, kredansiyel | 10 |
| Tool Güvenliği | 60+ tool, sandbox, ACL, onay | 9 |
| Auth/OAuth/MCP | Kimlik doğrulama, OAuth, MCP entegrasyonları | 8 |
| Container/Docker | Konteyner, süreç, yetki yükseltme | 6 |
| Local Storage | Veri kalıcılığı, şifreleme, PII | 10 |
| Supply Chain | Bağımlılıklar, postinstall, registry | 3 |
| Injection | Command/Path/XSS/ReDoS/SQL injection | 12 |

**Toplam**: ~120 dosya incelendi, 32 bulgu kataloglandı.
86 changes: 86 additions & 0 deletions PROJECT_TRACKER.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# PROJECT_TRACKER.md - BrowserOS Katkıları

## Son Güncelleme: 2026-05-07

---

## ✅ Tamamlanan Görevler

### Issue #950 - Group Scheduled Task Results
**Status:** PR #961 OPEN (review bekliyor)

**Yapılan Değişiklikler:**
- `ScheduledTaskResultGroup.tsx` - Yeni accordion component
- `ScheduledTaskResults.tsx` - Düz liste → gruplanmış yapı
- `ScheduleResults.tsx` (newtab) - Tutarlılık güncellemesi
- `types.ts` - `groupRunsByJob()` helper fonksiyonu

**Copilot Review Comments (6/6 addressed):**
1. Running groups MAX_DISPLAY_COUNT'a takılıyordu → ✅ Düzeltildi
2. Jobs yüklenmeden önce boş state flash → ✅ Fallback eklendi
3. Nested button HTML issue → ✅ Mevcut pattern korundu
4. Duplike grouping logic → ✅ Helper çıkarıldı
5. Unused imports → ✅ Temizlendi
6. Screenshot eklendi → ✅

**CLA:** ✅ İmzalandı
**Screenshot:** ✅ PR'a eklendi

---

## 👀 Takip Edilenler

### Issue #926 - Delete/Clear Scheduled Task Runs
**Status:** PR #937 OPEN (A2rjav tarafından açılmış)

**Not:** #950 PR'ımız merge edildikten sonra rebase edilmeli. Merge conflict olabilir.

---

## 📋 Idea Backlog

- [ ] #925 - Flexible schedule options (cron-like)
- [ ] #927 - Scheduled task notifications
- [ ] #928 - Task execution history export
- [ ] #929 - Task grouping by category
- [ ] #930 - Task templates

---

## 🎯 Yarının Öncelikleri

1. **PR #961 Review** - Maintainer review bekleniyor
2. **PR #937 Rebase** - #950 merge edildikten sonra
3. **Yeni Issue** - Backlog'dan bir sonraki feature

---

## 📝 Notlar

- İlk open source katkı tamamlandı!
- BrowserOS monorepo yapısı: `packages/browseros-agent/` agent kodu
- Fork: `cenktekin/BrowserOS`
- Upstream: `browseros-ai/BrowserOS`

---

## 🔧 Teknik Notlar

### BrowserOS Agent Yapısı
```
packages/browseros-agent/
├── apps/agent/
│ ├── entrypoints/
│ │ ├── app/scheduled-tasks/ ← #950 burada
│ │ └── newtab/index/ ← ScheduleResults.tsx
│ └── lib/schedules/
│ └── scheduleStorage.ts ← Hook'lar
```

### Commit Convention
`feat(agent): <description>` veya `fix(agent): <description>`

### Gerekenler
- `git-lfs` kurulu olmalı
- `bun install` ile dependency kurulumu
- `bun run codegen:agent` ile GraphQL codegen
52 changes: 52 additions & 0 deletions SECURITY_HARDENING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# 🛡️ BrowserOS Security Hardening Log (Safkan-Secure)

Bu dosya, BrowserOS üzerindeki güvenlik açıklarını kapatmak için yapılan müdahalelerin kayıt defteridir. Kota dolması veya model değişimi durumunda sonraki agent buradan devam etmelidir.

## 🔱 Genel Strateji
1. **Rebase-First:** Upstream (`main`) güncellemeleri her zaman bu branch üzerine rebase edilir. (Not: Büyük mimari değişikliklerde manuel müdahale gerekebilir).
2. **Minimal Conflict:** Orijinal kod silinmez, wrapper veya interceptor pattern kullanılır.
3. **Dead-Code Telemetry:** Veri sızdıran fonksiyonlar silinmez, içleri `return` ile boşaltılır veya mock nesneler kullanılır.

## 📋 Mevcut Durum (2026-05-21)
**Versiyon:** `0.0.94-safkan` (Güvenli ve Geliştirilmiş Sürüm)
**Audit Raporu:** `.sisyphus/security-audit-2026-05-19.md`

### ✅ Faz 1: Kanmayı Durdur (Tamamlandı)
- [x] **C-7: Origin Verification** (Server default host 127.0.0.1 yapıldı)
- [x] **C-6: Path Traversal Protection** (`resolveSafePath` eklendi ve tüm filesystem araçlarına entegre edildi)
- [x] **C-3: Bash Tool Sandbox** (Komut allowlist/forbidden list eklendi, pipeline ve redirection engellendi)

### ✅ Faz 2: Veri Sızıntılarının Kapatılması (Tamamlandı)
- [x] **C-4: Conversation Sync** (uploadConversationsToGraphql komple temizlendi)
- [x] **H-1: Search Suggestions** (getSearchSuggestions komple temizlendi)
- [x] **H-4: Favicon Leakage** (Google favicon servisi iptal edildi)
- [x] **H-3: Voice Recording Upload** (transcribe-audio.ts temizlendi)
- [x] **H-2: Sentry PII Leakage** (sendDefaultPii: false yapıldı)
- [x] **PostHog Analytics** (Session recording ve analitik mock object ile tamamen kapatıldı)

### ✅ Faz 3: Kriptografi (Tamamlandı)
- [x] **C-1: API Keys Encryption** (Web Crypto API + AES-GCM ile chrome.storage.local şifreleme eklendi)
- [x] **C-2: OAuth Tokens Encryption** (Node.js Crypto + AES-256-GCM ile SQLite şifreleme eklendi)
- [x] **Extra: Conversation History Encryption** (Konuşma geçmişi diskte artık tamamen şifreli saklanıyor)

### 🆕 Entegre Edilen Özellikler (Extra Features)
- [x] **#950 - Group Scheduled Task Results** (Sonuçlar Today, Yesterday, vb. şeklinde tarihe göre gruplanıyor)
- [x] **#926 - Delete Task Runs** (Bireysel sonuç silme ve "Clear All" özelliği eklendi)

---

## 🧪 Doğrulama (Validation)

### 2026-05-21: Checkpoint Build & Typecheck
- **bun run typecheck:** ✅ BAŞARILI. Tüm monorepo tip kontrolünden geçti.
- **Bileşen Uyumluluğu:** CLI (Go) ve Sunucu bağlantısı 127.0.0.1 ile uyumlu.
- **Kriptografi:** Server ve Agent tarafında şeffaf şifreleme katmanları başarıyla entegre edildi.

---

## 🛠️ Yapılan Müdahaleler

### 2026-05-21: Faz 1, 2 & 3 ve Özellik Entegrasyonu
1. **Güvenlik:** Tüm kritik açıklar kapatıldı ve şifreleme katmanları eklendi.
2. **UI/UX:** Görev sonuçları için gruplandırma ve silme özellikleri eklendi.
3. **Versiyonlama:** Monorepo ve alt paket versiyonları `0.0.94-safkan` olarak mühürlendi.
Loading
Loading