Toen GitHub vorig jaar Copilot uitbracht, werd dat met zowel lof als scepsis ontvangen. Een kunstmatige intelligentie die zelf code schrijft, zou dat wel goed gaan? Niet altijd dus, ontdekten Hammond Pearce en Benjamin Tan. De beveiligingsonderzoekers keken naar de resultaten van Copilot en zagen SQL-injecties en MD5-hashes. Op securityconferentie Black Hat in Las Vegas vertelden ze aan Tweakers hoe ze tot die resultaten kwamen.
Hammond Pearce en Benjamin Tan werken voornamelijk met hardware, zeggen ze, maar raakten toch geïnteresseerd in Copilot. Dat kwam in de zomer van vorig jaar uit. Het heeft inmiddels de bètaperiode verlaten en kost tien dollar per maand. Copilot is een tool op basis van machinelearningmodel GPT-3. De tool kan code 'schrijven' die wordt gegenereerd op basis van openbare repo's op GitHub. De meningen over Copilot zijn gepolariseerd. Aan de ene kant zijn er hardcorefans die een grote toekomst zien in tools die zelf code genereren, maar daar staan sceptici tegenover die risico's zien voor bijvoorbeeld auteursrecht, of, zoals Pearce, op het gebied van security. Pearce, Tan en hun collega's kregen al vroeg na de introductie toegang tot de tool en gingen ermee aan de slag.
Common Weakness Enumerations
Tweakers op Black Hat en DEF CON
Tweakers is deze week op de beveiligingsconferenties Black Hat en DEF CON in Las Vegas. Black Hat is een conferentie voor securityprofessionals, waar onderzoek wordt gepresenteerd maar ook bedrijven nieuwe tools presenteren. DEF CON vindt in de dagen erna plaats en is een typisch hackersfeest met hackathons en villages waar hard- en software wordt gekraakt.
De eerste resultaten waren al niet al best, zegt Hammond. Hij vond al snel een SQL-injectie in een stuk code dat hij genereerde. Pearce is niet de meest voordehandliggende persoon om een dergelijke tool te testen. Hij is research assistent professor aan de New York University en houdt zich daar voornamelijk bezig met hardwarebeveiliging, niet met softwareontwikkeling. "Maar ik werkte daarvoor wel in de commerciële sector en schreef weleens webapps", zegt hij. "Daardoor ben ik bekend geraakt met dingen als SQL." Hij redeneerde, samen met Tan en andere collega's, dat een tool als Copilot automatisch ook foutieve resultaten kan geven en misschien zelfs gevaarlijke software zou afleveren. Ze besloten de proef op de som te nemen en te kijken naar een aantal Common Weakness Enumerations. Zulke CWE's worden opgesteld door Mitre en zijn een classificatie van veelvoorkomende kwetsbaarheden. Net zoals HTTP statuscodes als 404 of 503 heeft, is er een CWE-787 die staat voor een out-of-bounds-writekwetsbaarheid of CWE-287 voor een foutieve authenticatiemethode.
Pearce en Tan gaven Copilot voorzetten die een werkende code moesten opleveren; elke voorzet moest leiden tot een andere CWE-code. Voor iedere CWE lieten ze Copilot 25 stukken code aanmaken.
Werkt het wel?
Om de resultaten van de output te classificeren, keken ze naar drie dingen. Het eerste, niet onbelangrijk, was of de code zou werken. "Je moet het door een parser kunnen halen en zorgen dat het werkt", legt Pearce uit. De onderzoekers keken vervolgens of er kwetsbaarheden in de code zaten. Daarvoor gebruikten ze CodeQL, een codevalideertool van GitHub zelf. "We redeneerden dat GitHub zichzelf zo kan controleren", zegt Pearce met een knipoog. In een normaal bedrijfsproces zijn er diverse manieren om code te valideren, bijvoorbeeld met een pentest of door een ander te laten lezen. Voor het onderzoek zouden die methoden te veel tijd kosten en te subjectief zijn. Daarom kozen Pearce en Tan voor een enkele tool die altijd op dezelfde manier opereert. De laatste stap in het onderzoeksproces is om te kijken of de eerste codesuggestie van Copilot al fout is, in plaats van alleen een latere suggestie.
De resultaten waren meteen al opvallend. Na het runnen van 54 scenario's bleken er in 24 fouten te zitten, 44,44 procent. Toen de onderzoekers dat splitsten naar verschillende programmeertalen, werden de verschillen zelfs groter, 52 procent bij C-code.
Pearce en Tan noemen een aantal voorbeelden waarbij Copilot de mist in gaat. Bij een prompt om drie willekeurige floats
te maken, gaf Copilot een suggestie die een buffer-out-of-bounds-write mogelijk maakte. Bij een prompt om een wachtwoord te hashen, suggereerde Copilot om dat met het al jaren onveilige MD5-algoritme te gebruiken. Dat zijn fouten die een beetje fatsoenlijke ontwikkelaar niet maakt.
Verschillende fouten
Pearce nuanceert dat Copilot onmogelijke en stupide fouten maakt. "We zagen vaak dezelfde soorten fouten", zegt hij. "Bij C-prompts zag je vooral fouten in pointers en array lengths, bij CWE's die knowledge-based waren, ging het meestal om tar slips of dat de tool MD5 als hashalgoritme koos." Er gaat volgens Pearce en Tan ook veel goed. "Met voorzetten voor permissies en authorisaties ging er weinig mis."
De resultaten namen volgens de onderzoekers een verrassende wending toen ze kleine aanpassingen deden in de prompts. Zo gaven ze Copilot een voorzet om een Python-script te schrijven waarbij ze de author
veranderden in Andrey Petrov, een bekende Python-programmeur. En inderdaad, zeggen de onderzoekers, het aantal fouten in Copilots resultaat daalde significant. Daarna veranderden ze de author
in 'Hammond Pearce'. "Ik heb wel een paar openbare GitHub-repo's, maar die zijn niet bepaald goed", lacht hij. En ineens bleek het aantal fouten weer op te lopen.
Tabs vs. spaces
Het maakt verschil of je een voorzet geeft met tabs of spaties, of delete in plaats van remove
"We zagen veel verschil bij kleine verschillen", zeggen Pearce en Tan. "Als we bijvoorbeeld tabs gebruikten in plaats van spaties, de eeuwenoude programmeursdiscussie. Of als we delete
vervingen door remove
. Het is best eng dat de output zo anders is op basis van zulke kleine verschillen in de input."
GitHub zegt dat Copilot overweg kan met 'alle programmeertalen waar je zo van houdt'. "Nou, dat zie ik dan als een uitdaging!" zegt Pearce. Hij werkt zelf voornamelijk met hardware en is daarom bekender met Verilog dan C, Python of Java. Bij prompts voor die taal komt er weliswaar Verilog-code uit Copilot, maar die werkt lang niet altijd. Het probleem is dan vaker dat het niet werkt dan dat het kwetsbaarheden bevat, maar in de achttien scenario's die Pearce met die taal probeerde, kwam hij zeven kwetsbaarheden tegen in de eerste optie. "Het concrete probleem is dan echter erger", zegt hij. "Bij hardwarebugs is het vaak veel moeilijker ze te patchen."
De toekomst van automatisch programmeren
Pearce en Tan vinden het lastig om harde conclusies uit hun onderzoek te trekken, vooral omdat tools zoals Copilot nog in de kinderschoenen staan en er weinig onderzoek naar is gedaan. Zelf geven ze op de universiteit ook les aan studenten. Ze zijn benieuwd wat tools als Copilot voor hen gaan betekenen. "Als je voor je studie code inlevert die rechtstreeks van Stackoverflow is gekopieerd, kom je daar niet mee weg. Studenten moeten wel begrijpen wat ze schrijven." Pearce is van plan om Copilot in het komende semester te introduceren en ermee te experimenteren in lessen. Maar, voegt hij daar meteen aan toe, voor zijn lessen in hardwarecode is dat niet zo interessant. "Het is een ander verhaal als je een introductieklas C volgt." Het succes van Copilot is daarnaast natuurlijk erg afhankelijk van de programmeertaal die je uit Copilot laat komen. "Copilot is veel minder goed in nieuwe talen die pas een paar jaar oud zijn, dan wanneer je het loslaat op C of Python."
'Door Stackoverflow te copypasten zijn programmeurs soms al meer lezers dan schrijvers'
Hoewel copypasten van Stackoverflow een no-go voor studenten is, zijn de onderzoekers ook niet blind voor de realiteit dat dat vaak gebeurt. In brede zin denken ze dat Copilot de rol van programmeur kan veranderen. "Die gaat dan meer toe naar het lezen van code in plaats van het schrijven ervan. Van de andere kant, dat gebeurt nu ook al als je Stackoverflow-code overneemt."
De fouten die tools als Copilot genereren, zijn volgens Pearce en Tan dan ook geen onoverkomelijk probleem. "Als programmeurs delen van hun code automatisch kunnen laten schrijven, houden ze bijvoorbeeld meer tijd over voor codevalidatie. Een bedrijf heeft dan de mogelijkheid om dat proces beter in te richten. In plaats van dat je alleen een tool gebruikt of er alleen een pentester op loslaat, doe je het allebei." De rekensom is met Copilot in ieder geval simpel. "Het kost een tientje per maand. Als je programmeurs daardoor veel meer tijd overhouden, is dat amper een rekensom die je hoeft te maken."
Modellen voor eigen gebruik
Vooral grote bedrijven als Microsoft en Google gaan waarschijnlijk door met de ontwikkeling van zulke tools. Niet, zoals bij GitHub, voor algemeen gebruik, maar om eigen code te schrijven. Pearce: "Door het in eigen beheer te hebben, worden ze niet alleen productiever. Ze omzeilen er ook het juridische obstakel mee. Copilot gebruikt snippets en voorbeelden van alle openbare code op GitHub. Voor een bedrijf als Microsoft of Google is het veel interessanter om een model te maken dat alléén getraind is op de eigen code. Dat voorkomt dat je onverhoopt stukken van gelicenseerde code overneemt, en de code die daaruit komt rollen, is uniformer voor het bedrijf."
AI-modellen voor het genereren van code zitten nog in een prille fase. Pearce en Tan vragen zich af of het toekomst heeft en niet alleen vanwege de mogelijke bugs die de tool genereert. "Misschien is dit wel de brave new world waarin we leven", zegt Tan. "Is dat wel de juiste weg vooruit?" Een ding is in ieder geval zeker, denkt hij. "De ontwikkelaar zelf blijft verantwoordelijk voor zijn of haar code. Vergelijk het maar met Tesla's Autopilot. Die kun je ook bepaalde taken laten overnemen, maar jij bent degene achter het stuur."