Se pensi che scrivo in questo thread per dire che sono figo allora non scrivo piu’! Non ne ho bisogno. Gia’ ho avuto delle critiche perche’ menzionavo le somme delle ricompense (il che mi ha sorpreso perche’ la mia intenzione era soltanto quella di evidenziare come si puo’ guadagnare con bug bounties, nel caso qualcuno e’ interessato a provare).
Mi pare di aver descritto un caso simile comunque la TL;DR:
L’app richiede un pagamento con carta di credito oppure un voucher per acquistare una subscription. Normalmente un voucher dovrebbe essere usabile soltanto una volta, ma se l’applicazione e’ vulnerabile a race conditions come in questo caso, e’ possibile usare un singolo voucher per creare una subscription in molti accounts.
La vulnerabilita’ e’ spesso chiamata “limit overrun” (cioe’ bypassi un limite) basato su race condition. “Race condition” e’ una situazione che accade quando inviii molte richieste al server e il comportamento del server cambia tra l’invio di quelle richieste in parallelo e l’invio delle stesse in sequenza o comunque non allo stesso momento.
Nel caso di un voucher, l’applicazione normalmente flagga il codice come “usato” al primo utilizzo. Ma se invio richieste per fare un ordine con lo stesso voucher code e allo stesso tempo, sfrutto il delay che c’e’ tra l’applicazione del codice in un ordine, and il marking del codice come gia’ usato. Quindi c’e’ la possibilita’, se la applicazione e’ vulnerabile, di creare piu’ ordini con lo stesso voucher prima che il voucher viene markato come usato.
In questo caso, e’ stato un po’ piu’ complesso perche’ l’ordine avviene in due fasi: un ordine draft col voucher, e la conferma dello stesso che crea la subscription.
La tecnica che ho usato e’ la stessa che ho menzionato giorni fa, la “Single packet”, che significa invio tutte le richieste in un singolo TCP packet cosi’ da eliminare i delay e network jitter etc, cosi’ tutte le richieste arrivano al server allo stesso momento.
Tutto qui, e’ abbastabza semplice come concetto credo.
Per evitare questo tipo di problemi, l’applicazione dovrebbe usare qualcosa tipo il pessimistic locking di relational databases (o simile concetto in altri sistemi) cosi’ da bloccare il record di un voucher mentre viene usato per il primo ordine processato dal database, per prevenire l’accesso allo stesso da altri processi per altri ordini.