Build1 distinct publisher3 min readUpdated
A dev.to post, published twice by the same author, argues that switching off env and heapdump while leaving exposure.include set to the wildcard is worse than no policy. The subtraction backs it up.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Actuator has two knobs and they do not do the same job. Whether an endpoint is registered is set per endpoint; whether HTTP can reach it is set by `management.endpoints.web.exposure.include`, which since Spring Boot 2 resolves to `/health` and nothing else until someone changes it [2]. The criteria behind that default were drawn for development rather than production, which is the author's starting complaint [11]. The recipe under attack sets the exposure knob to the wildcard and then spends three lines arguing with the other one [5]. The ordering is what makes it fragile: the wildcard is evaluated against whatever is in the registry, so it stands as an instruction to publish endpoints nobody has read about yet [3][6]. The author's own comparison is the accurate one, a firewall that permits the ports you need rather than blocking the ones you have heard of [9].
Then do the subtraction. The post names five endpoints the asterisk sweeps in: `env`, `beans`, `configprops`, `heapdump`, `threaddump` [3]. The blocklist closes two of them, `env` and `heapdump`, and spends its third line on `shutdown`, which was not in that list at all [5]. That leaves `beans`, `configprops` and `threaddump` reachable [15]. A file that reads as hardening still serves three of the five endpoints its own author flagged, and one property line is what moved the app from a single exposed endpoint to the whole registry [16].
The two headline endpoints also fail differently. `/env` returns the PropertySource tree, and there is a filter made for it: `keys-to-sanitize` redacts by key name, so in the best case a leak degrades into a leak of names [7]. `/heapdump` has no key names to filter, because it is process memory serialised, and the post's argument is that live session tokens come out with it, putting a fetched dump in the same bracket as a token stolen through XSS [8].
On sourcing: this is one post by one author, published twice on dev.to, once in Spanish and once in English [17][1]. The English edition still carries the Spanish comments inside its code blocks [13], which is a fair sign the two are one text rather than two reports, so read it as an opinion with worked examples and not as corroboration. Both copies also stop before the allowlist snippet arrives [14]. The prescriptive half, meaning the endpoints this author would actually justify exposing, is not on the page. The direction of the default is, and that part survives without the snippet [10]. The reader likeliest to need it is the one holding an audit finding that named an endpoint [12], and that reader already has the properties file the subtraction applies to.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
management.endpoints.web.exposure.include=* exposes every registered endpoint, including env, beans, configprops, heapdump and threaddump.
The official Spring Boot Actuator documentation states that since Spring Boot 2, only /health is exposed over HTTP by default; the other endpoints exist but are not web-exposed until enabled with management.endpoints.web.exposure.include.
The documentation does warn about the asterisk, but in a section separate from the one showing how to enable endpoints, and copy-paste habits do not respect section boundaries.
The common recipe the author sees sets management.endpoint.env.enabled=false, management.endpoint.shutdown.enabled=false and management.endpoint.heapdump.enabled=false while leaving management.endpoints.web.exposure.include=*.
The hidden cost of that recipe is that it starts from total exposure and subtracts: every new endpoint Spring Boot adds in a future version, and every dependency that registers its own Actuator endpoint, stays exposed by default until someone finds out and adds it to the blacklist.
/env returns the full PropertySource tree, which in real configurations includes database credentials, tokens for external services and application secrets if management.endpoint.env.keys-to-sanitize was not set or the version's equivalent sanitization mechanism was not used.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Internally consistent configuration reasoning, no independent corroboration
The mechanics are checkable from the artifacts themselves: the wildcard snippet, the blocklist snippet and the allowlist baseline are quoted in full in both bodies, and the gap between them (beans, configprops and threaddump surviving the blocklist) follows from the post's own lists. But every assertion traces to one author on one platform, published twice. The documentation claim about Spring Boot 2 defaults is paraphrased without a version or section citation, the endpoint-risk matrix the author says he uses is referenced yet absent from the supplied text, and both bodies are truncated. No CVE, scan, incident or reproduction accompanies the /env and /heapdump leak claims.
No adoption evidence in supplied sources
The cluster contains no release, deployment, benchmark, incident, pricing or licensing event, and no usage disclosure. Prevalence statements ('what most tutorials show', 'the most common recipe I see', 'gets overlooked all the time') are the author's unquantified impressions, and no telemetry, scan or survey is offered. Dual publication of the same post by its author is distribution, not third-party uptake, so no adoption score can be responsibly assigned.
Rhetoric runs ahead of the modest, well-known underlying facts
Mildly overstated. The lede sells an unauthenticated secret leak on 'default configuration', while the same post concedes that only /health is web-exposed by default, so the failure requires an operator-added wildcard; the framing borrows alarm the defaults do not supply. 'Worse than having no strategy at all' is rhetorical escalation over a practice that at least removes the two highest-value endpoints. Prevalence is asserted without measurement, and the underlying advice (fail closed, allowlist, authenticate management paths) is long-standing rather than novel. The gap is not large, because the concrete subtraction the piece exhibits does hold and the recommended baseline is sound.
Search-driven personal-brand publishing, no visible commercial stake
Moderate and non-commercial. The piece is explicitly written to search intent ('when someone googles "actuator endpoints spring boot"'), cross-posted twice in two languages by the same author seconds apart to maximise reach on a community platform, and cross-links to the author's own material on sessions and digital identity. Those are audience-acquisition incentives that reward confident, alarming framing. Offsetting them: no vendor, product, sponsor or paid tool is promoted, the recommended fix is plain framework configuration, and the author flags the limits of his own guidance by calling the matrix rows guidelines rather than rules.
Low-stakes and checkable, but single-author and truncated
Confidence is limited by concentration rather than implausibility. One publisher, one author, two near-identical items, no external citation and truncated bodies mean nothing here is independently corroborated within the cluster. What raises confidence is that the load-bearing claims are configuration semantics a reader can verify directly against the framework, and the sharpest finding is arithmetic internal to the quoted snippets. The unresolved tension between the 'default configuration' lede and the stated /health-only default, plus the untranslated Spanish comments in the English edition, indicate light editorial control.
build
Three services you can delete: queue, cache and search in one Postgres1 distinct publisher
build
The proxy in your call path decides whether @Transactional does anything at all1 distinct publisher
build
The stopping problem: an LLM rewrite loop that converged on code javac rejected1 distinct publisher
build
A 27B Apache-2.0 model in 17GB makes local inference a wiring decision, not a demo1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
2 articles · August 23, 2026