{"id":22322,"date":"2026-09-15T00:30:47","date_gmt":"2026-09-14T16:30:47","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-82438"},"modified":"2026-09-15T00:30:47","modified_gmt":"2026-09-14T16:30:47","slug":"cve-2026-82438","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-82438","title":{"rendered":"CVE-2026-82438 &#8211; Description\n\nThree separate mechanisms allowed a web page on an unrelated origin to read r"},"content":{"rendered":"<p>Description<\/p>\n<p>Three separate mechanisms allowed a web page on an unrelated origin to read responses that Storm&#8217;s HTTP<br \/>\ncomponents served to an authenticated user.<\/p>\n<p>The Logviewer reflected the request&#8217;s `Origin` header back in `Access-Control-Allow-Origin` while also<br \/>\nsending `Access-Control-Allow-Credentials: true`. The published security model documents a permissive<br \/>\n`Access-Control-Allow-Origin: *` posture as accepted, which is safe precisely because browsers refuse to<br \/>\nhonour `*` together with credentials; reflecting the concrete origin removes that protection.<\/p>\n<p>The shared CORS filter used by the UI, the Logviewer and DRPC was configured with a response header name<br \/>\nwhere an initialisation parameter name was expected. The container ignored the setting and applied its own<br \/>\ndefaults, which allow credentials.<\/p>\n<p>Finally, the UI and Logviewer wrapped API responses in a caller-supplied JSONP callback for every GET<br \/>\nrequest. A script element on any origin can load such a response, which bypasses the same-origin policy<br \/>\nentirely rather than negotiating it, and there was no way to turn the behaviour off.<\/p>\n<p>In each case the effect is that a page visited by an authenticated operator can read cluster, topology and<br \/>\nlog data on their behalf.<\/p>\n<p>Mitigation<\/p>\n<p>Upgrade to 3.1.0, where the Logviewer no longer reflects the request origin in a credentialed response, the<br \/>\nCORS filter is configured explicitly, and JSONP wrapping is governed by `ui.enable.jsonp`, which defaults to<br \/>\nfalse.<\/p>\n<p>Note that disabling JSONP is a behaviour change for tooling that passes a `callback` query parameter; such<br \/>\ntooling should be moved to ordinary JSON requests.<\/p>\n<p>Users who cannot upgrade immediately should place the UI, Logviewer and DRPC HTTP endpoints behind a reverse<br \/>\nproxy that strips `Access-Control-Allow-Origin` and `Access-Control-Allow-Credentials` from responses and<br \/>\nrejects requests carrying a `callback` parameter.<\/p>\n<p>Credit<\/p>\n<p>The ASF &#8212; found using Claude agents to study the security of open-source projects, validated and reported by Apache Storm.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Description<\/p>\n<p>Three separate mechanisms allowed a web page on an unrelated origin to read responses that Storm&#8217;s HTTP<br \/>\ncomponents served to an authenticated user.<\/p>\n<p>The Logviewer reflected the request&#8217;s <\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-22322","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/22322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}