IA Coding: sicurezza e strumenti Open Source per generare codice
Nel panorama attuale della programmazione, l’intelligenza artificiale sta rivoluzionando il modo in cui il codice viene scritto e ottimizzato. Gli strumenti open source per la generazione automatica di codice stanno diventando risorse potenti per gli sviluppatori e offrono soluzioni rapide e precise per il coding in una varietà di linguaggi. Nonostante le promesse di questi strumenti, alcuni studi recenti evidenziano come un uso non consapevole possa introdurre vulnerabilità nel software, compromettere i sistemi e scrivere del codice che non rispecchia le best practice per il secure SDCL (software development lifecycle).
In questo articolo esploreremo quindi quali sono le migliori pratiche per utilizzare questi strumenti e ne presenteremo le principali preoccupazioni sulla sicurezza. In secondo luogo, esploreremo alcuni dei modelli open source più innovativi e promettenti, come Code Llama, CodeGeeX, CodeGen, StarCoder2 e InCoder 6B.
Best practice per gli Strumenti AI per il Coding
Per sfruttare al massimo il potenziale degli assistenti AI, gli sviluppatori devono adottare un approccio strutturato e consapevole in tutte le fasi del processo di sviluppo. Di seguito, una guida pratica per un utilizzo efficace e sicuro
- Definizione chiara del compito tramite prompting: formulare prompt precisi e completi, specificando il comportamento atteso e i vincoli tecnici. Ad esempio: “Scrivi una funzione in Python che implementi l’algoritmo X con gestione degli errori e validazione degli input”. Per contestualizzare la richiesta, gli sviluppatori possono includere dichiarazioni di funzione, snippet o commenti di codice già testati: questo aiuta l’AI a generare output più aderenti agli standard di qualità e sicurezza richiesti.
- Iterazione e refinement dell’output: ogni output generato dall’AI deve essere analizzato, testato e affinato attraverso più iterazioni (in genere 4–5) per ottenere una soluzione ottimale. Dopo aver copiato il codice generato nell’editor, è sempre necessario apportare correzioni mirate e riformulare il prompt includendo il contesto delle modifiche, migliorando così sicurezza ed efficienza del codice.
- Ottimizzazione dei parametri dell’AI: Regolare il parametro temperature aiuta a bilanciare creatività e coerenza. Valori più alti generano soluzioni innovative ma potenzialmente meno sicure, mentre valori più bassi favoriscono output più precisi e prevedibili. Inoltre, integrare dettagli specifici nel prompt aiuta a ottenere codice che rispetti requisiti di performance e sicurezza. > Leggi anche: “Tecniche avanzate di Prompt Engineering”
- Utilizzo strategico degli output precedenti: riutilizzare output precedenti come base per nuove richieste è utile, ma richiede un controllo attento per evitare la propagazione di errori. Le modifiche manuali devono essere incorporate nel prompt successivo per garantire una revisione continua. Testare il codice generato con strumenti di analisi statica e dinamica aiuta a individuare vulnerabilità prima della messa in produzione.
Adottando queste strategie, gli sviluppatori possono migliorare qualità, sicurezza ed efficienza del codice, trasformando l’uso degli assistenti AI in un processo proattivo e orientato al risultato.
Generazione di codice non sicuro: rischi e vulnerabilità degli Assistenti AI
Diversi studi dimostrano che gli sviluppatori che utilizzano assistenti AI tendono a produrre codice meno sicuro, soprattutto in compiti relativi a crittografia, firma digitale e gestione di file.
Di seguito, le principali vulnerabilità riscontrate e le loro implicazioni.
- Crittografia e gestione della casualità: gli assistenti AI possono suggerire algoritmi di crittografia obsoleti o insicuri (es. cifrari di sostituzione), privi di meccanismi di autenticazione. Inoltre, l’uso improprio di chiavi prevedibili o IV (Initialization Vector) deboli possono compromettere la sicurezza del sistema.
- Manipolazione non sicura dei file path: la mancata gestione di symlink e percorsi relativi può esporre il sistema ad accessi non autorizzati o attacchi di directory traversal.
- SQL Injection: la concatenazione diretta di input utente nelle query SQL senza adeguata validazione può esporre il database ad attacchi di SQL Injection.
- Vulnerabilità indotte da “Data Poisoning”: dati di addestramento malevoli possono indurre il modello AI a generare codice vulnerabile, con rischi che includono command injection, disabilitazione della validazione dei certificati e deserializzazione non sicura.
- Errori di contesto: sebbene l’AI possa generare codice sintatticamente corretto, spesso manca della comprensione delle specifiche esigenze di sicurezza del contesto applicativo.
- Amplificazione dei problemi tramite iterazioni: l’uso di output precedenti come nuovi prompt può replicare o amplificare le vulnerabilità già presenti.
Oltre l’errore tecnico, si inserisce anche la possibilità dell’errore umano: in particolare, gli sviluppatori meno esperti possono accettare output potenzialmente vulnerabili senza eseguire verifiche adeguate, aumentando il rischio di vulnerabilità non rilevate. Inoltre, i modelli come Codex di OpenAI, addestrati su repository pubblici (es. GitHub), potrebbero non includere le migliori pratiche per la gestione sicura di file, symlink o librerie crittografiche, generando soluzioni funzionanti ma insicure.
> Leggi anche: “Code Review: standard, checklist e strumenti”
Strumenti Open Source per generare codice con l’Intelligenza Artificiale
Nonostante queste preoccupazioni sulla sicurezza, gli strumenti di AI per il coding sono una risorsa preziosa per gli sviluppatori, che possono scrivere codice più velocemente ed evitare errori di sintassi. Ora vediamo quali sono i principali strumenti open source per la generazione del codice.
1. Code Llama di Meta
Code Llama è una famiglia di modelli linguistici di grandi dimensioni (LLM) basata su Llama 2, progettata specificamente per la generazione e comprensione del codice. La famiglia comprende tre varianti principali:
- Code Llama – open foundationals model: le versioni 7B, 13B e 70B supportano il code infilling, ovvero il completamento intelligente del codice all’interno di un file.
- Code Llama – Python: ottimizzato per la generazione di codice Python, con le stesse dimensioni di parametri del modello base.
- Code Llama – Instruct: progettato per seguire istruzioni umane con maggiore sicurezza e affidabilità. Adatto a scenari in cui è richiesta un’interazione più controllata con il modello.
I modelli raggiungono prestazioni all’avanguardia tra i modelli open source su vari benchmark. Una caratteristica distintiva è la capacità di gestire contesti di input molto lunghi (fino a 100.000 token). Questo permette di ragionare a livello di intero repository anziché solo su singole funzioni o file. Code Llama è stato addestrato su 500 miliardi di token (1 trilione per la versione 70B), provenienti principalmente da codice pubblicamente disponibile e da una quota di linguaggio naturale legato alla programmazione.
CodeGeeX
CodeGeeX è un modello linguistico di grandi dimensioni (LLM) con 13 miliardi di parametri, sviluppato specificamente per la generazione di codice multilingue. Addestrato su oltre 850 miliardi di token provenienti da 23 linguaggi di programmazione ( tra cui Python, C++, Java, JavaScript e Go), si distingue per la sua capacità di scrivere codice in diversi linguaggi e tradurre automaticamente tra di essi.
Un aspetto chiave di CodeGeeX è che i suoi pesi e il codice sono pubblicamente disponibili per scopi di ricerca, rendendolo una risorsa open source preziosa per la comunità degli sviluppatori.
Sul piano tecnico, CodeGeeX si basa su un’architettura Transformer decoder-only con 39 livelli che incorpora self-attention multi-head, layer MLP, normalization e connessioni residue. Per quanto riguarda la tokenizzazione, CodeGeeX si basa sul tokenizer GPT-2 (BPE) con un vocabolario di 52.224 token, capace di gestire token in più lingue naturali e migliorare così la comprensione contestuale del codice.
Gli sviluppatori possono accedere facilmente a CodeGeeX grazie alle estensioni gratuite disponibili per i principali ambienti di sviluppo come Visual Studio Code, JetBrains e Tencent Cloud Studio. Queste estensioni offrono funzionalità avanzate come il completamento del codice, la generazione a livello di funzione, la traduzione automatica tra linguaggi, la spiegazione del codice e prompting personalizzabile.
CodeGen di Salesforce
CodeGen è un modello linguistico di grandi dimensioni (LLM) open source, sviluppato dal team AI di Salesforce, progettato per la comprensione e generazione di codice. Una variante di CodeGen ottimizzata per Apex (il linguaggio di programmazione di Salesforce) è attualmente impiegata in Einstein for Developers, l’assistente AI per sviluppatori di Salesforce.
Sono state rilasciate tre versioni principali di CodeGen:
- CodeGen 1.0: Rilasciato all’inizio del 2022, era all’epoca il più grande LLM open source con fino a 16 miliardi di parametri.
- CodeGen 2.0: Rilasciato all’inizio del 2023, presentava una qualità migliorata e ha iniziato a essere utilizzato internamente in Salesforce come strumento di sviluppo potenziato dall’AI. Ha dimostrato la capacità di far risparmiare circa 90 minuti al giorno per ogni sviluppatore.
- CodeGen 2.5: Rilasciato nel luglio 2023, questo modello è stato ottimizzato per casi d’uso in produzione. Oltre a fornire risposte di alta qualità, si caratterizza anche per la bassa latenza, un fattore importante per l’esperienza utente e le metriche di costo.
StarCoder2
StarCoder2 rappresenta una delle evoluzioni più significative nel panorama degli strumenti open source per la generazione di codice con AI. Sviluppato dalla collaborazione tra Hugging Face, ServiceNow e Nvidia, questo modello si posiziona come un concorrente diretto di strumenti proprietari come GitHub Copilot, combinando prestazioni avanzate e licenza aperta.
Disponibile in tre versioni (3B, 7B e 15B parametri), StarCoder2 è addestrato sul dataset Stack v2, il più grande corpus open per l’addestramento di LLM nel coding, sette volte più ampio della precedente versione. La variante da 15 miliardi di parametri supporta 619 linguaggi di programmazione. Uno dei principali punti di forza è la lunghezza del contesto, che raggiunge 8.000 token, che permette di:
- Generare codice con riferimenti a librerie esterne
- Refactorizzare codice legacy
- Documentare automaticamente interi moduli
Queste caratteristiche rendono StarCoder2 uno strumento open source di livello enterprise, ideale per progetti complessi.
InCoder 6B
InCoder 6B, sviluppato da Meta, introduce un approccio innovativo alla generazione di codice grazie al quale è possibile inserire e modificare codice in qualsiasi punto di un file esistente, mantenendo una coerenza contestuale bidirezionale.
Questo approccio rende il modello estremamente versatile e permette operazioni di infilling. InCoder è stato addestrato su 28 linguaggi di programmazione, utilizzando codice open source proveniente da piattaforme come GitHub e Stack Overflow. La sua architettura decoder-only con 6 miliardi di parametri è ottimizzata per l’esecuzione su GPU consumer, per garantire alte prestazioni con un basso consumo di memoria.
La sua capacità di lavorare con codice parziale lo rende particolarmente utile in ambienti di sviluppo interattivi, dove gli sviluppatori apportano modifiche iterative senza dover ricostruire l’intero file.
L’adozione di strumenti open source basati sull’intelligenza artificiale per la generazione di codice rappresenta una vera e propria rivoluzione nel mondo dello sviluppo software. I modelli avanzati stanno cambiando il modo in cui i programmatori scrivono, modificano e ottimizzano il codice, offrendo soluzioni sempre più precise e rapide. Sebbene ciascun strumento abbia le proprie peculiarità e punti di forza, tutti condividono il potenziale di semplificare attività complesse, ridurre gli errori e accelerare i tempi di sviluppo. Tuttavia, è fondamentale che gli sviluppatori siano consapevoli delle sfide legate alla sicurezza e all’affidabilità del codice generato, utilizzando questi strumenti come supporto piuttosto che come sostituto completo del processo di sviluppo.
Fonti:
Cambaz, D., & Zhang, X. (2024, March). Use of AI-driven code generation models in teaching and learning programming: a systematic literature review. In Proceedings of the 55th ACM Technical Symposium on Computer Science Education V. 1 (pp. 172-178).
Cotroneo, D., Improta, C., Liguori, P., & Natella, R. (2024, April). Vulnerabilities in ai code generators: Exploring targeted data poisoning attacks. In Proceedings of the 32nd IEEE/ACM International Conference on Program Comprehension (pp. 280-292).
Denny, P., Leinonen, J., Prather, J., Luxton-Reilly, A., Amarouche, T., Becker, B. A., & Reeves, B. N. (2024, March). Prompt Problems: A new programming exercise for the generative AI era. In Proceedings of the 55th ACM Technical Symposium on Computer Science Education V. 1 (pp. 296-302).
Perry, N., Srivastava, M., Kumar, D., & Boneh, D. (2023, November). Do users write more insecure code with AI assistants?. In Proceedings of the 2023 ACM SIGSAC conference on computer and communications security (pp. 2785-2799).
Roziere, B., Gehring, J., Gloeckle, F., Sootla, S., Gat, I., Tan, X. E., … & Synnaeve, G. (2023). Code llama: Open foundation models for code. arXiv preprint arXiv:2308.12950.
Wang, R., Cheng, R., Ford, D., & Zimmermann, T. (2024, June). Investigating and designing for trust in AI-powered code generation tools. In Proceedings of the 2024 ACM Conference on Fairness, Accountability, and Transparency (pp. 1475-1493).