Gepubliceerd op: 06 februari 2025
Expert:
Balazs Kiss
Trainer
Lees meer over Balazs Kiss
Deel

Nu AI-technologieën worden ingebed in softwareontwikkelingsprocessen vanwege hun productiviteitswinst, worden ontwikkelaars geconfronteerd met complexe beveiligingsuitdagingen. Ga mee met Balázs Kiss en verken de essentiële beveiligingspraktijken en herinneringstechnieken die nodig zijn om AI verantwoord en effectief te gebruiken.

Het gebruik van kunstmatige intelligentie (AI) bij de ontwikkeling van software is de afgelopen jaren toegenomen. Zoals met elke technologische vooruitgang, brengt dit ook implicaties voor de beveiliging met zich mee. Balázs Kiss, product development lead bij de Hongaarse aanbieder van opleidingen Cydrill Software Security, had de beveiliging van machine learning al onder de loep genomen vóór de wijdverspreide aandacht voor generatieve AI. “Terwijl iedereen het tegenwoordig heeft over grote taalmodellen, lag de focus in 2020 voornamelijk op machine learning, waarbij de meeste gebruikers wetenschappers op R&D-afdelingen waren.”

Toen Kiss de stand van de techniek onderzocht, ontdekte hij dat veel fundamentele concepten uit de softwarebeveiligingswereld werden genegeerd. “Aspecten zoals inputvalidatie, toegangscontrole, beveiliging van de toeleveringsketen en het voorkomen van overmatig gebruik van bronnen zijn belangrijk voor elk softwareproject, inclusief machine learning. Dus toen ik me realiseerde dat mensen zich niet aan deze praktijken hielden in hun AI-systemen, heb ik gekeken naar mogelijke aanvallen op deze systemen. Het resultaat is dat ik er niet van overtuigd ben dat machine learning veilig genoeg is om te gebruiken zonder menselijk toezicht. AI-onderzoeker Nicholas Carlini van Google Deepmind vergeleek de huidige staat van ML-beveiliging zelfs met de begindagen van cryptografie vóór Claude Shannon, zonder sterke algoritmen ondersteund door een rigoureuze wiskundige basis.”

Met de toename in populariteit van grote taalmodellen merkte Kiss dat dezelfde fundamentele beveiligingsproblemen weer opdoken. “Zelfs dezelfde namen doken op in onderzoekspapers. Carlini was bijvoorbeeld betrokken bij het ontwerpen van een aanval om automatisch jailbreaks te genereren voor elke LLM – een afspiegeling van aanvallen van tegenstanders die al een decennium worden gebruikt tegen computervisiemodellen.”

Gefabriceerde afhankelijkheden

Wanneer ontwikkelaars momenteel een LLM gebruiken om code te genereren, moeten ze onthouden dat ze in wezen een geavanceerde autoaanvulfunctie gebruiken. “De uitvoer zal lijken op code waarop het is getraind, en ziet er heel overtuigend uit. Dat is echter geen garantie voor correctheid. Wanneer een LLM bijvoorbeeld code genereert die een bibliotheek bevat, verzint het vaak een valse naam omdat het een woord is dat logisch is in die context. Cybercriminelen maken nu bibliotheken met deze fictieve namen, sluiten malware in en uploaden deze naar populaire code-repositories. Dus als je deze gegenereerde code gebruikt zonder het te verifiëren, kan je software onbedoeld malware uitvoeren.”

In de VS heeft het National Institute of Standards and Technology (NIST) zeven essentiële bouwstenen van verantwoorde AI geschetst: validiteit en betrouwbaarheid, veiligheid, beveiliging en veerkracht, controleerbaarheid en transparantie, uitlegbaarheid en interpreteerbaarheid, privacy en eerlijkheid met beperking van schadelijke vooroordelen. “De aanval met gefabriceerde bibliotheken is een voorbeeld waarbij veiligheid en veerkracht in het gedrang komen, maar de andere bouwstenen zijn net zo belangrijk voor betrouwbare en verantwoorde AI. Validiteit en betrouwbaarheid’ betekent bijvoorbeeld dat resultaten consistent correct moeten zijn: de ene keer een correct resultaat krijgen en de volgende keer dat je de LLM vraagt om dezelfde taak uit te voeren, is niet betrouwbaar.”

''If you’re aware of the type of vulnerabilities you can expect, such as cross-site scripting vulnerabilities in web applications, specify them in your questions.''

Wat bias betreft, dit wordt vaak begrepen in andere domeinen, zoals grote taalmodellen die stereotype veronderstellingen over beroepen van mannen en vrouwen uitdrukken. Een dataset met code kan echter ook bias vertonen, legt Kiss uit. “Als een LLM alleen is getraind op open-source code van Github, kan het bevooroordeeld zijn ten opzichte van code die dezelfde bibliotheken gebruikt als de code waarop het is getraind, of code met Engelse documentatie. Dit beïnvloedt het type code dat de LLM genereert en zijn prestaties op taken die worden uitgevoerd op code die afwijkt van wat hij heeft gezien in zijn trainingsset, waardoor hij het mogelijk slechter doet wanneer hij interfaced met een aangepaste closed-source API.”

