CVE-2026-70658
Received Received - Intake

Timing Attack in Pay Ruby on Rails Payments Engine

Vulnerability report for CVE-2026-70658, including description, CVSS score, EPSS score, affected products, exploitability, helpful resources, and attack-flow context.

Publication date: 2026-09-14

Last updated on: 2026-09-14

Assigner: GitHub, Inc.

Description

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.

CVSS Scores

EPSS Scores

Probability:
Percentile:

Meta Information

Published
2026-09-14
Last Modified
2026-09-14
Generated
2026-09-14
AI Q&A
2026-09-14
EPSS Evaluated
N/A
NVD
EUVD

Affected Vendors & Products

Showing 3 associated CPEs
Vendor Product Version / Range
pay pay 11.6.2
pay-rails pay 11.6.2
pay-rails pay to 11.6.2 (exc)

Helpful Resources

Exploitability

CWE
CWE Icon
KEV
KEV Icon
CWE ID Description
CWE-208 Two separate operations in a product require different amounts of time to complete, in a way that is observable to an actor and reveals security-relevant information about the state of the product, such as whether a particular operation was successful or not.

Attack-Flow Graph

AI Quick Actions

Instant insights powered by AI
Executive Summary

This vulnerability is a timing attack on the signature verification in Pay, a Ruby on Rails payments engine. It allows an unauthenticated remote attacker to forge valid webhook signatures by measuring response times to infer matching digest prefixes. The flaw exists in the comparison of a computed SHA-256 HMAC with an attacker-controlled token using Ruby's String#== operator.

Detection Guidance

This vulnerability involves timing attacks on the Paddle billing webhook signature verification. Detect it by monitoring for unusual timing patterns in requests to /pay/webhooks/paddle_billing. Check logs for repeated requests with varying Paddle-Signature headers. Use network monitoring tools to inspect request timing and signature validation failures.

Impact Analysis

An attacker could exploit this to send forged webhooks to the affected application. This may cause the host app to incorrectly update billing state, provision paid features, record refunds, or trigger customer notifications without valid transactions occurring.

Compliance Impact

This vulnerability could lead to unauthorized changes in billing state or customer notifications, which may violate data integrity and confidentiality requirements under GDPR and HIPAA. For example, forged webhooks could improperly update user subscriptions or record refunds, potentially exposing or altering sensitive payment data.

Mitigation Strategies

Upgrade Pay to version 11.6.2 or later immediately to patch the timing attack vulnerability. If upgrading is not possible, implement constant-time comparison for signature verification to prevent timing attacks. Restrict access to /pay/webhooks/paddle_billing to trusted IPs if feasible.

Chat Assistant

Ask questions about this CVE
Hi! I’m here to help you understand CVE-2026-70658. Ask me anything about the vulnerability, its impact, or mitigation strategies.
0/70

EPSS Chart