Approccio alla revisione del codice statico

8

Le mie domande sono correlate all'approccio di analisi del codice statico utilizzato da Veracode vs Fortify / AppScan.

  1. Veracode: trova i difetti di sicurezza nei binari e nel bytecode dell'applicazione senza richiedere l'origine
  2. Fortifica / AppScan: analizza il codice sorgente effettivo per identificare le vulnerabilità della sicurezza.

A) C'è un vantaggio / svantaggio nel condurre revisioni dei binari rispetto al codice sorgente? B) Quale fornisce più copertura / vulnerabilità. C) Qualsiasi esempio sarebbe fantastico.

Grazie,

    
posta hindiuniversity 14.05.2014 - 04:42
fonte

4 risposte

7

A) Is there an advantage/disadvantage of conducting reviews of binaries over source-code?

Spesso i compilatori NON scrivono espressamente il codice come previsto nella fonte. Ad esempio, Return Oriented Programming sfrutta il fatto che i compilatori inseriranno molti più opcode RET di quanti ne sappia il programmatore. A causa del pipelining e altri trucchi di ottimizzazione, i compilatori essenzialmente riscrivono il tuo codice e possono possibilmente aggiungere le proprie vulnerabilità. Ciò significa che alcuni costrutti nel codice sorgente potrebbero non essere espressi nel file binario!

Questa è una classe di errore che è essenzialmente impossibile per catturare l'analisi manuale del codice ... e sospetto che il rischio sarebbe ancora lì per il codice JIT Java / C #, ma questo sarebbe essere offuscato da uno strumento di analisi statica.

L'analisi manuale del codice sorgente può essere d'aiuto dal fatto che le maggior vulnerabilità comuni possono essere catturate dall'ispezione visiva. E ha anche altri vantaggi, in particolare diminuendo il numero di cimici dei prodotti in generale. (E quindi costa). E aiuta anche l'aspetto sociale: le recensioni delle fonti incoraggiano le persone a scrivere come se qualcun altro stesse guardando. Uno svantaggio principale è che se si ha a che fare con un linguaggio tipizzato dinamicamente, come PERL, Groovy, LISP e le sue derivate ... la maggior parte dei dati non verrà esaminata fino al runtime che significa nessuno statico l'analisi o l'analisi del codice sorgente è sufficiente.

Puoi persino ingannare gli strumenti di analisi statici convertendo il codice tipizzato staticamente in istruzioni in fase di esecuzione. A Veracode non piace il tuo costrutto java? Riscrivilo usando il riflesso e l'errore di Veracode scompare e nessuno è più saggio. Come esperto di sicurezza devi anche assumere che i programmatori che lavorano nella tua azienda sono una potenziale minaccia.

Quindi, in breve, non c'è modo di evitare l'analisi del codice sorgente, l'analisi statica e l'analisi dinamica in qualsiasi applicazione specifica se la tua speranza è una base di codice accettabilmente sicura. *

B) Which one provides more coverage/vulnerabilities.

L'analisi del codice sorgente dipende dai revisori che hanno eccellenti capacità di sicurezza e dal momento che sono esseri umani, non si può ragionevolmente aspettarsi prestazioni perfette. Ecco perché gli strumenti di analisi statica sono utili. La mia preferenza è di eseguire prima gli strumenti di analisi statica e poi eseguire le revisioni di codice protette dopo le scoperte vengono mitigate, preferisco usare STRIDE ma ci sono altri framework da considerare. Ciò consente agli esseri umani di concentrarsi sui problemi di sicurezza meno banali che sono più legati alla logica. Ma un uomo intelligente batterà uno stupido strumento di analisi statica in qualsiasi giorno della settimana.

L'analisi del codice sorgente può aiutarti a scoprire dove un programmatore ha lasciato una back door ... gli strumenti di analisi statici non sono in grado di gestirlo.

Quindi la risposta a questa domanda è ... "dipende". Che tipo di minacce vuoi passare deselezionata?

* A meno che non sia definito "accettabilmente sicuro" lasciando aperte le finestre e sbloccata la porta anteriore.

    
risposta data 14.05.2014 - 16:10
fonte
5

Si potrebbero scrivere libri su queste cose e non essere mai soddisfatti. Lasciatemi provare a rispondere in generale, senza nominare prodotti speciali.

Analisi binario / codice byte

vantaggi

  • (principalmente) linguaggio di programmazione agnostico
  • Può essere eseguito su file binari / librerie di sorgenti chiuse da qualunque luogo
  • Può trovare difetti introdotti a causa di bug del compilatore (o comportamento non definito della lingua di partenza)

Svantaggi

  • spesso più difficile da scrivere / gestire grazie all'hardware in rapida evoluzione (ad esempio, potrebbe non essere ancora in grado di comprendere Intel AVX)
  • Limitato a determinate architetture (in pratica raramente un problema poiché la maggior parte delle cose gira su x86 / x86_64)
  • I costrutti di sincronizzazione multithreading sono difficili da rilevare, se non del tutto.

