Perché il governo degli Stati Uniti non consente le lingue dinamiche per progetti sicuri?


120

Conosco alcune persone che stanno attualmente lavorando a un progetto per l'esercito americano (basso livello di sicurezza, dati sul tipo di risorse umane non combattenti).

Uno stato iniziale del codice del progetto è stato presentato ai militari per la revisione e hanno eseguito il programma attraverso una sorta di strumento di analisi della sicurezza. Ha restituito un rapporto di problemi di sicurezza noti nel codice e ha richiesto modifiche che dovevano essere implementate prima della consegna del prodotto finale.

Uno degli elementi che dovevano essere risolti era la rimozione di parte del progetto che era stato scritto in Ruby in quanto è un linguaggio dinamico.

Qual è lo sfondo / motivo per cui non è possibile utilizzare un linguaggio dinamico in un ambiente sicuro? È questo il governo lento nell'adottare nuove tecnologie? O i linguaggi dinamici comportano un ulteriore rischio per la sicurezza rispetto ai linguaggi statici (ala C ++ o Java )?


56
L'unico modo per sapere con certezza è se i tuoi conoscenti chiedono il motivo ai loro datori di lavoro. Ma posso rischiare di indovinare: il controllo statico del tipo è un altro livello che aiuta la correttezza del software mission-critical. Non eliminerà i bug, ovviamente, ma è un passo nella giusta direzione: il computer sta facendo un po 'di lavoro per te. (Sì, sono consapevole che questo è il territorio delle guerre sante).
Andres F.


75
Non vuoi che il software di controllo missilistico sia scritto in PHP + JavaScript.
Tulains Córdova,

16
I dati sulle risorse umane non sono "a basso livello di sicurezza". Mi aspetto che un'azienda mantenga il mio impiego e i dati personali il più sicuri possibile.
gbjbaanb

5
@gbjbaanb Immagino che l'OP abbia significato che la perdita della vita non è lo scenario peggiore qui.
Andres F.

Risposte:


126

Ci sono un certo numero di cose "ordinate" che possono essere fatte in linguaggi dinamici che possono essere nascoste in parti del codice che non sono immediatamente ovvie per un altro programmatore o revisore per quanto riguarda la funzionalità di un determinato codice.

Considera questa sequenza in irb (ruby shell interattiva):

irb(main):001:0> "bar".foo
NoMethodError: undefined method `foo' for "bar":String
        from (irb):1
        from /usr/bin/irb:12:in `<main>'
irb(main):002:0> class String
irb(main):003:1> def foo
irb(main):004:2> "foobar!"
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> "bar".foo
=> "foobar!"

Quello che è successo lì è che ho provato a chiamare il metodo fooin una costante String. Questo è fallito. Ho quindi aperto la classe String e definito il metodo fooo return "foobar!", quindi l'ho chiamato. Questo ha funzionato.

Questa è conosciuta come una classe aperta e mi dà incubi ogni volta che penso di scrivere codice in ruby ​​che abbia qualsiasi tipo di sicurezza o integrità. Certo, ti consente di fare alcune cose ordinate abbastanza velocemente ... ma potrei farlo in modo che ogni volta che qualcuno memorizzi una stringa, la memorizzi in un file o lo invii in rete. E questo pezzetto di ridefinizione della stringa può essere nascosto in qualsiasi punto del codice.

