letsencrypt / boulder

An ACME-based certificate authority, written in Go.
Mozilla Public License 2.0
5.22k stars 608 forks source link

ratelimits: improve disabled limit handling #7803

Closed jsha closed 2 weeks ago

jsha commented 2 weeks ago

In the FailedAuthorizations limits, there was code that intentionally ignored errLimitDisabled errors (errors.Is(err, errLimitDisabled)). However, that that resulted in those functions later using a returned limit value that was invalid (i.e. its zero value). That happened to trigger some later checks in validateTransaction. Specifically this check failed:

    if txn.cost > txn.limit.Burst {
    // error

When txt.limit.Burst is zero, this will always fail.

This problem doesn't really show up in prod, where all the limits are configured. But it showed up in tests, specifically TestPerformValidation_FailedValidationsTriggerPauseIdentifiersRatelimit, where the limits are constructed using a simplified config that leaves most of them disabled.

In this change, I tried to make handling of errLimitDisabled more consistent, and always return an allow-only transaction as early as possible instead of falling through the error condition.

Where that wasn't possible, I used a boolean to record whether the result of builder.getLimit() was valid before referencing any of its fields.

I also added some "shouldn't happen" errors to catch this problem earlier if it recurs.

I removed some "skip disabled limit" comments because those say "what the code does" (which the code also says), not "why the code does it".

Fixes the test failures in #7797.