Analisi del codice sorgente

vantaggi

  • spesso è più facile rintracciare i difetti trovati nel codice sorgente attuale
  • Solitamente consente agli strumenti di vedere il "quadro più grande" di come le cose funzionano meglio insieme (ad esempio, le cose allocate qui, deallocate lì, possibilità di leggere-dopo-libero lì)
  • Fornisci analisi a un livello semanticamente più elevato (ad esempio, un overflow di interi in alcuni calcoli che a livello di assembly è un disordine incomprensibile di turni e aggiunte)
  • L'annotazione del codice sorgente può aiutare lo strumento a capire cosa sta succedendo (ad es. "Fidati di me, questa è una primitiva di sincronizzazione e quindi il seguente è atomico, non c'è bisogno di preoccuparsi delle condizioni di gara")

Svantaggi

  • Il codice sorgente deve essere disponibile
  • Potrebbe non supportare completamente tutta la lingua (ad esempio costrutti metaprogrammazione del modello C ++)
  • Potrebbe non essere in grado di simulare con precisione le proprietà della macchina su cui verranno eseguite in seguito (ad esempio, la dimensione dei numeri interi ecc.)
  • Non discende nelle dipendenze della libreria che potrebbero essere disponibili solo come file binari, o che sono differenti su sistemi diversi.

Livello di copertura

Questo è in gran parte ortogonale al modo in cui lo strumento opera ed è in gran parte una misura della qualità di quel prodotto. Con abbastanza sforzi, tutti gli strumenti potrebbero implementare tutti i controlli per tutti i tipi di vulnerabilità, ma nessuno ha abbastanza forza di lavoro in giro. Le cose che sono più facili da fare saranno fatte; quelli che sono difficili da fare potrebbero non essere mai implementati.

Potresti avere due strumenti per l'analisi del codice sorgente che si concentrano su cose completamente diverse (ad esempio una sulle condizioni di gara, l'altra su overflow). Sono sicuro che tra gli strumenti ci sia sempre qualche sovrapposizione, ma non ci sono due strumenti che trovano esattamente lo stesso tipo di difetti.

Se hai la possibilità, esegui quanti più di quelli che puoi, non sai mai se hai un bug da qualche parte che può essere trovato solo da uno degli strumenti che non hai ancora eseguito ...

    
risposta data 14.05.2014 - 15:24
fonte
2

La risposta breve è usarli entrambi. Test di sicurezza delle applicazioni ibride o integrate (IAST) combina i test di sicurezza delle applicazioni dinamiche (DAST) di binari e codici byte con test di sicurezza delle applicazioni statiche (SAST) per creare una vista unificata delle vulnerabilità di un'applicazione. L'obiettivo non è solo quello di individuare le vulnerabilità, ma anche aiutare gli sviluppatori a identificare, interpretare e correggere rapidamente tali errori. Gli strumenti ibridi vanno al di là di DAST usando l'analisi statica per puntare alle linee specifiche del codice sorgente e per estendere la copertura dello strumento. Inoltre gli strumenti IAST riducono i falsi positivi - la rovina degli sviluppatori di software - con test in tempo reale sui risultati di SAST. IAST può sfruttare i punti di forza dei metodi SAST e DAST e compensare le debolezze insite in ciascuno. Ad esempio, il test dinamico di un'iniezione SQL può confermare che l'attacco ha effettivamente raggiunto il database. IAST accelera i test esaminando il codice per restringere la superficie di attacco; non è necessario testare una pagina per SQL injection se la pagina non esegue alcun SQL. IAST può impiegare SAST per scoprire superfici di attacco in codice che potrebbero essere nascoste a metodi di test dinamici.

Esempi di strumenti IAST sono Contrasto di Aspect, Cercatore di Quotium Technologies, Appscan Enterprise di IBM, Acunetix Web Vulnerability Scanner e HP WebInspect Real-Time. Vedi il blog di Jeff Williams Perché solo gli scanner di sicurezza delle applicazioni statiche non posso più tagliarlo Vedi la domanda simile Efficacia dei test di sicurezza delle applicazioni interattive

    
risposta data 27.06.2014 - 21:34
fonte
0

A) C'è un vantaggio / svantaggio nel condurre revisioni dei binari rispetto al codice sorgente?

Normalmente "decompilisco / disassembro" i binari e li rivedo invece del codice sorgente. A volte non ho nemmeno accesso al codice sorgente. Potrebbero esserci diversi "rami" e persino sorgenti che non lo fanno mai nel binario compilato (codice morto).

B) Quale fornisce più copertura / vulnerabilità. Il codice sorgente ha suggerimenti, come // TODO e commenti che possono aiutare se qualcosa deve essere implementato / avere punti deboli. I binari non lo fanno. Entrambi hanno meriti.

    
risposta data 27.10.2015 - 23:44
fonte