SentrySentry
Arquitetura

Níveis de Risco e Vereditos

Score, níveis, pesos de sinais, policy e escalada de reincidentes

Níveis de Risco e Vereditos

O scorer (pipeline.rs) soma os pesos dos Signals produzidos por regras, heurísticas, trackers e forks em um risk_score (0–100) e o mapeia para um RiskLevel. A VerdictPolicy transforma o nível no verdict final, que pode ser sobreposto por policy e pela escalada de reincidentes.

Score → nível → verdict

ScoreLevelCor (TUI)Verdict default ([policy])
0–9Infocinzaallow
10–29Lowazulallow
30–49Mediumamarelorate_limit
50–74Highlaranjachallenge
75–100Criticalvermelhoblock
  • Os buckets de nível são fixos (dashboards estáveis); o verdict por nível é configurável em [policy] (info/low/medium/high/ critical), e overrides ordenados [[policy.override]] (DSL match → verdict) vencem por primeiro match.
  • Regras com short-circuit entram com score fixo: Block = 100, Challenge = 50, RateLimit = 30, Quarantine = 40 (process).
  • A soma é capada em 100 e ganha bônus de repetição em janela (repetition_window_secs, 60 s) quando o mesmo IP repete sinais.

Pesos default por sinal

Todo peso é overridável em [scorer.weights] pela chave do sinal (ex.: sql_injection = 80). Valores default verificados no código:

SinalPesoOrigem
log4shell80heuristics.rs
rce / cmd injection70heuristics
sql_injection60heuristics
upload_polyglot60analysis.rs (F10)
lfi50heuristics
known_bad_ip50reputation.rs
upload_executable50analysis.rs (F10)
suspicious_login_success45behavior.rs
xss45heuristics
path_traversal40heuristics
credential_stuffing40behavior.rs
bad_crawler40heuristics
upload_type_mismatch30analysis.rs (F10)
upload_disallowed30analysis.rs (F12)
sensitive_path30heuristics
directory_brute_force30behavior.rs
tcp_scanner30heuristics (fingerprint SYN)
auth_brute_force35behavior.rs
scan_behavior35scan.rs
spoofed_bot35botverify.rs (F7.7)
random_scan25scan.rs
upload_flood25analysis.rs (F10)
anomalous_payload (ONNX)25onnx_model.rs ([ai] signal_weight)
protocol_violation25analysis.rs (F9; schemas sobrepõem por policy)
vpn_proxy20reputation.rs
tls_sni_mismatch20analysis.rs (F8)
upload_oversize20analysis.rs (F12)
scan_attack_correlation20correlation.rs (F3.10)
tor_exit_node15reputation.rs
promiscuous_scanner10reputation.rs (F3.10)
suspicious_ua / UA vazio10heuristics
method_not_allowed10pipeline.rs (validador de rotas)
unknown_route8pipeline.rs
llm_maliciousscore × confidencefork LLM (F3.5)
external_reputationescalado pelo abuseConfidenceScorelookup externo (F7.5)
posture_advisory0 (travado)posture.rs (F11)

A nuance do PostureAdvisory (F11)

Advisories de postura descrevem o site protegido (headers de segurança ausentes na resposta do upstream), nunca o visitante. O peso é a constante POSTURE_ADVISORY_WEIGHT = 0 e o weight_for retorna 0 antes de consultar [scorer.weights] — nenhuma config transforma advisory em enforcement. O signal aparece em dashboards, métricas e sentry posture, mas nunca altera score, verdict ou webhook.

Escalada de reincidentes (F2.12)

Todo evento com verdict final ≠ Allow registra um strike no OffenderTracker do IP. Strikes expiram em window_secs (default 7 dias — sobrevive ao TTL de 24 h das regras de edge). A escalada só eleva verdict:

  • challenge_at (default 3) strikes → no mínimo Challenge.
  • block_at (default 5) strikes → Block.
  • persist = true espelha strikes no ip_state (Postgres) e faz pre-warm no startup — o reincidente volta do TTL da edge e é re-bloqueado no primeiro evento violador.

Allow nunca registra strike (sem ratchet contra tráfego benigno).

Guardas que sobrepõem tudo

  • Trusted IPs (F7.2): IPs em [real_ip] trusted_ips recebem Allow imediato e são imunes até a rescore_from — o guard "você não pode se trancar fora".
  • Shadow IPs: Block/Quarantine são rebaixados para Challenge (cap_shadow) — analisa e loga tudo, nunca bane.
  • Blacklist: IP na [real_ip] blacklist leva Block (score 100) antes de qualquer detector.

Correlação scan→ataque cross-IP (F3.10)

Padrão "shot calling" observado entre nós que observam a mesma superfície: um scan (sweep 404, SYN de masscan/zmap, …) de um IP "limpo" seguido de um exploit/brute-force de outro IP do mesmo /24 (IPv4), /64 (IPv6) ou ASN dentro da janela emite ScanAttackCorrelation (peso 20) — um agravador do ataque, nunca um detector isolado. SYNs capturados pelo source tcp alimentam a mesma janela que sweeps HTTP.

[correlation]
enabled = true
window_secs = 900           # 15 min

Junto vem a taxonomia de scanners como tiers de reputação: authorized (scanner contratado — sem sinal; confie com reputation = "authorized" → allow) e promiscuous (publica recon para qualquer um consultar → PromiscuousScanner, peso 10 — scanner que publica recon para qualquer um não é benigno).

On this page