Skip to content

Use secure_compare for hmac (for Ruby 3+)#357

Open
cburnham-academia wants to merge 2 commits into
Adyen:mainfrom
cburnham-academia:cburnham/secure_compare
Open

Use secure_compare for hmac (for Ruby 3+)#357
cburnham-academia wants to merge 2 commits into
Adyen:mainfrom
cburnham-academia:cburnham/secure_compare

Conversation

@cburnham-academia
Copy link
Copy Markdown

Uses the OpenSSL secure_compare to prevent timing attacks against the hmac signature

Description
While implementing webhooks, I noticed the Ruby library did not use a secure_compare operation to validate the HMAC. This makes a timing attack possible where an attacker could measure how long the response took to deduce how many bytes of the hmac they got correct.

This is an admittedly difficult flaw to exploit on its own - forging webhooks would require a very motivated attacker to discover a user's adyen endpoints, breach the username and password, and create a plausible webhook for a transaction, before finally brute forcing the endpoint with different signatures. Since you don't recommend validating in the initial receipt of the webhook, it would be difficult for the attacker to get any feedback on timing.

Tested scenarios
I validated that spec/utils/hmac_validator_spec.rb still passes, which should be a good indicator that hmac validation continues to work. There doesn't appear to be a good way to create a test that validates there's not a timing attack, so I did not add any new tests.

Uses the OpenSSL secure_compare to prevent timing attacks against the hmac signature
@cburnham-academia cburnham-academia requested review from a team as code owners March 23, 2026 21:46
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly improves the security of HMAC signature validation within the webhook processing logic. By adopting OpenSSL.secure_compare, it effectively mitigates the risk of timing attacks, ensuring that the comparison of HMAC signatures takes a constant amount of time regardless of the input, thus preventing attackers from deducing signature bytes based on response times.

Highlights

  • Enhanced Security for HMAC Validation: Replaced standard equality checks (==) with OpenSSL.secure_compare for HMAC signatures in webhook validation, preventing potential timing attacks.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request correctly addresses a timing attack vulnerability by replacing standard string comparison with OpenSSL.secure_compare for HMAC validation. This is an important security improvement. However, the current implementation introduces a critical issue where a nil signature value, which can occur with invalid webhook requests, will cause a TypeError and crash the process. This could be exploited for a denial-of-service attack. I've provided suggestions to fix this by ensuring the signatures are valid strings before they are compared.

Comment thread lib/adyen/utils/hmac_validator.rb Outdated
Comment thread lib/adyen/utils/hmac_validator.rb Outdated
Also adds a test that demonstrated the exception that was occurring.
@sonarqubecloud
Copy link
Copy Markdown

@gcatanese
Copy link
Copy Markdown
Contributor

@cburnham-academia Thank you for your contribution 🎊

It seems this doesn't work on Ruby 2.7, which we are planning to drop very soon. We'll keep this PR open (it is a good improvement, thank you!) so we can merge later when Ruby 2.7 is no longer supported.

@gcatanese gcatanese changed the title Use secure_compare for hmac Use secure_compare for hmac (for Ruby 3+) Apr 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants