umisec
MTSK · driving school softwaresürücü kursu yazılımı

Işıklar Asistan

Desktop software that does a driving school's office work and shows the owner what is being missed. The data stays on the school's own computer. It runs today at Işıklar Sürücü Kursu in Biga. The goal is to make it installable at more schools by the end of November 2026.

Sürücü kursunun büro işini üstlenen, kurs sahibine gözden kaçanı gösteren masaüstü programı. Veri kursun kendi bilgisayarında durur. Bugün Biga'da Işıklar Sürücü Kursu'nda çalışıyor. Hedef, Kasım 2026 sonunda başka kurslara da kurulabilir olmak.

01 — What it does todayBugün ne yapıyor
02 — Why security matters hereGüvenlik burada neden önemli

A driving school holds the most sensitive data categories in Turkish law: health reports, criminal-record certificates, ID scans and biometric photos. It also holds the school's passwords for the government portal and the e-invoice system. The test plan is sized to real data: 12,600 trainees and 56,000 scanned documents.

Bir sürücü kursu, Türk hukukundaki en hassas veri türlerini tutar: sağlık raporu, adli sicil belgesi, kimlik taraması, biyometrik fotoğraf. Bunlara ek olarak MEBBİS ve e-Fatura şifrelerini de tutar. Test planı gerçek veri büyüklüğüne göre: 12.600 kursiyer, 56.000 tarama.

Threats we design against, in order: ransomware → theft of credentials (MEBBİS, Luca, e-Devlet) → personal data leak → insider misuse → targeted attack. Once the product runs at many schools, our server becomes a valuable target.

Gerçekçi tehdit sırası: fidye yazılımı → kimlik bilgisi hırsızlığı (MEBBİS, Luca, e-Devlet) → kişi verisi sızıntısı → içeriden kötüye kullanım → hedefli saldırı. Ürün çok kursa yayıldığında sunucumuz değerli bir hedef olur.

Ground rule: assume the client can be broken. So the client holds no secrets: no embedded keys, passwords or hidden endpoints. Anything valuable lives on the server or in the Windows vault. There is no obfuscation, on purpose, because it wouldn't stop a determined attacker.

Temel ilke: istemci kırılabilir kabul edilir. İstemcide sır yok: gömülü anahtar, şifre, gizli uç nokta yok. Değerli olan sunucuda ve Windows kasasında durur. Kod karartma bilinçli olarak yok; kararlı birini durdurmaz.

03 — Trust boundariesGüven sınırları
The school's PC
Kursun bilgisayarı
Window (WebView2)Pencere (WebView2)CSP: scripts only from its own package, no eval, user data never rendered as HTMLCSP: betik yalnız kendi paketinden, eval yok, kullanıcı verisi HTML olarak basılmaz
Local API (Rust)Yerel API (Rust)Parameterized queries; header sessions (no cookies, so no CSRF)Parametreli sorgular; başlıkla oturum (çerez yok, CSRF yok)
DatabaseVeritabanıSQLite + SQLCipher
Python sidecarPython yan süreçe-invoice · Word · OCRe-Fatura · Word · OCR
MEBBİS keeperMEBBİS bekçisilocal only, 256-bit keyyalnız yerel, 256 bit anahtar
DPAPI vaultDPAPI kasasıportal passwords · database keyportal şifreleri · veritabanı anahtarı
Internet
İnternet
MEBBİSReads are live. Writes are in progress: preview, per-candidate approval, codes typed by a person, read-back.Okuma canlı. Yazma yolda: önizleme, aday başına onay, kodları insan girer, geri okuma.
Luca e-FaturaOnly invoices a person has approved; duplicate lock; amount ceilingyalnız onaylı fatura; mükerrer kilidi; tutar üst sınırı
Our server (Türkiye, planned)Bizim sunucu (Türkiye, planlı)Gets name, status and phone only. Never ID numbers, health reports or criminal records.Yalnız ad, süreç, telefon. TC, sağlık ve adli sicil asla.
Foreign website on the same PCAynı bilgisayardaki yabancı siteblocked from the local APIyerel API'ye erişemez
04 — ControlsKorumalar

Statuses are reported honestly. "In place" means verified in code; everything else is on the roadmap. An internal register of open risks is tracked to closure. It is not published here because the software runs at a real school.

Durumlar dürüstçe yazılır: "Var" kodda doğrulanmıştır, gerisi yol haritasındadır. Açık riskler iç bir listede kapanana kadar izlenir; yazılım gerçek bir kursta çalıştığı için burada yayımlanmaz.

