Bug dei microprocessori

Bug dei microprocessori

Meltdown e Spectre sono vulnerabilità hardware scoperte dai ricercatori di Project Zero di Google, rese pubbliche il 3 gennaio 2018 tramite rumors diffusi su social, web e programmi tv. Google spiega che malintenzionati possono sfruttare la "speculative execution". Questa consiste nell'esecuzione di frammenti di codice il cui risultato è utile solo quando l'esecuzione anticipata delle istruzioni utilizza meno spazio e meno tempo in fase di lettura della memoria di sistema. Tale procedura è utilizzata in maniera malevola per leggere dati sensibili nella memoria di sistema, come password, chiavi crittografiche o eventuali informazioni sensibili nei software “aperti”. Tali vulnerabilità interessano molte CPU e inoltre coinvolgono i dispositivi e i sistemi operativi da esse eseguiti. A seguito di alcuni aggiornamenti e di alcuni studi effettuati nell’ultimo periodo, le case produttrici stanno correndo ai ripari. Ad esempio, AMD afferma che i propri processori sono risultati vulnerabili a Spectre ma non a Meltdown. Le GPU Nvidia, invece, non sono colpite da Meltdown e Spectre ma comunque Nvidia ha aggiornato i propri driver per mitigare l'impatto dell'attacco Spectre. Apple ha confermato che le vulnerabilità interessano tutti i dispositivi presenti sul mercato che eseguono iOS e macOS ma sta rilasciando continui aggiornamenti per arginare il problema. Per verificare se il proprio sistema è colpito da tale bug si può seguire questa semplice guida:

Aprire una finestra di PowerShell con i permessi di amministratore (tasto destro, Esegui come amministratore) 

(clicca immagine per ingrandire)

Esecuzione powershell come amministratore

Digitare il comando "Install-Module SpeculationControl".

Quando richiesto, confermare (digitando S e premendo Invio) l'utilizzo del provider NuGet e in un secondo momento dell'archivio non attendibile.  (clicca immagine per ingrandire)

Digitare il comando "Get-ExecutionPolicy" per verificare se si hanno i permessi di esecuzione degli script esterni. Nel caso in cui non si abbiano i permessi, digitare "Set-ExecutionPolicy RemoteSigned"  (clicca immagine per ingrandire)

Successivamente, si può avviare lo script vero e proprio, tramite i comandi "Import-Module SpeculationControl" e in seguito "Get-SpeculationControlSettings"  (clicca immagine per ingrandire)

La voce "Windows OS support for branch target injection mitigation"  con valore True indica che si sono installate le patch Microsoft. Il valore False indica invece l'assenza dell'aggiornamento. "Hardware support for branch target injection mitigation" suggerisce l’installazione dell'aggiornamento del firmware (UEFI/BIOS) per proteggersi da Spectre. Per una protezione completa, quindi, basterà far riferimento al sito ufficiale del produttore del PC, dispositivo o scheda madre cercando un aggiornamento del BIOS che nel proprio "changelog" presenti un riferimento all'introduzione del "microcode Intel aggiornato a gennaio 2018". In alternativa è possibile affidarsi ad un’azienda informatica che sia in grado di garantire la protezione dell’integrità fisica (hardware) e logico-funzionale (software) dei sistemi coinvolti.

Pubblicato il 19 gen 2018

Potrebbero interessarti

CMS headless: gestori di contenuto per le moderne esigenze

Lo sviluppo tecnologico ha portato a dover trasferire contenuti e dati attraverso piattaforme e canali di comunicazione differenti. Anche la gestione del flusso dei dati sul web si è evoluta. I CMS tradizionali non riescono a soddisfare le esigenze moderne per la loro struttura monolitica che prevede la gestione e la visualizzazione dei dati in un unico software. Per questo motivo sono nati i CMS headless, ovvero “senza testa”, poiché la parte di presentazione dei dati (Content Delivery Application) non è presente nel sistema che, è composta dalla sola parte di gestione dei contenuti (Content Management Application).  Il contenuto di questo tipo di CMS si può considerare puro e permette in una sola istanza di essere visualizzato su diverse piattaforme quali siti web, smartphone, tablet e device IoT. I servizi sono offerti mediante delle API di tipo REST basate sul protocollo HTTP. Le diverse operazioni di CRUD sui dati vengono effettuate chiamando il giusto URL che farà da endpoint e utilizzando uno specifico verbo HTTP quali GET, POST, PUT e DELETE. Focalizzandosi solo sulla parte di gestione dei contenuti, il CMS headless è un sistema più semplice di uno tradizionale riuscendo quindi ad offrire i suoi servizi mediante un numero più basso di operazioni. I contenuti possono essere offerti dividendo il carico di gestione e flusso dei dati utilizzando un CDN (Content Delivery Network), il quale permette di ridurre gli attacchi di tipo DDOS. La sua flessibilità permette di sviluppare dei frontend con qualsiasi tecnologia e di facilitarne un loro possibile aggiornamento, senza aver bisogno di dover aggiornare anche il backend. In conclusione possiamo affermare che la tendenza è sempre più quella di sviluppare sistemi di questo tipo o talvolta di tipo ibrido. Non è un caso che alcuni tra i CMS di maggior rilievo come WordPress e Drupal si stiano spostando anch’essi verso questa direzione.

La continua evoluzione dei linguaggi di programmazione

