What's new in v0.6.1
v0.6.1 is a hardening release. No public API break, no behavior change for already-clean inputs. The audit pass that started in 0.6.0 continues here with a security tightening across CORS, the CI ack TOML loader, the SARIF result body and the OTLP gRPC listener. Hot-path tightening lands across the detection and scoring stages, and dependencies are bumped to the latest patch lines.
Security hardening
- CORS
["*"]combined with[daemon.ack] api_keyis now rejected at config load instead of a startupWARN. Header-basedX-API-Keyauth is not blocked byallow_credentials = false, so wildcard CORS plus an API key let any browser origin replay a captured key. Operators that want wildcard CORS for development must explicitly unsetapi_key. acknowledgments::load_from_filerefuses to follow symlinks on the CI baseline TOML path, mirroring the daemon JSONL store discipline. Closes the "hostile collaborator plants a symlink in a CI runner working tree" vector.- SARIF
finding_to_resultstrips BiDi and invisible-format characters from the message body and logical locations, in addition to the ack metadata path that was already sanitized in 0.5.27. A hostile span emittingservice.name = "alice<RLO>@evil"no longer renders mirrored in GitHub or GitLab code-scanning UIs. - OTLP gRPC listener caps HTTP/2 concurrent streams at 256 per connection via tonic's
max_concurrent_streamsandconcurrency_limit_per_connection. Bounds the blast radius of a misbehaving client on non-loopback binds.
Performance: hot-path tightening
- Probe-before-allocate exemplar sanitization in
report::metrics::sanitize_exemplar_value(returnsCow<'_, str>). Trace IDs are almost always already valid hex and now skip the allocation on the hot path. chattydetection runs in a single pass over the trace's HTTP-out spans (count and indices collected together) instead of two iterations.serializeddetection sorts viasort_unstable_by_keyonu64end timestamps, faster than the stable variant with no observable difference downstream.- HTTP query-param
Vecis pre-sized from the ampersand count, capped at 100, eliminating the doubling-growth path on URLs with many parameters. - Avoidable-finding dedup
HashMapcapacity matches the avoidable-finding count instead of the total finding count, removing the over-allocation when most findings are slow or fanout.
Refactors
detect::n_plus_one::parse_timestamp_msis a thin adapter overcrate::time::parse_iso8601_utc_to_msinstead of a duplicate implementation. The sharedtime.rsmodule is now the single source of truth for civil-date arithmetic across the crate.default_regionis lowercased once at config load, mirroring the existingservice_regionsdiscipline so downstream resolvers no longer pay ato_ascii_lowercaseallocation per call.OtlpRejectReason::as_str,AckFailureReason::as_str,ScaphandreScrapeReason::as_strareconst fnmatching the pattern already in place onConfidence::as_strandFindingType::as_str.- OTLP span-index cap is named
MAX_SPANS_PER_RESOURCEinstead of two duplicated100_000literals inbuild_span_indexandbuild_scope_index. OtlpRejectReason::ALLfixed-size array exposes every variant for exhaustive pre-warming, keeping theMetricsState::newstartup loop drift-free.
Dependency bumps
opentelemetry-proto0.31 to 0.32 (addsKeyValue::key_strindexfor the OTel Profiling signal, three test sites updated to..Default::default()for forward compatibility).tonic0.14.5 to 0.14.6.tokio1.52.2 to 1.52.3.
Helm chart
charts/perf-sentinel 0.2.32 to 0.2.33, appVersion 0.6.0 to 0.6.1. The artifacthub.io/changes annotation surfaces the security and performance items on Artifact Hub.
Full Changelog: v0.6.0...v0.6.1