Code injection

L’ultimo anno ha visto un revival di tecniche di hacking tra le più gettonate dei primi anni duemila: le Code Injection.

Queste, come altre tecniche affini, prendono di mira gli errori nella scrittura del codice di software e web app, arrivando a comprometterne gravemente l’integrità.

Per fortuna, negli anni sono state regolamentate ‘best practices’, regole di buona programmazione, che ne hanno ridotto di molto l’efficacia.

Nonostante ciò, le Code injection si rivelano uno strumento sempre in voga nel mondo del cybercrime, in quanto

  • si dimostrano spesso molto efficaci
  • e possono colpire praticamente ogni tipo di applicativo: siti, blog, e-commerce, ma anche applicazioni di sistema.

Risulta dunque indispensabile imparare a conoscerli per poterli prevenire al meglio.

Cosa si intende per code injection

La Code injection è una tecnica di attacco informatico che sfrutta imperizie nella stesura di un codice al fine di immettere script malevoli all’interno di applicativi web.

Questi script hanno il compito di alterare la normale esecuzione del codice, creando falle nella sicurezza che potranno poi essere sfruttate per sferrare attacchi più strutturati.

Un esempio è la tecnica Early Bird, chiamata così perché si inserisce codice malevolo all’interno di un processo, ben prima che i sistemi di sicurezza entrino in azione sullo stesso.

È questa una strategia che permette di rendere l’attacco invisibile, cosicché si creino le condizioni ottimali per un suo proseguimento indisturbato. Il codice sorgente, infatti, interpreterà gli script maliziosi inseriti come parte integrante del programma, eseguendo funzionalità anomale dettate dall’attaccante.

Ci sono evidenze di utilizzo di questa tecnica in alcuni malware come Dorkbot e la backdoor TurnedUp, come riportato da hackernews.com.

Spesso, se la falla del codice è severa, c’è la possibilità che lo script iniettato dall’hacker possa appropriarsi di dati sensibili o addirittura arrivare al completo takeover di un sito.

È quanto successo a giugno 2022 con una vulnerabilità critica nel plug-in Ninja Forms di WordPress (peraltro prontamente sanata dal suo gruppo di sviluppo) che poteva consentire a script malevoli di modificare intere classi nel codice con conseguenze fatali.

La versatilità di questo tipo di attacchi deriva anche dal fatto che l’hacker è limitato solamente dalle potenzialità del linguaggio di programmazione utilizzato. In altre parole: l’attaccante che riesce ad effettuare l’injection può ottenere tutto ciò che il linguaggio usato gli permette di ottenere.

Per avere un metro di paragone, si può fare riferimento alle Command Injection, che invece sono più vincolate alla logica già presente nel sistema sotto attacco.

Già dalla definizione generale, dunque, si può intuire che il termine code injection racchiude in sé molte tecniche diverse.

Attenendoci all’ambito web, tra le più importanti si annoverano:

  • XSS (cross site scripting), agevolato da vulnerabilità lato client.
  • SQL Injection, che sfrutta vulnerabilità lato server.

Code injection: come agiscono?

A questo punto risulta doveroso indagare più a fondo il loro funzionamento, in modo da capire quali siano le tecniche messe a punto dai pirati informatici in un attacco di tipo Code injection

XSS

A seconda di come viene sfruttata la vulnerabilità, questa tecnica è distinta in due tipologie principali:

  • Reflected XSS
  • Stored XSS

Analizziamole nel dettaglio.

Reflected XSS

In questo caso, l’applicazione prende i dati in input e li ripropone in pagina senza averli prima sanificati.

L’attaccante può allora sfruttare questa mancanza e mandare a vari contatti dei link appositamente creati per reindirizzare la vittima verso il sito vulnerabile. Questi collegamenti presentano dei parametri modificati, persino interi script JavaScript racchiusi negli appositi tag HTML. Di conseguenza l’utente andrà a visitare una versione modificata dell’applicazione.

