Skip to content

Security: Use timing-safe comparison for webhook signatures #32

@coderabbitai

Description

@coderabbitai

Description

Currently, the webhook signature validation in src/app/api/webhook/route.ts uses a simple string equality check:

if (signature !== expectedSignature) {
  return NextResponse.json({ error: "Invalid signature" }, { status: 401 });
}

This approach is vulnerable to timing attacks, where attackers can potentially determine the expected signature by measuring response times.

Recommendation

Replace the string comparison with a timing-safe comparison using crypto.timingSafeEqual:

const signatureBuffer = Buffer.from(signature || "", "hex");
const expectedSignatureBuffer = Buffer.from(expectedSignature, "hex");
if (
  signatureBuffer.length !== expectedSignatureBuffer.length ||
  !crypto.timingSafeEqual(signatureBuffer, expectedSignatureBuffer)
) {
  return NextResponse.json({ error: "Invalid signature" }, { status: 401 });
}

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status

    🎫 Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions