Bug nel JavaScript di Firefox: dati sensibili a rischio

Bug nel JavaScript di Firefox: dati sensibili a rischio

Secunia ha rivelato un pericoloso bug in Firefox, un'errata gestione delle stringhe JavaScript. Verrebbero esposti alcuni dati presenti in memoria

di pubblicata il , alle 15:39 nel canale Sicurezza
FirefoxMozilla
 
167 Commenti
Gli autori dei commenti, e non la redazione, sono responsabili dei contenuti da loro inseriti - info
fek13 Aprile 2005, 17:26 #151
Originariamente inviato da: Morkar Karamat
I programmatori del futuro non saranno per forza tutti dei guru che giocano con i puntatori, anche se qualcuno continuerà giustamente a farlo per determinate parti di codice "critiche", ma i traguardi della programmazione saranno IMHO altri....niente nostalgia


"Every fool can write code that a machine can understand, only good programmers can write code that a human can understand"
fek13 Aprile 2005, 19:45 #152
Originariamente inviato da: Morkar Karamat
Bellissima Di chi è? Potrei merrerla in sign...


Marin Fowler in "Refactoring: Improving the Design of Existing Code".
xeal14 Aprile 2005, 02:22 #153
Originariamente inviato da cdimauro
Fino a Windows 3.1 lo erano: poi no. IMHO, chiaramente


Per quel che ho capito da un vecchio (non troppo) articolo di Pc Professionale, il problema principale di Win 9x era la gestione "ibrida" dei processi per ottenere il multitasking, al fine di mantenere compatibilità con il dos: per quelli a 32 bit si realizzava un multitasking prelativo, efficiente, per quelli a 16 bit, compresi alcuni moduli del s.o. stesso, si effettuava un multitasking "cooperativo" (un po' come per il dos, che non era stato pensato per il multitasking), affidando ai processi stessi il compito di rilasciare le risorse a favore degli altri quando lo ritenessero opportuno, oppure (credo) approfittando di un i/o burst per fare uno swapping dei processi, senza un meccanismo di prelazione. Ne conseguiva che, se un processo (a 16 bit) andava in crash, trascinava con sé nel baratro tutti quelli (naturalmente solo quelli a 16 bit) che condividevano/contendevano le stesse risorse, compresi i moduli del kernel a 16 bit, da cui il problema della schermata blu. Con le varie versioni di NT questo problema è stato risolto "cacciando" fuori dal kernel tutto ciò che non è essenziale e i moduli necessari alla compatibilità con il dos e gli applicativi a 16 bit. Con xp di schermate blu ne ho viste ben poche, delle quali una per un paio di ca@@ate fatte da me e le altre per un banco di memoria che stava morendo e, diavolo a farlo apposta, mi dava problemi sempre con lo stesso driver e poche altre cose (dannata polvere ).


Comunque, AI TEMPI, anche Windows 3.1 non era da buttar via...


Mi è capitato di averci ancora a che fare due o tre anni fa, grazie a un mio amico (e coinquilino) al quale era stato praticamente regalato un piccolo cimelio, un portatile (o forse sarebbe meglio dire "trasportabile", data l'epoca della sua nascita) 286 con 2 mega (se non ricordo male) di ram. E' stato divertente smanettarci un po' e lanciarsi banane da un tetto all'altro... Peccato che di li a poco sia defunto il monitor


A parte questo, basta passare da Java al C++ o un altro linguaggio orientato agli oggetti senza un garbage collector, per ritrovarsi come minimo con un degli enormi problemi di memory leak.

Purtroppo ormai anche all'università si comincia a programmare in Java e, anzi, quasi sempre è l'unico linguaggio utilizzato e studiato per quanto riguarda la programmazione in generale, e a oggetti in particolare.


Per questo sono convinto che non farebbe male partire con un po' di programmazione strutturata, meglio se in Pascal, per la sua forte tipizzazione. Credo che basti qualche algoritmo di gestione delle liste con inserimenti e (soprattutto) cancellazioni per inquadrare il problema ed estendere poi il concetto senza troppi problemi agli oggetti.

A proposito di oggetti, la versione in Pascal non l'ho mai approfondita, ma non ho dubbi che sia fatta bene. Per quel che ne so, è un peccato che non abbia avuto altrettanto successo l'erede forse più diretto del Pascal standard, il Modula 2 (non vorrei dire castronerie, ma potrebbe essere stato opera di Wirth), che ne correggeva i difetti (tipo il mancato controllo sui bound di un intervallo) e introduceva la programmazione a oggetti. Probabilmente fu colpa del nome poco incisivo, chissa, lo avessero chiamato Perfect Pascal, Pascal Plus o Pascal 2...

Lo so: sono troppo di parte...


Be', forse lo sono un po' anch'io
xeal14 Aprile 2005, 02:22 #154
Originariamente inviato da fek
In sintesi sono totalmente a favore degli ambienti gestiti come Java e .NET. Credo sia solo una questione di strumenti ed usare gli strumenti adatti a risolvere un dato problema: devo scrivere il kernel di un sistema operativo, posso farlo in Java o C#? No, perche' non ho gli strumenti espressivi per esprimere determinati concetti. Devo scrivere un'architettura di streaming video peer to peer (), ha senso farlo in C/C++? Si', ma in C# posso esprimere tutti i concetti che mi servono e riesco a farlo in un terzo del tempo, quindi scelgo questo strumento.


Perfettamente d'accordo, ed in fondo è proprio li che volevo andare a parare. Il livello di astrazione di cui stiamo parlando sostanzialmente demanda ciò che astrae al livello sottostante (framework/VM) e di conseguenza i linguaggi corrispondenti a tale livello non possono essere usati per sviluppare il software che deve girare ai livelli inferiori, mentre sono ottimi per tutto il resto. In ogni caso, insieme al controllo viene demandata anche la risoluzione di (alcuni di) quei problemi che potrebbero produrre dei bug, per cui potrebbe avere senso fare comunque (magari in circostanze particolari/opportune) un testing a 360 gradi con un occhio di riguardo al comportamento dello strato sottostante, magari per comunicare tempestivamente al team che sviluppa il framework un eventuale bug (esempio banale: l'utilizzo del valore "lenght" associato a ciascun array in un ciclo, insieme a un sistema opportuno di eccezioni per la verifica del rispetto dei confini, dovrebbe scongiurare il pericolo di un buffer overflow/underflow, però un piccolo test, di tanto in tanto, per verificare cosa succede a cavallo del valore limite, credo che male non faccia). Dico questo perchè, a mio modo di vedere, questo demandare il controllo a un livello sottostante da un lato localizza molte problematiche, rendendone probabilmente più facile la risoluzione da parte del team che si dedica allo sviluppo del framework (una volta e per tutte) - e semplificando la vita agli altri sviluppatori - dall'altro un eventuale bug finirebbe per colpire inesorabilmente tutti gli altri, senza possibilità di scampo, quindi ritengo che un minimo di collaborazione in questo senso potrebbe essere auspicabile. IMHO, ovviamente
fek14 Aprile 2005, 11:17 #155
Originariamente inviato da: xeal
(esempio banale: l'utilizzo del valore "lenght" associato a ciascun array in un ciclo, insieme a un sistema opportuno di eccezioni per la verifica del rispetto dei confini, dovrebbe scongiurare il pericolo di un buffer overflow/underflow, però un piccolo test, di tanto in tanto, per verificare cosa succede a cavallo del valore limite, credo che male non faccia).


Piu' che non far male, quel test dovrebbe essere obbligatorio. E i test quando e' possibile vanno scritti prima di scrivere il codice relativo.
cdimauro14 Aprile 2005, 11:43 #156
Originariamente inviato da: Morkar Karamat]x cdimauro

Forse non ha fatto Dijkstra la dimostrazione vera e propria (ma ne sono quasi sicuro, boh..) ma ha scritto di certo quanto indicato da xeal.[/QUOTE]
Forse ho trovato il bandolo della matassa http://it.wikipedia.org/wiki/Teorema_di_Jacopini-Bohm

"
Dai un'occhiata a Java 5 (o 1.5 che dir si voglia), oltre a delle macro comode ed utili c'è proprio tutto un nuovo meccanismo per il controllo dell'utilizzo del polimorfismo.

OK, grazie.
Sulla sicurezza in parte ti dò ragione sulla buona volontà, ma è anche vero che dove all'uni insegnano Java ti "radicano" bene in testa l'importanza della gestione delle Eccezioni e di altre cose tanto che quando programmi in C (necessario all'uni di Torino in diversi corsi: quello introduttivo a C e quello di SO focalizzato su Unix ad es.) ti senti "orfano" di tutto ciò e ti rendi conto che stai scrivendo cmq codice "non safe", scarsamente tipato (con quei void* da brividi ) e quando fai linking tra 2 files ti viene male a vedere quanto sia macchinoso il bynding dinamico in C rispetto a Java, per quanto semplici possano essere tali programmi.

Per questo preferisco Pascal e derivati al C...
Il futoro sarà IMHO: 0,1% di codice in linguaggio assemblatore, 2% in C, il resto in Java o simili....

Sono d'accordo (ed è, poi, ciò che ha detto fek...)
ovviamente in attesa di un'altra evoluzione/rivoluzione che, quando sarò della vecchia guardia, osteggerò con tutte le mie forze (spero di no...)

.NET?
cdimauro14 Aprile 2005, 11:50 #157
Originariamente inviato da: Morkar Karamat
Poi per le free la situazione è drammatica...sarà che non sono abituato ma per loro ci impiego lo stesso tempo che a fare il resto del programma

Infatti è perché non ci sei abituato.

Le poche volte in cui mi cimento ancora con le classi in Delphi (Pascal), scrivo subito assieme costruttore/i e distruttore/i, codice che alloca e libera la memoria, codice che crea istanze di oggetti e che li distrugge, infarcendo il tutto con blocchi try/(except|finally).

E' anche una questione di mentalità, che si acquisce col tempo lavorando con un linguaggio, e imparando a usarlo e sfruttarne le caratteristiche per scrivere codice "migliore".
cdimauro14 Aprile 2005, 12:19 #158
Originariamente inviato da: xeal]Per quel che ho capito da un vecchio (non troppo) articolo di Pc Professionale, il problema principale di Win 9x era la gestione "
Ne abbiamo già parlato in un altro (kilometrico ) thread, comunque sì, sostanzialmente è ciò che si verifica. Questo perché le applicazioni e il s.o. stesso condividono con le sezioni a 16 bit:
- alcune zone di memorie "critiche";
- la gestione degli interrupt;
- l'accesso alle porte di I/O.
Con tutte le conseguenze che un approccio di questo tipo può portare.
C'è da dire che, comunque, con Windows 98 e successori ho avuto ben pochi problemi legati a quest'approccio. Anzi, considerato in che modo ho "torturato" il sistema, direi che hanno svolto egregiamente il loro compito...
Per questo sono convinto che non farebbe male partire con un po' di programmazione strutturata, meglio se in Pascal, per la sua forte tipizzazione.

Non solo per quello (anche Java è fortemente tipizzato): da tempo, fortunatamente, il Pascal è diventato un linguaggio molto maturo, che mette a disposizione del programmatore tantissimi strumenti che permettono di scrivere codice adottando diverse metodologie / modelli di programmazione.
[QUOTE]Credo che basti qualche algoritmo di gestione delle liste con inserimenti e (soprattutto) cancellazioni per inquadrare il problema ed estendere poi il concetto senza troppi problemi agli oggetti.

Come per altri linguaggi, ormai i compilatori Pascal-like sono dotati di framework con una miriade di classi, che permettono di gestire anche liste di oggetti.

Però non è così comodo come con Python, ad esempio, dove liste, "dizionari", tuple e insiemi si possono utilizzare molto velocemente, con poco codice, e soprattutto in maniera molto leggibile e "intuitiva"...

Se l'overloading degli operatori fosse supportato come si deve, non sarebbe certo difficile scrivere qualche modulo e classi per implementare questi utili strumenti in maniera similare, ma attualmente non è così...
A proposito di oggetti, la versione in Pascal non l'ho mai approfondita, ma non ho dubbi che sia fatta bene.

Beh, insomma... Il problema principale è che esistono tante, forse troppe estensioni del Pascal in questo senso.
L'estensione a oggetti del Pascal realizzata dall'ISO è molto elegante, come pure quella realizzata da Borland (ne ha fatte due: la prima è rimasta per compatibilità col passato, anche se ha delle interessanti caratteristiche).
Per quel che ne so, è un peccato che non abbia avuto altrettanto successo l'erede forse più diretto del Pascal standard, il Modula 2 (non vorrei dire castronerie, ma potrebbe essere stato opera di Wirth),

Lo è, come lo sono il Modula, il Modula-3 e l'Oberon.
che ne correggeva i difetti (tipo il mancato controllo sui bound di un intervallo)

Questo è un controllo che, invece, era "di default" nelle specifiche del Pascal, come pure il controllo degli indici degli array. Purtroppo si tratta di controlli molto pesanti computazionalmente, per cui le implementazioni che sono arrivate fino a noi ne hanno fatto a meno, relegando a direttive di compilazione l'uso o meno di queste caratteristiche.
e introduceva la programmazione a oggetti.

Se non erro è stata introdotta col Modula-3 (o forse con Oberon): Modula-2 ha introdotto, invece, il concetto di tipo "opaco" (simile al tipo "generic" di Ada). Se ricordo bene, comunque: è passato parecchio tempo da quando ho studiato questi linguaggi...
Probabilmente fu colpa del nome poco incisivo, chissa, lo avessero chiamato Perfect Pascal, Pascal Plus o Pascal 2...

No, ti posso garantire che Modula-2 ha avuto un discreto successo fra i "pascaliani" e nella comunità scientifica, come pure Oberon. Purtroppo non hanno avuto il successo che meritavano...
fek14 Aprile 2005, 12:24 #159
Originariamente inviato da: cdimauro]Infatti è