A titolo di esempio, si potrebbe immaginare una pagina che presenta un form creato dall’hacker, ma che non esiste nel documento che il server (il sito) consegna al browser (l’utente).

Questo form, com’è ovvio, estorcerà illegalmente dati sensibili poiché indirizzato verso un sito esterno creato ad hoc dall’attaccante.

Stored XSS

Durante un attacco Stored XSS, l’hacker, sfruttando imperizie strutturali, riesce a far passare al database delle istruzioni malevole.

Ogni volta che un browser richiede dei documenti (le pagine), queste istruzioni vengono caricate ed eseguite come se facessero parte del codice originale.

Le Stored XSS colpiscono tutti gli utenti che si collegano alle pagine infette, espandendosi, dunque, in maniera repentina.

Anche qui, come nel caso delle Reflected XSS, c’è il rischio di consegnare informazioni sensibili nelle mani di malintenzionati.

SQL INJECTION

Il tema ricorrente nelle Code injections è quello degli input non sanificati a dovere, ovvero codice non opportunamente ricontrollato e ripulito da eventuali falle.

Nel caso delle SQL Injections l’attaccante tenta di ‘comunicare’ direttamente con il database dell’applicazione e per farlo utilizza, appunto, il linguaggio SQL.

Invece di tag HTML o script, vengono inserite queries, cioè richieste,  all’interno dei campi di input.

Se non sono presenti precauzioni, l’attaccante a quel punto potrà:

  • modificare alcune tabelle del database,
  • eliminarne intere sezioni
  • o addirittura figurare come utente registrato senza aver immesso alcun tipo di credenziale.

Perché si verificano le code injection

In generale, gli attacchi di tipo code injection sono resi possibili dalla scarsa accuratezza nella sanificazione dei dati immessi dagli utenti.

Ogni volta che nell’app è previsto l’inserimento di dati da parte di un utente, bisognerebbe seguire delle fondamentali regole di programmazione atte a rendere innocuo l’input esterno.

A tal proposito, è bene sottolineare ancora una volta che le vulnerabilità sono correlate al linguaggio di programmazione utilizzato.

Ogni linguaggio, infatti, ha delle funzioni preimpostate messe a disposizione dei programmatori.

Se queste funzioni non sono usate correttamente possono rappresentare dei punti deboli nel codice, specialmente se il loro compito è maneggiare dati provenienti da campi di input.

Per contestualizzare, basta pensare alla diatriba sull’utilizzo della funzione eval() in JavaScript: questa, infatti, può dare modo a qualunque malintenzionato di far eseguire il codice malizioso senza sforzi, se le viene passato come parametro un input esterno non sanificato.

 

Quali sono i rischi

Le azioni di tipo code injection sono notoriamente molto versatili e dirette, dunque, i rischi dipendono molto anche dal contesto generale dell’attacco in cui sono inserite.

Tuttavia, è possibile osservare ed elencare le conseguenze più comuni:

  • perdita di confidenzialità ed integrità dei dati
  • modifica dell’interfaccia dell’applicativo. Come già accennato, i form possono essere contraffatti per reperire quanti più dati possibili e istradarli ad un sito di terzi
  • lettura dei cookie e di dati di sessione, che può consegnare agli hacker le credenziali e i dati sensibili dell’utente
  • reindirizzamenti verso siti terzi, senza autorizzazione da parte dell’utente
  • modifica dei dati contenuti nel database dell’applicazione, che può tradursi anche nella loro completa eliminazione, qualora vi siano pesanti mancanze nella sicurezza

Le ripercussioni, dunque, investono tanto l’applicativo web a livello di funzionalità e sicurezza, quanto l’integrità dei dati di tutti gli utenti che si trovino ad utilizzarlo in seguito all’attacco.

In linea di massima, però, sono proprio gli utenti le vittime principali delle injections.

Ciò non toglie che per le aziende, un attacco che sfrutta una loro piattaforma web per colpire il proprio bacino d’utenza possa rappresentare un importante danno di immagine, nonché economico.

Come prevenire le code injection