AreaAlanControlKorumaStatusDurum
IdentityKimlikPasswords hashed with argon2id. The first owner account can be created only when no users exist, and only from that PC. Session token: 32 random bytes; only its SHA-256 hash is stored. Responses don't reveal whether a user exists.Şifre argon2id; ilk sahip hesabı yalnız hiç kullanıcı yokken ve yalnız o bilgisayardan; oturum anahtarı 32 bayt rastgele, veritabanında yalnız SHA-256 özeti; kullanıcı varlığı sızmaz.in placevar
SecretsSırlarPortal passwords in DPAPI; portal cookies encrypted; one-time codes never written to disk; keeper accepts only local, keyed commandsPortal şifreleri DPAPI'de; çerezler şifreli; tek kullanımlık kod yazılmaz; bekçi yalnız yerelden ve anahtarlain placevar
RepositoryDepoID-number scan before every commit and on every push, history included. Unscannable files (photo, PDF, Excel, ZIP, HAR) need an allowlisted path. AI agents can't read env files. History cleaned and verified.Commit öncesi ve her push'ta, geçmiş dahil TC taraması; taranamayan dosya (fotoğraf, PDF, Excel, ZIP, HAR) yalnız izin listesiyle; ajanlar env dosyalarını okuyamaz; geçmiş temizlendi.in placevar
External actionsDış işlemlerShow → confirm → send → read back. If the portal page is unexpected, the software stops and says manual action is needed.Göster → onaylat → gönder → geri oku; beklenmeyen ekranda dur, "manuel işlem gerekli" de.e-invoiceLuca MEBBİS writeMEBBİS yazma
Data at restDuran veriDatabase encrypted with SQLCipher, key in DPAPI with a paper recovery codeSQLCipher ile şifreli veritabanı, anahtar DPAPI'de, kurtarma kodu kâğıttain progressyolda
BackupsYedekDaily backup encrypted with the school's own key: local + school's off-site copy + our server in Türkiye. We cannot open it.Kursun anahtarıyla şifreli günlük yedek: yerel + kursun dış kopyası + Türkiye'deki sunucumuz. Biz açamayız.in progressyolda
UpdatesGüncellemeEd25519-signed packages, private key kept offline. Unsigned packages are rejected. A backup runs before every update. A separate low-privilege key can only "disable automation and show a message".Ed25519 imzalı paket, özel anahtar çevrimdışı; imzasız paket reddedilir; güncelleme öncesi yedek; ayrı, düşük yetkili anahtar yalnız "otomasyonu kapat + mesaj göster" diyebilir.in progressyolda
AccountabilityHesap verebilirlikAppend-only access log of who opened which document and when; even the app can't edit or delete it. Brute-force lock after 5 failed logins.Kim, ne zaman, hangi belgeyi açtı: uygulamanın bile değiştiremediği erişim günlüğü. 5 yanlış denemede kilit.in progressyolda
ServerSunucuHosted in Türkiye. TLS. Mandatory TOTP or passkey for staff. Tenant ID plus row-level security on every table. Remote support is outbound-only, uses fixed read-only commands, lasts 60 minutes and is logged on both sides.Türkiye'de, TLS, ekip hesaplarında zorunlu TOTP / passkey, her tabloda kurum kimliği + RLS; uzak destek kurstan dışarı, salt okunur sabit komutlar, 60 dk, iki taraflı günlük.plannedplanda
PackagePaketCode-signing certificate; signed integrity manifest for Python filesKod imzalama sertifikası; Python dosyaları için imzalı bütünlük listesiplannedplanda
05 — Test planTest planı

20 reverse-engineering and stress tests

