Hibernate SQL Injection - Fortify 360

5

Uso Fortify 360 per analizzare la sicurezza del mio codice. Fortify ha identificato un metodo di eliminazione basato su Hibernate per eseguire un'eliminazione basata su un oggetto che è stato passato. La mia comprensione dell'ibernazione è che l'ibernazione cancellerà una riga nella tabella a cui l'oggetto è associato in base all'id oggetto (l'id è un numero). Fortify lo ha contrassegnato come SQL Injection: Hibernate (Input Validation and Representation, Data Flow). Fortify non sembra gradire che Hibernate stia eseguendo un'istruzione SQL dinamica usando l'input non convalidato. Sarebbe necessaria una certa correzione o solo un avvertimento come rischio mitigato?

public List findByItemProp(String propName, Object value){
   try{
     String qs = "from ItemTypes as model where model."+ propName +"= ?"; /* <-- flagged by Fortify */
     Query qo = getSession().createQuery(qs);
     qo.setParameter(0, value);
     return qo.list();
   } catch (){}
 }
    
posta Seneca James 19.04.2012 - 17:08
fonte

3 risposte

7

Ho paura che questo rapporto sia probabilmente troppo carente nei dettagli per fornire una diagnosi. Non riesco a diagnosticare questo problema senza aver visto il codice.

Non devi assolutamente ignorare un avviso di analisi statica come "rischio attenuato" quando non hai fatto nulla per attenuarlo e non capire se l'avviso rappresenta una vulnerabilità sfruttabile o meno.

Ti suggerisco di iniziare con informarti sull'iniezione SQL , sulla sicurezza Hibernate e su questo particolare avvertimento. Molto probabilmente Fortify ha una guida in linea che fornisce una spiegazione dettagliata di questo avvertimento; dovresti iniziare leggendo quello Leggi il seguente documento Fortify backgrounder su SQL injection in Hibernate . Raccomando anche i seguenti articoli: In che modo l'iniezione SQL si interrompe in genere in una configurazione Spring / Hibernate , Iniezione ORM e Come evitare l'iniezione SQL in Hibernate (A Hibernate Urban Legend) .

Aggiornamento (4/20): Vedo che hai aggiornato la domanda per includere il codice. Grazie. Il codice che hai fornito è davvero dubbio, e penso che sia ragionevole per Fortify lamentarsi di quel codice. Guardando questo codice, non è possibile verificare che la query passata a createQuery() sia una costante in fase di compilazione, motivo per cui Fortify emette un messaggio di avviso.

Fondamentalmente, il codice che mostri sembra costruire una query SQL usando la concatenazione di stringhe. È pericoloso Se propName può essere influenzato dall'hacker, allora hai una possibile vulnerabilità di SQL injection. È meglio evitare di costruire la query SQL in questo modo.

In particolare, c'è un mito che usa le istruzioni preparate (o le query parametrizzate) è intrinsecamente immune dall'iniezione SQL. Questo è vero, ma solo se la query stessa è una costante in fase di compilazione che non può essere influenzata dall'hacker. Se inserisci dati non attendibili nella query stessa, utilizzarli in una dichiarazione preparata non ti rende magicamente in qualche modo sicuro.

Quindi la best practice è che, quando si utilizza un'istruzione preparata, assicurarsi che la query possa essere facilmente verificata come costante in fase di compilazione (e non può essere influenzata dall'hacker).

Per riassumere le regole generali del pollice: (1) Non utilizzare la concatenazione di stringhe per creare una query SQL. (2) Quando si desidera una certa dipendenza dai valori di runtime, utilizzare le istruzioni preparate per associare i valori di runtime. (3) Assicurarsi che la query che si utilizza per creare l'istruzione preparata possa essere facilmente verificata come una costante in fase di compilazione. Seguire queste pratiche dovrebbe aiutare a scongiurare attacchi di SQL injection.

    
risposta data 19.04.2012 - 21:16
fonte
2

Ho ricevuto la risposta dall'articolo " Come evitare SQL injection in Hibernate "che DW citato .

Fortify stava identificando la stringa della query qs come vulnerabile all'iniezione SQL. Non ho capito come potrebbe verificarsi l'iniezione SQL visto che sto usando setParameter() come consigliato dall'articolo di Hibernate. Alla fine ho capito che sembrava che Fortify sembrasse pensare che propName fosse dati forniti dall'utente. Quando ho apportato la seguente modifica

  String qs = "from ItemTypes as model where model.stapler = ?";

Fortify ha smesso di identificare questo codice come una vulnerabilità di SQL injection.

    
risposta data 20.04.2012 - 19:46
fonte
1
"from ItemTypes as model where model."+ propName

findByItemProp ("stapler = ''; drop table ItemTypes; -", "");

Oops, c'è il tuo database, sì, sta rilevando la concatenazione di stringhe, non farlo. Probabilmente non è abbastanza intelligente da capire che si tratta di un parametro su una chiamata al metodo, ma è ancora piuttosto sciatto dal momento che un programmatore non si aspetterebbe di sapere che è necessario disinfettarlo senza una documentazione adeguata, ed è meglio assicurarsi che sia pulito il metodo stesso è come se ti risparmi infiniti mal di testa quando un altro sviluppatore sbaglia.

    
risposta data 20.04.2012 - 23:21
fonte

Leggi altre domande sui tag