Balasz Kiss
Credits: Egressy Orsi Foto

Effectief vragen stellen

Volgens Kiss zijn veel best practices voor het verantwoord gebruik van AI in softwareontwikkeling niet nieuw. “Valideer gebruikersinvoer in je code, controleer bibliotheken van derden die je gebruikt, controleer op kwetsbaarheden – dit is allemaal algemeen bekend in het beveiligingsdomein. Er zijn veel tools beschikbaar om te helpen bij deze taken.” Je kunt zelfs AI gebruiken om AI-gegenereerde code te verifiëren, stelt Kiss voor. “Voer de gegenereerde code terug naar het systeem en vraag het om kritiek. Zijn er problemen met deze code? Hoe zouden die opgelost kunnen worden?” De resultaten van deze aanpak kunnen heel goed zijn, stelt Kiss, en hoe preciezer je vragen zijn, hoe beter de prestaties van de LLM. “Vraag niet alleen of de gegenereerde code veilig is. Als je je bewust bent van het soort kwetsbaarheden dat je kunt verwachten, zoals cross-site scripting kwetsbaarheden in webapplicaties, specificeer deze dan in je vragen.”

Er zijn veel best practices in opkomst voor het maken van effectieve prompts, oftewel de vragen die je voorlegt aan de LLM. One-shot of few-shot prompting, waarbij je één of enkele voorbeelden van de verwachte uitvoer aan de LLM geeft, is volgens Kiss een krachtige techniek om betrouwbaardere resultaten te verkrijgen. “Als je code op dit moment bijvoorbeeld XML-bestanden verwerkt en je wilt overschakelen op JSON, dan kun je simpelweg vragen om de code te transformeren om JSON te verwerken. De gegenereerde code zal echter veel beter zijn door een voorbeeld van je gegevens in XML-formaat toe te voegen naast dezelfde gegevens in JSON-formaat en te vragen om code om gegevens in plaats daarvan in JSON te verwerken.”

''With the present state of generative AI, it’s possible to write code without understanding programming. However, if you don’t understand the generated code, how will you maintain it?''

Een andere nuttige promptingtechniek is chain-of-thought prompting – een LLM opdragen om zijn redeneerproces voor het verkrijgen van een antwoord te laten zien, waardoor het resultaat wordt verbeterd. Kiss heeft deze en andere promptingtechnieken, naast belangrijke valkuilen, samengebracht in een eendaagse training over verantwoorde AI in softwareontwikkeling aan het High Tech Institute. “Zo zijn unit tests die door een LLM worden gegenereerd vaak nogal repetitief en dus niet zo nuttig. Maar de juiste prompts kunnen ze verbeteren, en je kunt ook aan testgedreven ontwikkeling doen door zelf de unit tests te schrijven en de LLM te vragen de bijbehorende code te genereren. Deze methode kan heel effectief zijn.”

Hier blijven

Met al deze voorzorgsmaatregelen kun je je afvragen of de grote belofte van AI-codegeneratie, verhoogde productiviteit van ontwikkelaars, nog steeds geldt. “Een recent onderzoek op basis van gerandomiseerde gecontroleerde onderzoeken bevestigt dat het gebruik van generatieve AI de productiviteit van ontwikkelaars met 26 procent verhoogt,” merkt Kiss op, met nog grotere voordelen voor minder ervaren ontwikkelaars. Toch waarschuwt hij dat dit een valkuil kan zijn voor jonge ontwikkelaars. “Met de huidige stand van generatieve AI is het mogelijk om code te schrijven zonder verstand te hebben van programmeren. Prominent AI-onderzoeker Andrej Karpathy merkte zelfs op: ‘De populairste nieuwe programmeertaal is Engels’. Maar als je de gegenereerde code niet begrijpt, hoe wil je die dan onderhouden? Dit leidt tot technische schuld. We weten nog niet welk effect het langdurige gebruik van deze tools zal hebben op onderhoudbaarheid en robuustheid.”

Hoewel het gebruik van AI bij de ontwikkeling van software een aantal problemen met zich meebrengt, is het volgens Kiss ongetwijfeld een blijvertje. “Ook al lijkt het vandaag op een zeepbel of een hype, er zijn aantoonbare voordelen en de technologie zal breder geaccepteerd worden. Veel tools die we vandaag zien, zullen worden verbeterd en zelfs worden ingebouwd in geïntegreerde ontwikkelomgevingen. Microsoft integreert zijn Copilot al strak in zijn Visual Studio producten, en ze zijn niet de enige. Menselijk toezicht zal echter altijd nodig blijven; uiteindelijk is AI slechts een hulpmiddel, net als elk ander hulpmiddel dat ontwikkelaars gebruiken. En LLM’s hebben inherente beperkingen, zoals hun neiging om te ‘hallucineren’ – verzinsels te creëren. Zo werken ze nu eenmaal vanwege hun probabilistische aard en gebruikers moeten zich hier altijd van bewust zijn als ze ze gebruiken.”

Dit artikel is geschreven door Koen Vervloesem, freelancer voor Bits&Chips.

 

De training 'Verantwoord AI in softwareontwikkeling' wordt twee keer per jaar gehouden