Mauro, scrivo le coppie costruttore/distruttore da 15 anni ormai. Uso tutto cio' che mi e' umanamente possibile fare per evitare i double delete e i memory leak, arrivo a nascondere i costruttori/distruttori e costringere la gente a passare attraverso le mie factory class, cerco di recuperare personalmente gli oggetti che la gente si dimentica alla fine del livello eppure... i double delete sono sempre li' e passo ore e giornate a debuggarli. Si parla di un code base di un paio di milioni di righe di codice qui, quasi 30 programmatori, ci vuole il suo tempo a cercare un double delete o un buffer overrun

Molto semplicemente, nel 2005 mi sono stancato di dovere liberare la memoria esplicitamente.

[quote]
Non solo per quello (anche Java è fortemente tipizzato): da tempo, fortunatamente, il Pascal è diventato un linguaggio molto maturo, che mette a disposizione del programmatore tantissimi strumenti che permettono di scrivere codice adottando diverse metodologie / modelli di programmazione.


Domanda a bruciapelo: chi ha progettato il Pascal della Borland?
cdimauro14 Aprile 2005, 14:23 #160
Originariamente inviato da: fek
Mauro,

Cesare, ti prego.
scrivo le coppie costruttore/distruttore da 15 anni ormai. Uso tutto cio' che mi e' umanamente possibile fare per evitare i double delete e i memory leak, arrivo a nascondere i costruttori/distruttori e costringere la gente a passare attraverso le mie factory class, cerco di recuperare personalmente gli oggetti che la gente si dimentica alla fine del livello eppure... i double delete sono sempre li' e passo ore e giornate a debuggarli. Si parla di un code base di un paio di milioni di righe di codice qui, quasi 30 programmatori, ci vuole il suo tempo a cercare un double delete o un buffer overrun

Hai perfettamente ragione. Infatti non volevo mica fornire la ricetta per evitare i memory leak e i double delete: si cerca soltanto di limitarli con qualche attenzione...
Molto semplicemente, nel 2005 mi sono stancato di dovere liberare la memoria esplicitamente.

Quindi cosa hai fatto?
Domanda a bruciapelo: chi ha progettato il Pascal della Borland?

Non me lo ricordo di preciso, purtroppo.
Un vago ricordo che affiora in questo momento mi suona come "Anderson", o giù di lì.
Non voglio andare su www.borland.com perché sarebbe sleale...

P.S. Per caso è la stessa persona che adesso lavora lavora per conto di MS, e che ha progettato .NET?
Circolano queste voci: magari ne sai qualcosa di più...

Devi effettuare il login per poter commentare
Se non sei ancora registrato, puoi farlo attraverso questo form.
Se sei già registrato e loggato nel sito, puoi inserire il tuo commento.
Si tenga presente quanto letto nel regolamento, nel rispetto del "quieto vivere".

La discussione è consultabile anche qui, sul forum.
 
^