Molte altre lingue dinamiche hanno cose simili che si possono fare. Perl ha Tie :: Scalar che può dietro le quinte cambiare il modo in cui un determinato scalare funziona (questo è un po 'più ovvio e richiede un comando specifico che puoi vedere, ma uno scalare che viene passato da qualche altra parte potrebbe essere un problema). Se hai accesso al Ricettario Perl, cerca la Ricetta 13.15 - Creazione di variabili magiche con cravatta.

A causa di queste cose (e altre spesso fanno parte di linguaggi dinamici), molti approcci all'analisi statica della sicurezza nel codice non funzionano. Perl e Undecidability mostrano che questo è il caso e sottolinea anche problemi così banali con l'evidenziazione della sintassi ( whatever / 25 ; # / ; die "this dies!";pone sfide perché whateverpossono essere definite per prendere argomenti o meno in fase di esecuzione sconfiggendo completamente un evidenziatore della sintassi o un analizzatore statico).


Ciò può diventare ancora più interessante in Ruby con la possibilità di accedere all'ambiente in cui è stata definita una chiusura (vedi YouTube: Keeping Ruby Reasonable from RubyConf 2011 di Joshua Ballanco). Sono stato informato di questo video da un commento di Ars Technica di MouseTheLuckyDog .

Considera il seguente codice:

def mal(&block)
    puts ">:)"
    block.call
    t = block.binding.eval('(self.methods - Object.methods).sample')
    block.binding.eval <<-END
        def #{t.to_s}
          raise 'MWHWAHAW!'
        end
    END
end

class Foo
    def bar
        puts "bar"
    end

    def qux
        mal do
            puts "qux"
        end
    end
end

f = Foo.new
f.bar
f.qux

f.bar
f.qux

Questo codice è completamente visibile, ma il malmetodo potrebbe essere altrove ... e con le classi aperte, ovviamente, potrebbe essere ridefinito altrove.

In esecuzione questo codice:

~ / $ ruby ​​foo.rb 
bar
> :)
qux
bar
b.rb: 20: in `qux ': MWHWAHAW! (RuntimeError)
    da b.rb: 30: in ''
~ / $ ruby ​​foo.rb 
bar
> :)
qux
b.rb: 20: in `bar ': MWHWAHAW! (RuntimeError)
    da b.rb: 29: in ''

In questo codice, la chiusura è stata in grado di accedere a tutti i metodi e altri binding definiti nella classe in quell'ambito. Ha scelto un metodo casuale e lo ha ridefinito per sollevare un'eccezione. (vedi la classe Binding in Ruby per avere un'idea di ciò a cui questo oggetto ha accesso)

Le variabili, i metodi, il valore di sé e possibilmente un blocco iteratore a cui è possibile accedere in questo contesto sono tutti conservati.

Una versione più breve che mostra la ridefinizione di una variabile:

def mal(&block)
    block.call
    block.binding.eval('a = 43')
end

a = 42
puts a
mal do 
  puts 1
end
puts a

Che, quando eseguito, produce:

42
1
43

Questo è più della classe aperta che ho menzionato sopra che rende impossibile l'analisi statica. Ciò che è dimostrato sopra è che una chiusura che viene passata da qualche altra parte, porta con sé l'intero ambiente in cui è stata definita. Questo è noto come un ambiente di prima classe (proprio come quando puoi passare attorno a funzioni, sono funzioni di prima classe, questo è l' ambiente e tutti gli attacchi disponibili in quel momento). Si potrebbe ridefinire qualsiasi variabile definita nell'ambito della chiusura.

Buono o cattivo, lamentano ruby o no (ci sono usi in cui si sarebbe vogliono essere in grado di arrivare a l'ambiente di un metodo (vedi sicuro in Perl)), la questione del "perché sarebbe rubino essere limitato in un progetto di governo "si risponde davvero in quel video collegato sopra.

Dato che:

  1. Ruby consente di estrarre l'ambiente da qualsiasi chiusura
  2. Ruby cattura tutti gli attacchi nell'ambito della chiusura
  3. Ruby mantiene tutti gli attacchi come vivi e mutevoli
  4. Ruby ha nuovi vincoli che oscurano i vecchi vincoli (piuttosto che clonare l'ambiente o vietare la riconversione)

Con le implicazioni di queste quattro scelte di progettazione, è impossibile sapere cosa fa qualsiasi bit di codice.

Maggiori informazioni al riguardo sono disponibili sul blog di Abstract Heresies . Il particolare post riguarda Scheme in cui si è svolto un simile dibattito. (relativo a SO: Perché Scheme non supporta ambienti di prima classe? )

Con il passare del tempo, tuttavia, mi sono reso conto che con ambienti di prima classe c'erano più difficoltà e meno potenza di quanto avessi inizialmente pensato. A questo punto credo che gli ambienti di prima classe siano nella migliore delle ipotesi inutili e pericolosi nella peggiore.

Spero che questa sezione mostri l'aspetto di pericolo degli ambienti di prima classe e perché venga chiesto di rimuovere Ruby dalla soluzione fornita. Non è solo che Ruby è un linguaggio dinamico (come detto altro-risposta, altri linguaggi dinamici sono stati ammessi in altri progetti), ma ci sono problemi specifici che rendono alcuni linguaggi dinamici ancora più difficili da ragionare.


3
Non capisco il punto di questo. Si menziona una classe Perl che consente di modificare il comportamento degli scalari. Tuttavia, Perl è ampiamente utilizzato, anche in ambienti sicuri. Il semplice fatto di avere queste capacità nella lingua non significa che la lingua non possa essere utilizzata. Nel caso particolare di Ruby, è probabile che l'ambiente target non supporti Ruby. Personalmente, non ho mai visto Ruby disponibile per l'uso su alcun sistema e non sono nemmeno sicuro che sia presente in alcun elenco di software approvato.
Thomas Owens

17
@ThomasOwens - La mia comprensione di questa risposta è che la chiave è "many approaches to static analysis of security in code doesn't work", quindi è respinta perché non può essere analizzata (almeno da questo gruppo). Non lo so se lo stia interpretando nel modo giusto o se sia anche un motivo valido per rifiutarlo.
Bobson,

21
In mancanza di informazioni sugli elenchi di software approvati, posso solo immaginare le difficoltà con i linguaggi dinamici. Tuttavia, ho riscontrato problemi simili con il software finanziario e i controlli del settore delle carte di pagamento non sono riusciti perché la lingua non poteva preformarsi su un'analisi statica per problemi di sicurezza. Ho dimostrato due esempi in linguaggi dinamici in cui la natura del linguaggio gli consente di sovvertire l'analisi statica. Ho anche sottolineato perché questo, anche teoricamente, non può mai essere accurato. Può darsi che il perl sia consentito in alcuni luoghi e non in altri, posso solo immaginare i motivi.

2
È possibile ridefinire le funzioni di libreria standard anche in molte altre lingue (ad esempio Obj-C, C, C ++).
Martin Wickman,

12
Bene, i metodi di estensione .NET NON sono gli stessi del precedente Ruby. Creano semplicemente un modo più semplice per scrivere una classe statica. In realtà non aggiungono un metodo a una classe.
Graham,

50

Supponendo che la valutazione fosse solo di sicurezza e non solo una scansione di accettazione (cioè, non accettano Ruby perché non vogliono supportare Ruby) quindi:

Gli strumenti di analisi della sicurezza in genere si divertono con comportamenti dinamici.

Per esempio:

Esegui qualsiasi progetto .NET scritto con funzionalità moderne come ASP.NET MVC ed Entity Framework attraverso qualcosa come Veracode e vedi quale tipo di elenco di falsi positivi che ricevi nel tuo rapporto.

Veracode elenca anche molte tecniche di base all'interno delle librerie core di .NET 4 come "framework non supportati" come non supportate o beta solo anche se la maggior parte di loro ha ormai diversi anni.

Se hai a che fare con un'entità che fa molto affidamento su tale strumento, sono quasi costretti a considerare quelli insicuri se non hanno le competenze tecniche e le risorse, per valutare manualmente un progetto e vedere se è scritto e sicuro.

Nelle operazioni civili in cui i sistemi informatici generalmente non controllano nulla di pericoloso o terribilmente costoso, la mitigazione è che si discute dei falsi positivi e sono generalmente accettati come tali in blocco.

Nelle operazioni bancarie hai ancora la possibilità di una mitigazione dei falsi positivi, ma passerai molto più tempo a discutere le minuzie di ciascun elemento. Questo diventa rapidamente proibitivo in termini di costi e si inizia a utilizzare metodi più tradizionali.

In campo militare, aeronautico, industriale pesante e simili, i sistemi possono controllare cose con modalità di guasto terribili, quindi possono avere regole molto rigide su linguaggi, compilatori, ecc.

Le organizzazioni generalmente scrivono anche la loro politica di sicurezza nel caso peggiore che conoscono, quindi anche se stai scrivendo qualcosa di banale, se lo stai scrivendo per un'organizzazione che ha sistemi non banali, il default sarà generalmente tenerlo uno standard più elevato a meno che qualcuno non richieda un'eccezione specifica.


4
E questi sono solo i falsi positivi. La cosa davvero preoccupante è il potenziale per falsi negativi.
Stephen C

3
Onestamente, la mia esperienza con questi strumenti è stata generalmente terribile. Probabilmente qualcosa lungo un tasso compreso tra 1/200 e 1/1000 di trovare qualcosa che vale davvero la pena discutere. Inoltre, quando ottengo un falso positivo che conosco è qualcosa usato in migliaia di punti nella base di codice o nel framework e lo ha identificato solo una manciata di volte, non sono esattamente pieno di fiducia. Il problema è che stai effettivamente implementando una prova negativa quando crei uno di questi strumenti a meno che non inizi con un linguaggio formale come spec #.
Bill

33

I linguaggi dinamici possono essere utilizzati in applicazioni militari e di difesa. Ho usato e consegnato personalmente Perl e Python nelle applicazioni DoD. Ho anche visto PHP e JavaScript utilizzati e distribuiti. Nelle mie esperienze, la maggior parte del codice non compilato che ho visto sono stati script di shell e Perl perché gli ambienti richiesti sono approvati e installati su una varietà di possibili sistemi di destinazione.

Il fatto che queste lingue siano molto probabilmente dinamiche non è il problema. Gli interpreti per queste lingue devono essere approvati per l'uso sui sistemi di destinazione. Se l'interprete non è approvato per l'uso (o, forse, lo è, ma non è distribuito sui sistemi di destinazione), la lingua non può essere utilizzata. L'uso di un determinato interprete (o qualsiasi altra applicazione) su un sistema sicuro richiede un numero qualsiasi di ostacoli alla sicurezza: analisi della fonte, capacità di compilare dalla fonte per ambienti di destinazione, analisi aggiuntiva dei file binari, assicurando l'assenza di conflitti con l'infrastruttura esistente, ecc.


32

Ho trascorso un po 'di tempo a intervistare il DOD (Dipartimento della Difesa), per una posizione in cui scrivevo codice per la MMU dell'F-16 . Senza violare alcuna non divulgazione: la MMU è l'unità informatica che controlla quasi tutte le funzioni dell'F-16. È (ovviamente) fondamentale che durante il volo non si verifichino errori, come i bug di runtime. È altrettanto fondamentale che il sistema esegua operazioni di elaborazione in tempo reale.

Per questa e altre ragioni storiche, tutto il codice per questo sistema è scritto o compilato in ADA, un linguaggio di programmazione statico orientato agli oggetti .

A causa delle funzionalità di supporto critiche per la sicurezza di Ada, ora viene utilizzato non solo per applicazioni militari, ma anche in progetti commerciali in cui un bug del software può avere gravi conseguenze, ad esempio avionica e controllo del traffico aereo, missili commerciali (ad esempio Ariane 4 e 5), satelliti e altri sistemi spaziali, trasporto ferroviario e bancario. Ad esempio, il software di sistema fly-by-wire nel Boeing 777 è stato scritto in Ada.

Odio citare troppo, ma questo spiega molto bene perché esattamente i linguaggi statici (come ADA) sono usati per progetti come questo:

Un gran numero di controlli in fase di compilazione sono supportati per evitare bug che non sarebbero rilevabili fino al runtime in alcune altre lingue o richiederebbero l'aggiunta di controlli espliciti al codice sorgente. Ad esempio, la sintassi richiede la chiusura esplicita dei blocchi per evitare errori dovuti a token end non corrispondenti. L'adesione a una digitazione forte consente il rilevamento di molti errori software comuni (parametri errati, violazioni di intervallo, riferimenti non validi, tipi non corrispondenti, ecc.) Sia durante la compilazione, sia durante l'esecuzione. Poiché la concorrenza fa parte delle specifiche del linguaggio, il compilatore può in alcuni casi rilevare potenziali deadlock. Inoltre, i compilatori verificano comunemente identificatori errati, visibilità dei pacchetti, dichiarazioni ridondanti, ecc. E possono fornire avvertenze e suggerimenti utili su come correggere l'errore.

Ada supporta anche i controlli di runtime per proteggere dall'accesso alla memoria non allocata, dagli errori di overflow del buffer, dalle violazioni dell'intervallo, dagli errori off-by-one, dagli errori di accesso all'array e da altri bug rilevabili. Questi controlli possono essere disabilitati nell'interesse dell'efficienza di runtime, ma spesso possono essere compilati in modo efficiente. Include anche servizi per la verifica del programma. Per questi motivi, Ada è ampiamente utilizzato nei sistemi critici, in cui qualsiasi anomalia potrebbe portare a conseguenze molto gravi, ad esempio morte accidentale, lesioni o gravi perdite finanziarie. Esempi di sistemi in cui viene utilizzato Ada includono avionica, ferrovie, banche, tecnologia militare e spaziale.

La gestione dinamica della memoria di Ada è di alto livello e sicura per i tipi. Ada non ha "puntatori" generici (e vaghi); né dichiara implicitamente alcun tipo di puntatore. Al contrario, tutta l'allocazione dinamica della memoria e la deallocazione devono avvenire attraverso tipi di accesso dichiarati esplicitamente. A ciascun tipo di accesso è associato un pool di archiviazione che gestisce i dettagli di basso livello della gestione della memoria; il programmatore può utilizzare il pool di archiviazione predefinito o definirne di nuovi (questo è particolarmente rilevante per l'accesso alla memoria non uniforme). È anche possibile dichiarare diversi tipi di accesso che designano tutti lo stesso tipo ma utilizzano pool di archiviazione diversi. Inoltre, il linguaggio prevede controlli di accessibilità, sia in fase di compilazione che in fase di esecuzione, che assicurano che un valore di accesso non possa sopravvivere al tipo di oggetto a cui punta.


3
"A causa delle funzionalità di supporto critiche per la sicurezza di Ada, ora è [usato nei] razzi commerciali (ad esempio Ariane 4 e 5)" , ovviamente il primo Ariane 5 è esploso a causa di un bug del software , quindi non c'è proiettile d'argento.
Andrew Marshall,

5
@AndrewMarshall: "Sebbene il rapporto identifichi un bug del software come causa diretta, altri investigatori vedono le cause come errori di progettazione del sistema e problemi di gestione" - Dubito seriamente che il codice scritto in una lingua diversa (ad esempio Java o C ++) avrebbe ottenuto razzo in orbita.
Martin Schröder,

@ MartinSchröder Oh, non dubito che Ada sia ancora probabilmente superiore agli altri per questa applicazione, notando solo che non è infallibile. Un'altra lingua potrebbe aver superato innumerevoli bug che non sarebbero stati possibili in Ada.
Andrew Marshall,

13

Sia il DoD che la NASA hanno una lunga storia con errori di programmazione che costano loro miliardi di dollari. Entrambe le istituzioni hanno accettato i processi che dovrebbero proteggerli dal ripetere gli stessi errori.

Is this the government being slow to adopting new technologies?

Questo è un malinteso: i linguaggi dinamici non sono una nuova tecnologia, sono piuttosto vecchi. Il problema è che se hai mai avuto un problema causato da un linguaggio dinamico (ad esempio da digitazione debole / dinamica) e quel problema ti costa un sacco di soldi, potresti accettare una politica che ti impedirebbe di ripetere lo stesso errore - ad es. vietare l'uso di linguaggi dinamici in sistemi sensibili.

I linguaggi dinamici spesso "inghiottono" i bug e finiscono con comportamenti inaspettati. Questo è molto pericoloso nei sistemi sensibili. Se sta succedendo qualcosa di sbagliato, vuoi saperlo il prima possibile.

Se si tratta di sicurezza, sarebbe necessario vedere il caso d'uso reale. Ad esempio, non penso che una pagina Web di Ruby on Rails sia automaticamente meno sicura di una pagina Web Java.


2
IMHO più bug sono stati "ingoiati" da buffer overflow non rilevati di ogni altra cosa, che è precisamente qualcosa che la maggior parte dei linguaggi dinamici non consentirà in primo luogo ... solo dicendo
miraculixx

@miraculixx Vero, c'è un motivo per cui Java / C # e linguaggi simili vengono usati molto più di Ruby. Sono difensivi: controllano tutto. In C / C ++ la difensività può essere applicata usando buoni standard di codifica. Puoi anche applicare controlli per tutto. Ma puoi immaginare di scrivere un'applicazione sensibile in ruby ​​o javascript? La possibilità di bug nascosti è eccezionale.
Sulthan,

Anzi, posso. Siamo probabilmente d'accordo sul fatto che il software debba essere testato a fondo, indipendentemente dal linguaggio di programmazione. Per evitare regressioni, il test è automatizzato al meglio usando ad es. Unit test, BDD et al. Presumere un approccio professionale (applicazione sensibile, giusto?), Raggiungere una copertura di test sufficiente è un processo gestito, non lasciato al caso. Con ciò, dubito che C / C ++, Java abbiano un vantaggio rispetto a ruby ​​o javascript in termini di bug nascosti. Competenze del programmatore? Probabilmente più tecnico con C ++, dubbioso con Java, ma difficilmente un problema di linguaggio. Più tecnico! = Qualità del prodotto.
miraculixx,

6

Vorrei aggiungere le risposte esistenti descrivendo SA-CORE-2014-005 di Drupal , che è una vulnerabilità altamente critica che consente l'iniezione di SQL e, in definitiva, l'esecuzione di codice arbitrario. È causato dalle regole di digitazione dinamica di PHP e di runtime lassista.

L'intera patch per questo problema è:

-      foreach ($data as $i => $value) {
+      foreach (array_values($data) as $i => $value) {

Questo codice fa parte di un livello di astrazione SQL progettato per impedire l'iniezione di SQL. Prende una query SQL con parametri denominati e una matrice associativa che fornisce un valore per ciascun parametro denominato. Il valore può essere un array, per casi simili WHERE x IN (val1, val2, val3), in cui tutti e tre i valori possono essere passati come un singolo valore di array per un singolo parametro denominato.

La vulnerabilità si verifica perché il codice presuppone che $iin $i => $valuedebba essere un indice intero del valore. Continua e concatena questo "indice" direttamente nella query SQL come parte del nome di un parametro, perché i numeri interi non necessitano di escape, giusto?

Purtroppo per Drupal, PHP non fornisce tale garanzia. È possibile passare in un altro array associativo, le cui chiavi sono stringhe, e questo ciclo concatenerà felicemente la chiave stringa nella query, così com'è (ricorda che il codice pensa che possa essere solo un numero intero).

Mentre ci sono modi per avere un errore simile in una lingua tipizzata staticamente, sono improbabili. Un buon sviluppatore considererebbe quali $ipotrebbero essere le cose prima di concatenarle nella query. Con un linguaggio tipicamente statico, è molto facile imporre che $ideve essere un numero intero e in un codice sensibile alla sicurezza come questo, questo sarebbe sicuramente fatto.

Inoltre, il codice controlla effettivamente se il valore è un array prima di scorrere gli elementi. E qui sta una seconda parte del fallimento che abilita questa vulnerabilità: sia un array associativo che un array "normale" sono veri e propri is_array. Mentre è anche vero che in C #, sia i dizionari che gli array sono IEnumerable, è difficile costruire un codice che confonderebbe intenzionalmente le chiavi del dizionario con indici di array come questo, e tanto meno accidentalmente.


2

La sicurezza di una base di codice dipende da come si scrive il codice, da come lo si verifica e da come si convalida e si monitora il processo di sviluppo e distribuzione. Le lingue non sono né sicure né insicure, è come si codifica.

La maggior parte degli incidenti di sicurezza dovuti a input dannosi (iniezioni sql, buffer overflow), virus, rootkit e trojan. Nessuna lingua può proteggerti da questo.

Quindi vietare a classi di lingue di essere "insicure" non è un motivo valido.

Sospetto che qualcuno, per qualsiasi motivo, informato o meno, abbia deciso di vietare queste lingue. Dopo un po 'divenne una verità organizzativa . Potrebbe essere stato vero in quel momento per alcuni progetti, ma le culture di controllo non sono entusiaste di cambiare le decisioni (ammettono di aver sbagliato) e preferiscono piuttosto regole semplici. Prosperano su regole e regolamenti e non importa se hanno senso o no, è la sicurezza percepita che conta.

Questo succede sempre nelle culture di controllo. Lo vedo più o meno quotidianamente. Non ha senso, ma è così. Se vuoi leggere di più su questo argomento di grande rilevanza, raccomando il libro di Schneider " The Reengineering Alternative ". Ecco un diagramma di cultura di Michael Sahoto / Agilitrix , basato sul libro di Schneider: inserisci qui la descrizione dell'immagine


18
-1 Esistono molti validi motivi tecnici per cui una lingua verrebbe scelta su un'altra (controllo in tempo reale, di tipo statico, di runtime) per i sistemi critici per la sicurezza. Implichi che i motivi siano la cultura al 100%, noi contro di loro, e arbitraria, che IMO è totalmente errata in questo caso.
Michael Jasper,

8
"Le lingue non sono né sicure né insicure" - consultare stackoverflow.com/a/14313277/602554 . Alcune lingue sono sicuramente "più sicure" di altre.
Michael Jasper,

2
Aggiornato la mia risposta, forse di tuo gradimento. Credo ancora che un sistema sia sicuro che dipende più dal codice che scrivi che dalla lingua che usi, anche se alcune lingue aiutano a evitare alcuni problemi (mentre, eventualmente, ne introduce altri).
Martin Wickman,

2
@MartinWickman: a) Le iniezioni SQL / HTML e gli overflow del buffer sono risolti da alcuni sistemi di tipi: esistono tipi diversi per input con escape e senza escape in modo da sapere quali dovrebbero essere trattati in che modo. b) non tutti i problemi di sicurezza in "progetti sicuri" significano necessariamente compromessi. Non voglio che il software su cui è in esecuzione l'aereo abbia qualche bug anche se non si tratta di un problema di "sicurezza" (ovvero non può essere utilizzato per assumere il controllo del sistema).
Maciej Piechotka,

5
-1 per problemi di precisione fattuale. Gli exploit buffer overflow sono un problema altamente specifico del linguaggio C; non ne hai mai sentito parlare in lingue che non ti consentono di allocare un buffer di stringa nello stack. E non è affatto difficile immaginare un ipotetico dialetto SQL in cui l'uso dei Parametri non fosse semplicemente consentito ma richiesto . Iniezione di SQL sarebbe impossibile in questo linguaggio. Quindi sì, un linguaggio ben progettato può proteggerti da diversi tipi comuni di attacchi.
Mason Wheeler,

2

Per quanto ne so, la politica ufficiale del Dipartimento della Difesa non proibisce generalmente le lingue dinamiche.

Gli standard per il software sviluppato o procurato dal DoD sono promulgati dalla Defense Information Systems Agency (DISA). La loro sicurezza delle applicazioni - Guida all'implementazione tecnica (STIG) per la sicurezza delle applicazioni e della sicurezza delle applicazioni non vieta alcun linguaggio specifico. Non menziona Ruby, ma menziona Perl e Python che sono allo stesso modo dinamici. Li menziona nel contesto di vari argomenti (seguendo gli standard di codifica stabiliti, evitando vulnerabilità all'iniezione di comandi, ecc.).

Probabilmente quello che stai vedendo è uno strumento di scansione troppo rigoroso (ce ne sono molti diversi menzionati nello STIG, ognuno può avere una propria interpretazione delle regole) e / o un'interpretazione troppo rigorosa del suo output.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.