Fortunatamente, gli sviluppatori software nel corso degli anni hanno accumulato sempre più consapevolezza nel progettare e scrivere codice a prova di falle e attacchi injection.

Ad oggi, infatti, esistono vere e proprie regole di security by design che, se seguite con perizia, consentono di proteggere l’integrità dei software implementati.

La regola aurea prevede che ogni input richiesto agli utenti debba essere considerato pericoloso.

Pertanto, prima di rendere disponibile su internet il proprio applicativo, bisogna controllare che tutti gli input siano

  • scrupolosamente controllati
  • e ripuliti da eventuali errori.

Questo secondo passaggio, detto in gergo “sanificazione” prevede le seguenti procedure.

Destrutturazione dei tag HTML.

Esistono funzioni preimpostate nei linguaggi di scripting web che consentono di sostituire i tag HTML con le codifiche ASCII dei caratteri che li compongono, in modo tale che non vengano eseguiti dal browser.

Utilizzo di istruzioni preparate (prepared statements)

Vengono usate nella comunicazione con il database e rappresentano una robusta difesa contro le SQL injection. Ogni istruzione destinata alla base dati viene prima interpretata e poi solo successivamente congiunta a delle variabili. Le variabili contengono i dati provenienti dagli input, ovviamente già trattati e sanificati per sicurezza.

Validazione degli input

Si tratta di accertarsi che i dati abbiano la forma giusta per essere maneggiati. Potrebbe, infatti, manifestarsi un concreto rischio di vulnerabilità se nei campi di input non dovessero essere implementate limitazioni su:

  • Caratteri permessi (consentire solo quelli strettamente necessari)
  • Lunghezza dell’input
  • Formattazione dell’input: una mail deve avere testo + @ + testo + . + dominio)
  • Tipi di dato consentiti: un campo username deve restituire una stringa di testo, un campo età un numero intero, ecc..

Verifica degli aggiornamenti dei plug-in di terze parti

È pratica comune inserire alcune componenti già pronte (plug-in) all’interno di siti o app costruiti tramite CMS (WordPress e similari).

I gruppi di sviluppo sono sempre al lavoro per eliminare eventuali vulnerabilità nei loro prodotti, dunque ogni aggiornamento è fondamentale.

Similmente, se si richiedono dei dati da un API di terze parti è bene verificare che il servizio sia affidabile e, nonostante ciò, premurarsi sempre di verificare i dati in arrivo.

Conclusioni

Le Code Injection sono tecniche di attacco longeve e versatili a disposizione degli hacker, che le usano per infliggere significativi danni agli applicativi vulnerabili.

È proprio la loro versatilità a renderle tanto efficaci quanto pericolose, poiché possono colpire indistintamente ogni tipo di applicativo, specialmente se online.

Un’attenta analisi del codice da parte di professionisti e l’eventuale applicazione delle metodologie di security by design può evidenziare possibili imperizie nel trattamento dei dati, terreno fertile per injections di ogni tipo.

Le soluzioni per prevenire le code injections sono di rapida implementazione e possono evitare spiacevoli inconvenienti sia alle aziende che agli utenti: sarà necessario soltanto affidarsi a professionisti esperti in ambito programmazione e cybersecurity.

Cyberment Srl

Cyberment è un’azienda specializzata in consulenza di sicurezza informatica. Il nostro red team è composto da hacker etici e specialisti in cybersecurity che operano in questo settore da oltre 20 anni.

Ci occupiamo di identificare le vulnerabilità informatiche nei sistemi e nelle applicazioni web tramite servizi di Vulnerability Assessment e Penetration Test.

Siamo un’azienda di sicurezza informatica certificata ISO 9001, ISO 27001, nonché azienda etica. Abbiamo sede legale a Milano e sede operativa a Porto Mantovano, mentre Londra è il cuore del nostro reparto ricerca e sviluppo.

Se desideri conoscere in modo approfondito i nostri servizi di prevenzione dalle minacce informatiche, contattaci!