Fix CVE-2026-53510 and restore 2.17.0 cookie regressions
Fixed
- Fix CVE-2026-53510
Savon::Modelgenerated SOAP operation methods by interpolating operation names into Ruby source passed tomodule_eval. An attacker who can control the operation names of a WSDL, can inject Ruby code that executes in the application process. This affects only the.all_operationsclass method provided bySavon::Modelto automatically register all operations provided by the WSDL. ConfiguringSavon::Modelwith trusted operation names via.operationsis safe. Thanks to @connorshea for securely disclosing this, providing a proof and a great report. :cookiesrequest option works again. The 2.17.0 transport refactor reimplemented cookie handling on top ofArray#map, which broke callers passing an object that responds to#cookiesand lost cookie-name de-duplication viaHTTPI::CookieStore. The HTTPI transport delegates toHTTPI::Request#set_cookiesagain, restoring both shapes.response.http.cookiesworks again. 2.17.0'sSavon::Transport::Responseonly exposedcode,headers, andbody. The HTTPI transport now returnsArray<HTTPI::Cookie>(matching 2.12.1). The Faraday transport returnsHash<String, String>so Faraday callers do not need HTTPI types.:attachmentsnow works with a user-supplied:xmlenvelope (#761). Multipart support shipped in 2.13.0 but only wrapped envelopes Savon built itself. When a caller passed their own:xml, attachments were silently dropped.
Added
- Faraday
:cookiesoption accepts aStringorHash. Strings are used verbatim, Hashes are formatted as"name=value; name=value". Round-trippable with the Faraday response shape. - Three Nori response-parsing options exposed as Savon globals:
:empty_tag_value(defaultnil),:convert_dashes_to_underscores(defaulttrue), and:scrub_xml(defaulttrue). Defaults match Nori's own for backwards compatibility.
Changed
- Minimum Nori version is now
~> 2.7(was~> 2.4). Needed for the new parsing options (:empty_tag_valuearrived in Nori 2.6.0,:scrub_xmlin 2.7.0). The 2.5–2.7 series also brings fixes callers benefit from automatically: invalid byte sequences parse instead of raising, REXML no longer turns<inside CDATA into<,xs:date/xs:time/xs:dateTimetypecasting was corrected, and Nori stopped monkey-patchingStringandObject. - Faraday migration hints are now value-aware and verified. Each hint prints the caller's actual option value and spells out the full gem/require/setup where needed. Fixed several incorrect examples and added tests to verify every hint.
Deprecated
- Deprecated the global and local
:multipartoptions. They have been no-ops since v2.13.0. Specifically since commit 4e7ae5e. Savon detects multipart responses by checking theContent-Typeheader.
Security advisory: GHSA-mx5j-mp4f-g8jg
Changelog: https://github.com/savonrb/savon/blob/main/CHANGELOG.md
Commits: v2.17.1...v2.17.2