{"id":"CVE-2026-70658","summary":"pay-rails/pay: non-constant-time HMAC comparison in Paddle Billing webhook signature verifier","details":"Pay is a payments engine for Ruby on Rails 6.0 and higher. Prior to 11.6.2, Pay::Webhooks::PaddleBillingController#valid_signature? in app/controllers/pay/webhooks/paddle_billing_controller.rb compares the computed 64-character SHA-256 HMAC with the attacker-controlled h1 token from the Paddle-Signature header using Ruby String#==. An unauthenticated remote attacker who can repeatedly submit requests to /pay/webhooks/paddle_billing and obtain sufficiently precise timing measurements can infer matching digest prefixes and recover a valid signature. A forged accepted webhook is enqueued through Pay::Webhooks::ProcessJob and can cause a host application to update billing state, provision paid features, record refunds, or trigger customer notifications. This issue is fixed in version 11.6.2.","aliases":["GHSA-mjgf-xj26-9qf9"],"modified":"2026-09-16T03:47:20.365894611Z","published":"2026-09-14T17:14:57.207Z","database_specific":{"cwe_ids":["CWE-208"],"osv_generated_from":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/70xxx/CVE-2026-70658.json","cna_assigner":"GitHub_M"},"references":[{"type":"WEB","url":"https://github.com/pay-rails/pay/releases/tag/v11.6.2"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/70xxx/CVE-2026-70658.json"},{"type":"ADVISORY","url":"https://github.com/pay-rails/pay/security/advisories/GHSA-mjgf-xj26-9qf9"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-70658"},{"type":"FIX","url":"https://github.com/pay-rails/pay/commit/ba6494109d88209fba2a4df2d9d6373fe81ed805"}],"affected":[{"ranges":[{"type":"GIT","repo":"https://github.com/pay-rails/pay","events":[{"introduced":"0"},{"fixed":"ba6494109d88209fba2a4df2d9d6373fe81ed805"},{"fixed":"0701305bb142aadc42e259203aa438bc5969a983"}],"database_specific":{"extracted_events":[{"introduced":"0"},{"fixed":"11.6.2"}],"source":["AFFECTED_FIELD","REFERENCES"]}}],"versions":["v11.6.0","v11.5.0","v11.4.3","v11.4.2","v11.4.1","v11.4.0","v11.3.1","v11.3.0","v11.2.3","v11.2.2","v11.2.1","v11.2.0","v11.1.3","v11.1.2","v11.1.1","v11.1.0","v11.0.1","v10.1.5","v10.1.4","v10.1.3","v10.1.2","v10.1.1","v10.1.0","v10.0.3","v10.0.2","v10.0.1","v10.0.0","v9.0.1","v9.0.0","v8.3.0","v8.2.2","v8.2.1","v8.2.0","v8.1.0","v8.0.0","v7.3.0","v7.2.1","v7.1.1","v7.1.0","v7.0.0","v6.8.1","v6.8.0","v6.7.2","v6.7.1","v6.7.0","v6.6.1","v6.6.0","v6.5.0","v6.4.0","v6.3.4","v6.3.3","v6.3.2","v6.3.1","v6.3.0","v6.2.4","v6.2.3","v6.2.2","v6.2.1","v6.2.0","v6.1.2","v6.1.1","v6.1.0","v6.0.3","v6.0.2","v6.0.1","v6.0.0","v5.0.4","v5.0.3","v5.0.2","v5.0.1","v5.0.0","v4.2.1","v4.2.0","v4.1.1","v4.1.0","v4.0.4","v4.0.2","v4.0.1","v4.0.0","v3.0.24","v3.0.23","v3.0.22","v3.0.21","v3.0.20","v3.0.19","v3.0.18","v3.0.17","v3.0.16","v3.0.15","v3.0.14","v3.0.13","v3.0.12","v3.0.11","v3.0.10","v3.0.9","v3.0.8","v3.0.7","v3.0.6","v3.0.5","v3.0.4","v3.0.3","v3.0.2","v3.0.1","v3.0.0","v2.7.2","v2.7.1","v2.7.0","v2.6.11","v2.6.10","v2.6.9","v2.6.8","v2.6.3","v2.6.1","v2.6.0","v2.5.0","v2.4.4","v2.4.3","v2.4.2","v2.4.0","v2.3.1","v2.3.0","v2.2.2","v2.2.0","v2.1.3","v2.1.2","v2.1.1","v2.1.0","v2.0.3","v2.0.2","v2.0.1","v2.0.0","v1.0.0","v1.0.0.rc3","v1.0.0.rc2","v1.0.0.rc1","v1.0.0.beta5","v1.0.0.beta4","v1.0.0.beta3","v1.0.0.alpha3","v1.0.0.alpha2","0.0.2","0.0.1"],"database_specific":{"source":"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-70658.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"}]}