20 maddelik tersine mühendislik ve stres testi

  1. Reverse engineering (#1–2): inspect my own executables and installer with IDA, Ghidra and strings; tamper with installed files and check that it's detected.
  2. Attacking the local API (#3–8): requests without auth, forged Host/Origin, DNS rebinding, requests from another PC, CSRF from an open web page, keeper commands with no key or a wrong key, Tauri commands outside their permissions, HTML/JS payloads in trainee names across every screen and Word document, and path traversal.
  3. Forensics (#9–10): disk traces (permissions, backups, logs, OCR and print temp files, WebView2 storage) and process memory dumps, checked for passwords and one-time codes.
  1. Tersine mühendislik (#1–2): kendi exe ve kurulum paketim IDA / Ghidra / strings ile; kurulu dosyayı değiştirip fark edildiğini görmek.
  2. Yerel API'ye saldırı (#3–8): girişsiz istek, sahte Host/Origin, DNS rebinding, başka bilgisayardan istek, açık web sayfasından CSRF, bekçiye anahtarsız ya da yanlış anahtarla komut, yetki dışı Tauri komutları, her ekranda ve Word belgesinde kursiyer adına HTML/JS yükü, dizin aşma.
  3. Adli inceleme (#9–10): diskteki izler (izinler, yedek, günlük, OCR ve baskı geçicileri, WebView2 depolaması) ve süreç bellek dökümleri: şifre ve tek kullanımlık kod aranır.
  1. Update chain (#11–12): fake update manifest, unsigned package, downgrade, man-in-the-middle; replayed, expired or foreign password-reset tokens.
  2. Data hygiene (#13): personal data and secrets in git history.
  3. Resilience (#14–20): real-scale data, 8 hours of uptime, a power cut mid-write, a full disk, a clock change, non-Turkish Windows, an external system dropping mid-operation, a portal page that changes (tested on the simulator), and a ransomware drill where the PC is gone.
  1. Güncelleme zinciri (#11–12): sahte güncelleme bildirimi, imzasız paket, sürüm düşürme, araya girme; tekrar kullanılan, süresi geçmiş ya da başka cihazın sıfırlama belirteci.
  2. Veri temizliği (#13): git geçmişinde kişi verisi ve sır.
  3. Dayanıklılık (#14–20): gerçek büyüklük, 8 saat açık kalma, yazarken elektrik kesintisi, dolu disk, saat değişimi, Türkçe olmayan Windows, işlem ortasında kopan dış sistem, değişen portal sayfası (simülatörde), bilgisayarın gittiği fidye yazılımı tatbikatı.

Tests #1–12 and #20 are exactly the kind of work the Cyber Verification Program is for. I run them only on my own builds, on my own machine.

#1–12 ve #20, Cyber Verification Program'ın tam olarak kapsadığı türden işler. Bunları yalnız kendi sürümlerimde, kendi bilgisayarımda yapıyorum.

06 — KVKK (Law No. 66986698 sayılı Kanun)

Personal data, by design

Tasarımdan kişisel veri koruması

Türkiye's Personal Data Protection Law treats health and criminal-record data, and biometric data, as special categories (Art. 6). A driving school processes all three. Each class of data has a fixed home and a list of places it must never reach:

KVKK, sağlık ve ceza mahkûmiyeti verisini ve biyometrik veriyi özel nitelikli sayar (md. 6). Bir sürücü kursu üçünü de işler. Her veri sınıfının sabit bir yeri ve asla gitmeyeceği yerlerin listesi var:

ClassSınıfExamplesÖrnekLivesNerede dururNever goes toAsla gitmez
Special categoryÖzel niteliklihealth report, criminal record, ID scan, biometric photosağlık raporu, adli sicil, kimlik taraması, biyometrik fotoğrafschool's PC; on our server only inside a backup encrypted with the school's keykursun bilgisayarı; sunucuda yalnız kursun anahtarıyla şifreli yedek içindeour server in plaintext, WhatsApp, logs, repositoriesaçık hâliyle sunucu, WhatsApp, günlük, depo
PersonalKişiselname, T.C. ID number, phone, addressad, TC, telefon, adresschool's PC; the server gets only what a feature needs (name + status, phone for messages)kursun bilgisayarı; sunucuya yalnız gereken kadarı (ad + süreç, mesaj için telefon)repositories, logs; ID numbers never in message templatesdepo, günlük; mesaj şablonunda TC
SecretSırportal passwords, database keyportal şifreleri, veritabanı anahtarıDPAPI (user scope) + paper recovery codeDPAPI (kullanıcı kapsamı) + kâğıtta kurtarma kodurepositories, config files, serverdepo, ayar dosyası, sunucu
TransientGeçiciportal one-time codeMEBBİS doğrulama kodumemory, for that moment onlyyalnız o an, bellektewritten nowherehiçbir yere yazılmaz
SessionOturumowner / secretary sessionsahip / sekreter oturumuonly its SHA-256 hashyalnız SHA-256 özeti—
07 — Supporting toolsYardımcı araçlar

MEBBİS Foto publicaçık

Local biometric photo preparation with MediaPipe: face and eye landmarks, alignment, background removal, 394×512 output. Photos never leave the PC. It contains no automation that submits to the portal.

MediaPipe ile yerel biyometrik fotoğraf: yüz ve göz noktaları, hizalama, arka plan ayırma, 394×512 çıktı. Fotoğraf bilgisayardan çıkmaz; portala kayıt gönderen otomasyon içermez.

github.com/z3rocold/mebbis-foto →

Document watcher

Evrak izleyici

Detects new criminal-record, health-report and education PDFs, parses them locally, and writes to the school database only after a person confirms. Real documents and samples stay out of git.

Yeni adli sicil, sağlık raporu ve öğrenim belgesi PDF'lerini algılar, yerelde ayrıştırır, okul veritabanına yalnız onaydan sonra yazar. Gerçek belgeler ve örnekler git dışında.

MEBBİS lab

MEBBİS laboratuvarı

Maps of 25 screens and 42 states, taken from the school's own recorded sessions. The goal is a local, resettable simulator with synthetic records, so development never sends test traffic to the real government system. Raw recordings are private and hash-verified, and they are never replayed.

Kursun kendi oturum kayıtlarından 25 ekran / 42 durum haritası. Hedef: sentetik kayıtlarla çalışan, sıfırlanabilen yerel simülatör; geliştirme gerçek devlet sistemine test trafiği göndermez. Ham kayıtlar özel, SHA-256 doğrulamalı, asla tekrar gönderilmez.

surucukursum.net

The product website. Every claim on it has a written source. The same pre-commit personal-data scan runs there.

Ürünün tanıtım sitesi. Sitedeki her iddianın yazılı dayanağı var; aynı commit öncesi kişi verisi taraması orada da çalışır.