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.
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).
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.
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.
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 })}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.