Questo è un seguito di un altro argomento ( La richiesta di arricciatura non filtrata di un sito Web è vulnerabile? ) su cui sto facendo qualche ricerca privata.
Dato:
A publicly reachable webservice that accepts any url and performs a curl get request on it. The service operates without authentication.
L'argomento collegato già afferma che l'accesso non filtrato è un problema di sicurezza. Ma qualcosa su questo argomento affiora periodicamente i miei pensieri e mi ci è voluto un po 'per riflettere: un servizio simile può essere sufficientemente sicuro contro SSRF e allo stesso modo?
Passi ovvi:
- cURL è potente, limita gli schemi consentiti a http (s) e ftp (risolve i problemi file, gopher, dict, ecc. )
- impedisce l'accesso all'intero loopback: localhost , 127.0.0.1-127.0.0.255 (ero totalmente inconsapevole che l'intera rete di 127.x.x.x punta alla tua macchina 0_o)
- impedisce l'accesso a 0.0.0.0
- non consentire l'IP di trasmissione 255.255.255.255 (anche se è improbabile che qualcosa serva qualcosa sugli schemi consentiti sopra)
- prevenire gli IP privati per evitare l'accesso alle reti interne (impersonalizzazione di un server, che fa parte della rete privata?) - > 10.0.0.0/8, 172.16.0.0/12 e 192.168.0.0/16 (grazie wiki )
Ma c'è di più, giusto?
- se cURL è configurato per seguire i reindirizzamenti, il reindirizzamento deve essere convalidato allo stesso modo dell'IP originale, poiché la falsificazione di un reindirizzamento è banale
- IPv6: tutto per il simpatico vecchio spazio indirizzo IPv4 deve essere rifatto anche lì, giusto?
- Ci sono alcune porte da filtrare? Ricorda che gli schemi sono limitati a http (s) e ftp. Questo potrebbe ancora essere tecnicamente uno scanner di porte ma non è dannoso ma ottenere un sito web dalla porta 675 potrebbe essere ok.
- Previene gli URL remoti DoS: implementa una sorta di token (token CSRF allo stesso modo), introduce timeout tra più richieste, ad esempio 1 secondo o esclude gli IP che continuano a martellare. (Ovviamente non risolve i DDoS, ma prevenire DDoS è probabilmente al di fuori dell'ambito qui)
Un'ultima cosa che non riesco a capire completamente:
Che cos'è con DNS ? È possibile registrare una voce DNS per puntare a localhost o reti private?
Sulla mia macchina posso tecnicamente eseguire un GET di http://my.box
e ottenere il mio router.
Ora, come può qualcuno mitigare tale rischio?
Esegue una soluzione di nslookup
? Se ottengo un IP, convalidare l'IP.
In caso contrario, potrebbe essere qualsiasi cosa, negare.
Continuo a dimenticare cosa fa il mio NAS, così posso raggiungerlo tramite il nome host nella mia rete locale, ma essere paranoico è probabilmente un buon modo qui.