Vorrei confrontare le espressioni regolari fornite dall'utente per analizzare la maggior parte dei tipi di input utente strutturato, come stringhe di data o markdown, in termini di rischio di esecuzione del codice. Le espressioni regolari sono molto più complesse delle stringhe o del markdown della data (anche se la produzione sicura di html da markdown non attendibile ha i suoi rischi) e quindi rappresenta più spazio per lo sfruttamento, ma il principio di base è lo stesso: lo sfruttamento comporta la scoperta di effetti collaterali inattesi / compilazione / processo di abbinamento.
La maggior parte delle librerie di espressioni regolari sono mature e fanno parte della libreria standard in molte lingue, il che è un indicatore abbastanza buono (ma non certo) che è privo di problemi importanti che portano all'esecuzione di codice.
Vale a dire, fa aumenta la superficie di attacco, ma non è irragionevole prendere la decisione misurata per accettare quel rischio relativamente minore.
Gli attacchi di tipo denial of service sono un po 'più complicati. Penso che la maggior parte delle librerie di espressioni regolari siano progettate tenendo conto delle prestazioni, ma non contano la mitigazione dell'input intenzionalmente lento tra i loro obiettivi principali di progettazione. L'opportunità di accettare le espressioni regolari fornite dall'utente dalla prospettiva DoS dipende più dalla libreria.
Ad esempio, la libreria regex .NET accetta un timeout che potrebbe essere usato per mitigare gli attacchi DoS.
RE2 garantisce un'esecuzione in tempo lineare alle dimensioni dell'input , che può essere accettabile se si sa che il proprio corpus di ricerca rientra in un limite di dimensioni ragionevoli.
In situazioni in cui la disponibilità è assolutamente critica o stai cercando di ridurre al minimo la superficie di attacco il più possibile, è logico evitare di accettare la regex dell'utente, ma penso che sia una pratica difendibile.