Vorrei iniziare con una panoramica strutturale: dal punto di vista del design, le parti separate del codice sono ben definite? ad esempio, hai codice di convalida, funzioni di input e output ecc. che vengono utilizzate per questi scopi in tutto il codebase o ogni funzione è individuale? Avete un codice che è funzionalmente sicuro (spesso certe costruzioni di stile non influiscono sulla sicurezza del flusso di dati)
Se si dispone di un wrapper di sicurezza che esegue l'autenticazione per ogni funzione, è possibile eseguire una revisione di tali funzioni e controllare l'utilizzo della funzione wrapper, ad esempio.
Se è un codebase molto grande, allora vorrai eseguire uno strumento come Fortify (o altri che @AviD sarà in grado di nominare :-) per fare un primo passaggio al problema, ma tutti gli strumenti soffrono di una mancanza di intelligenza del contesto. Identificano in base alle firme tipiche, quindi otterrete falsi posisivi (e possibilmente falsi negativi - ecco perché avere una buona panoramica può aiutare a identificare i rischi che uno strumento non individuerà)
L'idea è che lo strumento restringa le possibili aree di rischio e identifica la grande maggioranza dei problemi, poiché gli strumenti sono relativamente economici, quindi un umano convalida e aggiunge all'output dello strumento, inserendolo nel contesto dell'ambiente applicativo.
A rischio di sembrare eccessivamente commerciale, consiglierei di utilizzare i servizi di un consulente esperto in sicurezza che non solo conosce lo strumento di revisione del codice e conosce perfettamente Java + Oracle, ma anche qualcuno esperto in architettura basata sul rischio aziendale e di sicurezza.