Skip to content

🔒 fix: use timing-safe comparison for webhook authentication - #93

Open
Sparkier wants to merge 2 commits into
mainfrom
security/timing-safe-webhook-auth-7334669684848365334
Open

🔒 fix: use timing-safe comparison for webhook authentication#93
Sparkier wants to merge 2 commits into
mainfrom
security/timing-safe-webhook-auth-7334669684848365334

Conversation

@Sparkier

@Sparkier Sparkier commented Aug 1, 2026

Copy link
Copy Markdown
Owner

🎯 What: Fixed a timing attack vulnerability in webhook authentication checks by replacing the standard inequality operator (!==) with a timing-safe string comparison function (timingSafeEqual from node:crypto).

⚠️ Risk: The previous implementation used standard string comparison to verify the Authorization header against secret keys. Standard string comparison returns false as soon as it encounters a mismatched character. An attacker could exploit this by repeatedly sending requests with slightly different tokens and measuring the response time. By observing which character guesses take slightly longer (because they match and the comparison proceeds to the next character), they could theoretically deduce the secret key character by character, leading to unauthorized access to the webhooks.

🛡️ Solution:

  • Added a safeCompare utility function in src/lib/utils.ts that safely handles string length differences and null values, and uses node:crypto's timingSafeEqual to perform the actual comparison in constant time.
  • Updated the authentication checks in src/routes/api/newsletter/daily-digest/+server.ts, src/routes/api/webhooks/post/+server.ts, and src/routes/api/webhooks/google-sheets/+server.ts to use this new safeCompare function.
  • This ensures that the time it takes to compare the tokens is independent of how many characters match, mitigating the timing attack vulnerability while maintaining functional equivalence.

📊 Coverage: All existing test suites pass.
Result: Webhook endpoints are now secure against timing attacks.


PR created automatically by Jules for task 7334669684848365334 started by @Sparkier

Co-authored-by: Sparkier <5690524+Sparkier@users.noreply.github.com>
@vercel

vercel Bot commented Aug 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
vis-positions Canceled Canceled Aug 1, 2026 11:29am

@google-labs-jules

Copy link
Copy Markdown
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

Co-authored-by: Sparkier <5690524+Sparkier@users.noreply.github.com>
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.

1 participant