Mergen · Tespit
Kural Referansı
Mergen 54 yerleşik tespit kuralıyla gelir (40 PostgreSQL/sistem + 14 MongoDB) ve admin-tanımlı bildirimsel bir custom-rule motoruyla. Her kuralın ne yakaladığı, önem seviyesi ve lisans katmanı aşağıda.
Critical · Warning · Info Katman: temel (her zaman açık) · gelişmiş (advanced_analytics lisansı)
Tespit nasıl çalışır
Ajan wire protokolünü yakalar (eBPF uprobe satır-içi, ya da AF_PACKET ağ yakalama / off-host toplayıcı), her ifadeyi bir AST'ye ayrıştırır (ifade türü, okunan/yazılan tablolar, kolonlar, WHERE yüklemleri, fonksiyon çağrıları) ve her kuralı bu ayrıştırılmış akışa karşı değerlendirir — sorgular, bind parametreleri, sonuç satırları ve hatalar. MongoDB için OP_MSG komutları (sıkıştırılmış dahil) fiil + koleksiyon + filtre şekline ayrıştırılır.
Yerleşik kurallar
Enjeksiyon
5 | sql_injection | crit | basic | Zincirli sorgular (; ile), UNION tabanlı enjeksiyon ve WHERE totolojileri (1=1, 'a'='a'). |
| jsonb_filter_bypass | warn | advanced | Boş kapsayıcıya karşı JSONB @> içerme — her zaman doğru olan filtre atlatması. |
| hibernate_native_query_marker | info | advanced | ORM native-query yorum işaretleri — ORM katmanından kaçan ham SQL'i envanterler (enjeksiyon yüzeyi). |
| mongo_where_injection Mongo | crit | basic | Filtrelerde $where sunucu-taraflı JavaScript (NoSQL enjeksiyonu). |
| mongo_js_execution Mongo | crit | basic | eval / mapReduce sunucu-taraflı JavaScript çalıştırma. |
Keşif
4 | system_catalog_recon | crit | advanced | Sistem kataloğu okumaları; kimlik/rol katalogları (pg_shadow, pg_authid) Kritik seviyededir. |
| large_object_read | warn | basic | Doğrudan pg_largeobject okuması — lo_* izin kontrollerini atlar. |
| mongo_unfiltered_read Mongo | warn | basic | Filtresiz find / count / distinct. |
| mongo_enumeration Mongo | info | basic | listDatabases / listCollections numaralandırma. |
Sızdırma
9 | excessive_data_export | warn | advanced | Etkin satır filtresi olmayan SELECT * (CTE ve alt sorgu farkındalıklı). |
| exfil_direct | warn | advanced | COPY TO, pg_read_file, pg_read_binary_file, pg_ls_dir, lo_export, lo_get, lo_put. |
| exfil_byte_volume | warn | advanced | Bir pencerede eşiği aşan kümülatif sonuç-byte hacmi — yavaş sızdırma. |
| exfil_time_pattern | warn | advanced | Düzenli aralıklı tekrarlı sorgulama (beaconing / zamanlı kazıma). |
| dblink_usage | warn | advanced | dblink() ile veritabanları arası erişim — yanal hareket ve SSRF yüzeyi. |
| foreign_data_access | crit | advanced | FDW yüzeyi: CREATE SERVER / USER MAPPING, foreign table, file_fdw dosya okuma. |
| mongo_unfiltered_delete Mongo | crit | basic | Boş filtreyle delete — koleksiyon-geneli yıkım. |
| mongo_unfiltered_update Mongo | crit | basic | Boş filtreyle update — koleksiyon-geneli değişiklik. |
| mongo_excessive_data_export Mongo | warn | basic | Koleksiyon-geneli okuma/dışa-aktarma desenleri. |
Uyumluluk / KVKK
5 | pii_content | warn | basic | Sorgu literalleri, bind parametreleri veya sonuç satırlarında PII (kimlik no, kart, e-posta…). |
| turkish_pii | crit | basic | KVKK Türk PII: TCKN, IBAN, GSM, plaka — geçerlilik kontrolleriyle (TCKN sağlaması). |
| ozel_nitelikli_veri_access | crit | basic | KVKK özel nitelikli (sağlık, din, biyometrik…) kişisel veri erişimi. |
| sensitive_column_read | warn | basic | Operatörce etiketlenmiş hassas kolonlara dokunan okumalar (yapılandırılabilir liste). |
| mongo_pii_in_response Mongo | warn | basic | Yanıt belgelerinde PII desenleri. |
Yetki
9 | role_privilege_escalation | crit | advanced | CREATE/ALTER ROLE SUPERUSER / CREATEROLE / BYPASSRLS (kritik); REPLICATION (uyarı). |
| role_impersonation | warn | advanced | Yüksek yetkili bir role SET SESSION AUTHORIZATION / SET ROLE. |
| priv_esc_chain | crit | advanced | Oturum penceresinde ilişkilendirilen çok adımlı yetki yükseltme zincirleri. |
| dangerous_grant | crit | basic | pg_execute_server_program / pg_read_all_data… GRANT'ı (kritik); GRANT TO PUBLIC (uyarı). |
| ddl_by_non_admin | crit | basic | Yapılandırılmış admin izin listesi dışındaki bir kullanıcının DDL çalıştırması. |
| security_definer_function | warn | advanced | CREATE FUNCTION … SECURITY DEFINER — kalıcı yetki yükseltme yüzeyi. |
| dangerous_extension | crit | advanced | Güvenilmeyen dilde CREATE EXTENSION (plpython3u, plperlu…). |
| mongo_auth_bypass Mongo | crit | basic | Hassas alanlarda karşılaştırma-operatörü enjeksiyonu ({password:{$ne:""}}). |
| mongo_privileged_op Mongo | crit | basic | createUser / dropUser / rol atamaları / createRole … |
Hizmet Reddi (DoS)
6 | resource_abuse | warn | basic | Backend'i durduran / satır-byte patlatan primitifler: pg_sleep, generate_series bombaları. |
| cartesian_product | warn | basic | Filtresiz çok-tablolu kartezyen çarpımlar. |
| unbounded_recursive_cte | warn | basic | Üst düzey LIMIT olmadan WITH RECURSIVE. |
| redos | warn | basic | Felaket geri-izlemeli regex operandları (iç içe niceleyiciler). |
| lock_abuse | warn | basic | Açık LOCK TABLE … IN ACCESS EXCLUSIVE MODE. |
| failed_login_burst | crit | basic | Kayan pencerede N kimlik doğrulama hatası (varsayılan 60sn'de 5). |
DDL / Kalıcılık
7 | dangerous_ddl | crit | basic | COPY FROM/TO PROGRAM (uzaktan kod çalıştırma), güvenilmeyen dilde CREATE FUNCTION, riskli DDL. |
| trigger_backdoor | warn | advanced | CREATE EVENT TRIGGER — DDL ile tetiklenen kalıcılık. |
| audit_tamper | crit | advanced | Loglama/replikasyonda ALTER SYSTEM; archive_command / *_preload_libraries (kritik). |
| mongo_destructive_command Mongo | crit | basic | drop, dropDatabase, dropIndexes, renameCollection, dropAll*. |
| mongo_admin_command Mongo | warn | basic | replSet* / shard / fsync / compact küme yönetimi. |
| mongo_profiling_change Mongo | warn | basic | Profil-seviyesi değişiklikleri (denetim-izi kurcalama). |
| mongo_session_kill Mongo | warn | basic | killSessions / killOp — oturum/işlem sonlandırma. |
Anomali
5 | off_hours_query | info | basic | Yapılandırılmış mesai saatleri penceresi dışındaki etkinlik. |
| bulk_delete | crit | basic | WHERE olmadan DELETE (tam tablo silme); tablolar izin listesine alınabilir. |
| large_result_set | info | basic | Alışılmadık derecede çok satır döndüren tek bir sorgu. |
| ueba_anomaly | crit | advanced | Varlık-başına davranışsal temel: hız/tablo/byte/mesai-dışı/yazma-oranı/yeni-tablo üzerinde EWMA + sağlam z-skor. |
| ueba_peer_anomaly | crit | advanced | Uygulama grubuna karşı akran-grubu aykırı değeri (medyan + MAD sağlam istatistik). |
Denetim
4 | login_audit | info | basic | Giriş-başına denetim kaydı: login_success (Info) / login_failed (Warning), kullanıcı/db/IP ile. |
| query_error | info | basic | SQLSTATE + mesaj ile başarısız ifadeler (izin-reddi vb. Warning). |
| clock_anchor_skew | warn | basic | Ajan saati DB / konsola göre 5 dakikayı aşınca uyarı (denetim-zamanı bütünlüğü). |
| framer_desync_burst | warn | advanced | Wire-protokol desync patlamaları — yakalama-bütünlüğü / atlatma sinyali. |
Custom (özel) kurallar
Yerleşiklerin ötesinde, adminler konsolda bildirimsel özel kurallar tanımlar (Rules → Custom rules). Bunlar heartbeat kanalıyla ajanlara iletilir (sürüm-korumalı, yeniden başlatma yok) ve yerleşik kurallarla aynı ayrıştırılmış akışta değerlendirilir. Kod çalıştırma YOK: eşleşme tamamen bildirimseldir ve regex'ler doğrusal-zamanlı (RE2-sınıfı) bir motor kullanır — bir özel kural ajanı ReDoS ile kilitleyemez.
{
"id": "crown_jewel_read",
"severity": "critical", // info | warning | critical
"db_engine": "pg", // pg | mongo
"enabled": true,
"match": {
"statement_kinds": ["Select"],
"tables_regex": "^payroll_",
"columns_regex": "salary|iban",
"command_regex": "", // raw-SQL escape hatch
"user_in": [],
"user_not_in": ["app_readonly"],
"require_no_where": false
},
"message_template": "payroll read: {kind} on {tables} by {user}",
"rate": { "count": 10, "window_secs": 60, "group_by": "user" }
}
Alanlar
| id | Kararlı kural kimliği; tespitlerde rule_id olarak görünür; yerleşiklerle aynı şekilde host/grup/global kapatılabilir. |
| severity | info | warning | critical (warn / crit takma adları; başka her şey info'ya düşer). |
| db_engine | pg (ayrıştırılmış SQL akışı) veya mongo (ayrıştırılmış MongoDB komut akışı). |
| enabled | false ise tanım derlenmez. |
| match | Eşleşme koşulları (VE anlamı). Boş nesne her ifadeyle eşleşir. |
| message_template | Tespit mesajı; aşağıdaki yer tutucular. |
| rate | Varsa: penceredeki eşleşme sayısı eşiği. |
Eşleşme koşulları (VE — mevcut her koşul sağlanmalı)
Boş bir match her ifadeyle eşleşir — her zaman en az bir ekseni kısıtlayın.
| statement_kinds | Ayrıştırılmış ifade türü (Select, Insert, Update, Delete, Copy, CreateRole, AlterRole, Grant). Boş = herhangi. |
| tables_regex | İfadenin okuduğu veya yazdığı herhangi bir tablo. |
| columns_regex | İfadenin okuduğu herhangi bir kolon. |
| command_regex | Ham SQL metni — AST alanları yetmeyince kaçış kapısı. |
| user_in / user_not_in | Oturum kullanıcısı izin / red (tam eşleşme). |
| require_no_where | Yalnızca WHERE yüklemi OLMAYAN ifadelerde tetiklenir (tam-tablo şekli). |
| time_window | Kuralı bir UTC zaman penceresine sınırlar: {start, end (HH:MM), negate, days}. start>end gece-aşımı; negate pencere DIŞINDA eşleşir; days Mon=0..Sun=6. Yoksa = her zaman. |
MongoDB (db_engine: "mongo")
command_regex → komut fiili, tables_regex → koleksiyon, require_no_where → filtre belgesi yok. Diğer match alanları uygulanmaz.
Mesaj şablonu yer tutucuları
{kind} · {tables} · {columns} · {user}
Hız (rate)
rate ile kural yalnızca window_secs içinde ≥ count kez eşleştiğinde tetiklenir (kayan pencere). group_by:"user" kullanıcı-başına pencere tutar; aksi halde geneldir.
Güvenlik
Geçersiz regex o kuralı tümüyle atlar (loglanır) — asla çökme veya yarı-eşleşme olmaz. Önem takma adları warn/crit; bilinmeyen → info. Kapsam (host/grup/global aç-kapa) ve alarm, yerleşik kurallarla birebir aynıdır.