heygrc
Antwoord

Hoe haal ik een door de gebruiker opgegeven URL of webhook op zonder SSRF?

het heygrc team

Valideer het doel voordat je het ophaalt: vereis https, los de host op en wijs private, interne en link-local adressen (inclusief cloudmetadata-eindpunten) af. Gebruik bij voorkeur een allowlist als de bestemmingen bekend zijn en volg geen redirects blindelings. Server-side request forgery is een inputvalidatieprobleem (NIST 800-53 SI-10), en de controle bevindt zich in de code die het verzoek doet.

  1. Valideer het doel

    Sta alleen de schema's toe die je bedoelt (meestal https) en wijs adressen in private, loopback, link-local en metadatabereiken af. Valideer het opgeloste adres op het moment van verbinding, niet alleen de URL vooraf, omdat DNS anders kan oplossen tussen een voorafgaande controle en het daadwerkelijke verzoek (DNS rebinding).

  2. Gebruik bij voorkeur een allowlist

    Als de set bestemmingen bekend is (een vaste lijst met partner-eindpunten), gebruik dan een allowlist in plaats van willekeurige URL's te accepteren. Hoe smaller de input die je accepteert, hoe minder er mis kan gaan.

  3. Volg geen redirects blindelings

    Een redirect kan een gevalideerde publieke URL naar een intern adres sturen bij de volgende hop. Valideer opnieuw bij elke redirect of schakel het volgen van redirects uit voor door gebruikers opgegeven doelen.

webhooks/send.ts+2 -1
async function send(url, payload) {-  return fetch(url, { method: 'POST', body: payload })+  // safeFetch valideert het OPGELOSTE adres op het moment van verbinding+  return safeFetch(url, { method: 'POST', body: payload, allowRedirects: false })}
heygrcNIST 800-53 SI-10

Het valideren van het opgeloste adres op het moment van verbinding, niet alleen de URL vooraf (wat DNS rebinding kan omzeilen), voorkomt dat een speciaal ontworpen doel interne services bereikt.