7.5
CWE
400
Advisory Published
Updated

GHSA-9c5w-9q3f-3hv7

First published: Tue May 07 2024(Updated: )

Minder's `HandleGithubWebhook` is susceptible to a denial of service attack from an untrusted HTTP request. The vulnerability exists before the request has been validated, and as such the request is still untrusted at the point of failure. This allows an attacker with the ability to send requests to `HandleGithubWebhook` to crash the Minder controlplane and deny other users from using it. One of the first things that `HandleGithubWebhook` does is to validate the payload signature. This is done by way of the internal helper `validatePayloadSignature`: https://github.com/stacklok/minder/blob/ee66f6c0763212503c898cfefb65ce1450c7f5ac/internal/controlplane/handlers_githubwebhooks.go#L213-L218 `validatePayloadSignature` generates a reader from the incoming request by way of the internal helper `readerFromRequest`: https://github.com/stacklok/minder/blob/ee66f6c0763212503c898cfefb65ce1450c7f5ac/internal/controlplane/handlers_githubwebhooks.go#L337-L342 To create a reader from the incoming request, `readerFromRequest` first reads the request body entirely into memory on line 368: https://github.com/stacklok/minder/blob/ee66f6c0763212503c898cfefb65ce1450c7f5ac/internal/controlplane/handlers_githubwebhooks.go#L367-L377 This is a vulnerability, since an HTTP request with a large body can exhaust the memory of the machine running Minder and cause the Go runtime to crash Minder. Note that this occurs before Minder has validated the request, and as such, the request is still untrusted. To test this out, we can use the existing `TestHandleWebHookRepository` unit test and modify the HTTP request body to be large. To do that, change these lines: https://github.com/stacklok/minder/blob/ee66f6c0763212503c898cfefb65ce1450c7f5ac/internal/controlplane/handlers_githubwebhooks_test.go#L278-L283 ... to these lines: ```go packageJson, err := json.Marshal(event) require.NoError(t, err, "failed to marshal package event") maliciousBody := strings.NewReader(strings.Repeat("1337", 1000000000)) maliciousBodyReader := io.MultiReader(maliciousBody, maliciousBody, maliciousBody, maliciousBody, maliciousBody) _ = packageJson client := &http.Client{} req, err := http.NewRequest("POST", fmt.Sprintf("http://%s", addr), maliciousBodyReader) require.NoError(t, err, "failed to create request") ``` Then run the unit test again. WARNING, SAVE ALL WORK BEFORE DOING THIS. On my local machine, this causes the machine to freeze, and Go finally performs a sigkill: ``` signal: killed FAIL github.com/stacklok/minder/internal/controlplane 30.759s FAIL ```

Affected SoftwareAffected VersionHow to fix
go/github.com/stacklok/minder<0.0.48
0.0.48

Never miss a vulnerability like this again

Sign up to SecAlerts for real-time vulnerability data matched to your software, aggregated from hundreds of sources.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2024 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203