You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fresh protected-source inspection at develop@622e5e6c3d534f230c390f10e3832efadfc01825 found that GET /api/cdc/status still assembles a broad operational inventory rather than a finite purpose-bound status contract.
CdcService.getStatus() currently exposes deployment-specific connector/topic/schema/table/slot/publication identifiers, while CdcController.status() additionally exposes the replica topic regex, replica table list, the raw ReplicationSlotProbe.probeConfiguredSlot() map, configured source descriptions, and registered source/target inventory. These values are not passwords, but they can reveal internal database object names, customer/tenant naming, Kafka topology, Debezium identifiers, connector capability inventory, and deployment structure. Issue #187 separately records that the CDC HTTP control plane currently lacks an accepted service-local authentication boundary, so ambient network reachability can turn this status payload into an information-disclosure surface.
PR #243 narrows Actuator health replication-slot details only; it does not change /api/cdc/status. PR #172 currently owns CdcController.java, PR #139 owns CdcService.java, and #243 owns the health-indicator path. Do not race those branches.
RCA
Immediate cause: the status endpoint builds its response by forwarding configuration/catalog/probe structures that were convenient for debugging.
Technical root cause: operator liveness/readiness/status semantics are coupled to deployment inventory discovery.
Control failure: controller/service tests prove the fields are returned, but no confidentiality contract limits the public status schema to finite low-cardinality, non-identifying fields.
Preferred after current writers clear — purpose-bound status projection. Keep finite operational state such as running, autoStart, supported source type/category, replica enabled/DDL enabled booleans, canonical-map enabled, and bounded success/failure counters. Replace raw probe/config/catalog structures with stable classifications/counts where they are necessary for operations.
Reject regex masking/truncation. Schema/table/topic/slot identifiers are semantically sensitive and can encode arbitrary customer naming; masking is incomplete and unstable.
No new secret, credential, dependency, external service, or cross-repository mutation is required for the narrow projection repair.
TDD acceptance
When the overlapping writer lanes are clear, add fail-first tests at the real service/controller response boundary using deliberately sensitive identifiers (for example tenant-like topic/schema/table/slot/publication names) and require that ordinary status output:
contains only a documented finite allowlist of purpose-bound fields;
does not emit connector name, topic prefix/pattern, schema/table include lists, slot/publication names, raw replication-slot maps, provider/plugin/LSN/error text, source/target IDs or arbitrary future probe/config fields;
keeps liveness/running state and finite counters required for operations;
cannot regress when ReplicationSlotProbe or connector capability maps gain new fields;
preserves standalone/MSA behavior and does not change CDC start/stop semantics;
regenerates exact-source CI/security/SBOM/SAST, non-vacuous owned-production coverage, current reviews and canonical traceability before protected integration.
Current classification / sequencing
known_gap / defer_until_trigger for source mutation because live PR #172 owns CdcController.java and live PR #139 owns CdcService.java; PR #243 separately owns the health boundary. Re-read all three exact heads/diffs after any integration/closure before choosing the smallest successor path. Waiting on this overlap never blocks other path-disjoint mightyETL work.
Buyer / acquisition risk
Fresh protected-source inspection at
develop@622e5e6c3d534f230c390f10e3832efadfc01825found thatGET /api/cdc/statusstill assembles a broad operational inventory rather than a finite purpose-bound status contract.CdcService.getStatus()currently exposes deployment-specific connector/topic/schema/table/slot/publication identifiers, whileCdcController.status()additionally exposes the replica topic regex, replica table list, the rawReplicationSlotProbe.probeConfiguredSlot()map, configured source descriptions, and registered source/target inventory. These values are not passwords, but they can reveal internal database object names, customer/tenant naming, Kafka topology, Debezium identifiers, connector capability inventory, and deployment structure. Issue #187 separately records that the CDC HTTP control plane currently lacks an accepted service-local authentication boundary, so ambient network reachability can turn this status payload into an information-disclosure surface.PR #243 narrows Actuator health replication-slot details only; it does not change
/api/cdc/status. PR #172 currently ownsCdcController.java, PR #139 ownsCdcService.java, and #243 owns the health-indicator path. Do not race those branches.RCA
Distinct remedies / feasibility
running,autoStart, supported source type/category, replica enabled/DDL enabled booleans, canonical-map enabled, and bounded success/failure counters. Replace raw probe/config/catalog structures with stable classifications/counts where they are necessary for operations.No new secret, credential, dependency, external service, or cross-repository mutation is required for the narrow projection repair.
TDD acceptance
When the overlapping writer lanes are clear, add fail-first tests at the real service/controller response boundary using deliberately sensitive identifiers (for example tenant-like topic/schema/table/slot/publication names) and require that ordinary status output:
ReplicationSlotProbeor connector capability maps gain new fields;Current classification / sequencing
known_gap / defer_until_triggerfor source mutation because live PR #172 ownsCdcController.javaand live PR #139 ownsCdcService.java; PR #243 separately owns the health boundary. Re-read all three exact heads/diffs after any integration/closure before choosing the smallest successor path. Waiting on this overlap never blocks other path-disjoint mightyETL work.