heygrc
Risposta

Come posso recuperare un URL o un webhook fornito dall'utente senza SSRF?

il team heygrc

Valida il target prima di recuperarlo: richiedi https, risolvi l'host e rifiuta gli indirizzi privati, interni e link-local (inclusi gli endpoint dei metadati cloud). Preferisci una lista consentita quando le destinazioni sono note e non seguire reindirizzamenti in modo acritico. Il server-side request forgery è un problema di validazione dell'input (NIST 800-53 SI-10) e il controllo risiede nel codice che effettua la richiesta.

  1. Valida il target

    Consenti solo gli schemi previsti (di solito https) e rifiuta gli indirizzi nelle fasce private, loopback, link-local e metadata. Valida l'indirizzo risolto al momento della connessione, non solo l'URL inizialmente, poiché il DNS può risolvere in modo diverso tra un controllo preventivo e la richiesta effettiva (DNS rebinding).

  2. Preferisci una lista consentita

    Se l'insieme delle destinazioni è noto (una lista fissa di endpoint partner), utilizzane una lista consentita invece di accettare URL arbitrari. Quanto più ristretto è l'input che accetti, tanto meno c'è da sbagliare.

  3. Non seguire reindirizzamenti in modo acritico

    Un reindirizzamento può inviare un URL pubblico validato a un indirizzo interno al prossimo hop. Rivalida a ogni reindirizzamento o disabilita il follow dei reindirizzamenti per i target forniti dall'utente.

webhooks/send.ts+2 -1
async function send(url, payload) {-  return fetch(url, { method: 'POST', body: payload })+  // safeFetch valida l'indirizzo RISOLTO al momento della connessione+  return safeFetch(url, { method: 'POST', body: payload, allowRedirects: false })}
heygrcNIST 800-53 SI-10

Validare l'indirizzo risolto al momento della connessione, non solo l'URL inizialmente (che il DNS rebinding può eludere), impedisce a un target appositamente creato di raggiungere servizi interni.