La figura del programmatore software da diversi anni mantiene la sua posizione tra i lavori più pagati al mondo ma è difficile che si possa guadagnare da vivere con i linguaggi appresi all’università. È, invece, molto probabile che egli debba aggiornare le proprie competenze. Secondo l’ufficio di statistica del lavoro americano (Us Bureau of Labor Statistics) la richiesta di sviluppatori web è incrementata del 20% negli ultimi 10 anni, raddoppiando l’indice di crescita di ogni altra occupazione. Vediamo dunque quali sono i linguaggi più richiesti nel 2018: -SQL: vince a mani basse, da anni. Se il web è un database, il linguaggio più richiesto in assoluto non può che essere quello per la realizzazione di database; -JAVA: dopo i database, sul secondo gradino del podio si posiziona IoT, ossia un’evoluzione della rete che si integra con gli oggetti, dandogli la possibilità di comunicare tra loro attraverso un’intelligenza intrinseca; -PHYTON: linguaggio di programmazione moderno e potente ma allo stesso tempo abbastanza facile da imparare. Prende il nome dalla passione per i Monty Python del suo creatore Guido van Rossum; -JAVASCRIPT: a differenza di Java, è utilizzato soprattutto nello sviluppo della parte esteriore di siti e pagine web. La sua popolarità continua a crescere, grazie alla semplicità e alla versatilità che ne consente l’utilizzo anche per le app; -C++: l’erede del C, il padre di tutti i linguaggi di programmazione, mantiene alta la reputazione di una concezione geniale, sublimazione tra semplicità e potenza. Il C++ è molto utilizzato soprattutto per costruire i motori grafici dei videogiochi ma anche per servizi web. Se lo si impara bene, Python o JavaScript saranno una passeggiata; -C# e SWIFT: chiunque decida di programmare in Windows e iOS dovrà mettere in conto di imparare rispettivamente C# e Swift perché questi due ambienti necessitano di competenze particolari; -PHP: da una recente stima, circa l’80% dei siti Internet utilizza PHP principalmente perché è stato uno dei primi linguaggi di programmazione a diffondersi in quello specifico ambito; -GO: è uno degli ultimi linguaggi di programmazione presentato da Google con l’intento di realizzare un modo di programmare adatto a computer e dispositivi con scarse capacità di calcolo. Dunque l’informatica è un campo in continuo aggiornamento, l’hardware si evolve continuamente così come i linguaggi di programmazione. La figura del programmatore prevede un continuo apprendimento.  Quello che oggi il programmatore apprende potrebbe non servire più nei prossimi 10 anni, ma d'altronde il cambiamento è l’unica costante della nostra vita ed è anche un prezzo da pagare per il successo!

IL RUOLO DEI COMPILATORI NELLE ARCHITETTURE RICONFIGURABILI

L'hardware riconfigurabile è di fatti una realtà in continua evoluzione e crescita. I dispositivi FPGA trovano sempre maggior impiego nelle diverse realtà tecnologiche, quali ad esempio datacenter e IoT. La riconfigurazione dell'hardware comporta diversi vantaggi in termini prestazionali. Infatti un FPGA può essere programmato in due modi diversi tali da consentire di rispettare gli stessi requisiti funzionali con performance diverse. Tra queste gioca un ruolo fondamentale il consumo di potenza, argomento ampiamente di attualità visto l'utilizzo sempre più frequente e frenetico di dispositivi mobili che necessitano di un'alimentazione tale da garantirne l'uso per almeno un'intera giornata. Tra le possibilità che un FPGA offre, in base alla sua caratteristica di riconfigurabilità, c'è quella di progettare un'architettura fortemente dinamica capace di riconfigurarsi continuamente in base al tipo di applicazione che deve essere processata. Semplificando con un esempio, si pensi alla possibilità di avere un elemento di processamento che si comporti come una GPU quando si elaborano applicazioni fortemente grafiche e come un processore in caso di elaborazioni che richiedono più logica di controllo che processamento massivo. Affinché tale architettura possa essere realizzata è necessario prevedere un meccanismo capace di collegare la parte software delle diverse applicazioni con quella hardware che è riconfigurabile. Tale strato è identificabile attraverso un compilatore che deve essere capace di tradurre nella maniera corretta ed ottimizzata le applicazioni in codice macchina, interpretabile dall'architettura sottostante che essendo riconfigurabile cambierà di volta in volta. Esistono delle toolchain di compilatori che consentono la realizzazione di questo modello. Tali toolchain prevedono sostanzialmente due componenti fondamentali che sono la parte di front-end e quella di back-end. In particolare, la prima consente la traduzione del codice sorgente in un linguaggio di rappresentazione intermedia, definito in genere dalla toolchain stessa. In questo modo è possibile ottenere la stessa rappresentazione per sorgenti provenienti da linguaggi di programmazione differenti. Ovviamente è necessario che la toolchain preveda un compilatore di front-end per ognuno dei linguaggi di programmazione sorgenti supportati. La parte di back-end invece, partendo dalla rappresentazione intermedia che viene prodotta dal componente di front-end, deve produrre del linguaggio macchina (sequenze di bit!) interpretabile dall'architettura sottostante. Dal momento che la nostra architettura è di tipo riconfigurabile è necessario implementare la parte di back-end del compilatore in maniera parametrica, ovvero capace di conoscere di volta in volta i parametri che descrivono in modo completo l'architettura per cui deve essere prodotto il codice macchina. Le piattaforme eterogenee e le architetture riconfigurabili saranno probabilmente la nuova frontiera da perseguire per ottimizzare le performance nei sistemi di elaborazione. Pertanto, in un certo senso, l'oggettiva distanza che esiste tra hardware e software potrebbe ridursi attraverso l'implementazione di piattaforme che richiedono hardware descritto via software e software tradotto in base all'hardware sottostante.