Since its introduction, GitHub Copilot has already saved builders hundreds of hours by offering AI-based code solutions. Copilot’s solutions are undoubtedly useful, however they have been by no means supposed to be full, right, purposeful, or safe. For this text, I made a decision to take Copilot on a check flight to check the security of the AI solutions.
First issues first: what precisely is GitHub Copilot?
Copilot is an IDE plugin that means code snippets for numerous frequent programming duties. Attempt to perceive feedback and current code to generate code hints. Copilot makes use of an AI-powered language mannequin educated on hundreds of publicly obtainable items of code. On the time of this writing, Copilot is out there by subscription to particular person builders and helps Python, JavaScript, TypeScript, Ruby, and Go.
GitHub Copilot safety points
Copilot is educated on code from publicly obtainable sources, together with code in public repositories on GitHub, so it generates solutions which are just like current code. If the coaching set contains insecure code, the hints may additionally introduce some typical vulnerabilities. GitHub is conscious of this and warns within the FAQ that “it’s best to all the time use GitHub Copilot along side good code assessment and testing practices and safety instruments, in addition to your individual judgment.”
Shortly after the launch of Copilot, researchers on the New York College Middle for Cyber Safety (NYU CCS) printed Asleep on the Keyboard? Safety evaluation of GitHub Copilot code contributions. For this doc, they generated greater than 1,600 packages with Copilot solutions and reviewed them for safety points utilizing each automated and handbook strategies. They discovered that the generated code contained safety vulnerabilities about 40% of the time.
This was a 12 months in the past, so I made a decision to do my very own analysis to see if the safety of Copilot’s solutions has improved. For this objective, I created two skeleton net purposes from scratch utilizing two well-liked know-how stacks: a PHP software backed by MySQL and a Python software in Flask backed by SQLite. I used solutions from Github Copilot every time attainable to construct the apps. I then analyzed the ensuing code and recognized safety points, and that is what I discovered.
Copilot hints in a easy PHP software
For the primary app, I used PHP with MySQL to symbolize the LAMP stack, which continues to be a preferred net growth possibility even in 2022, most likely as a consequence of WordPress. To test some frequent login type situations, I created a easy authentication mechanism. As a primary step, I manually created a brand new database with a brand new desk (customers
), and the join.php proceedings. I then used Copilot to generate the precise login code, as proven under. Strains 36–48 have been generated by Copilot:

Instantly, you’ll be able to see that the SQL question in $question
it’s in-built a means that it’s susceptible to SQL injection (person provided values are used straight within the question). Here is an animation displaying how Copilot responded to a remark to counsel this block of code:

Subsequent, I created the index.php web page that solely greets the person. Aside from the feedback for Copilot, I did not write a single line of code. For a developer it is vitally quick and comfy… However, is it secure? Have a look at the code that claims hi there:

Line 5 was instructed by Copilot, full with an apparent XSS vulnerability by straight concatenating person enter.
Lastly, for this app, I created a registration web page. For this one, Copilot appeared to take safety extra significantly, for instance escaping entrances utilizing mysqli_real_escape_string()
or encrypt the password. He even added a remark to say that is for safety. All these traces have been generated by Copilot:

The one downside is that Copilot encrypts the password utilizing a weak MD5 hash after which shops it within the database. Salt is just not used for hash, which makes it a lot weaker.
Vulnerabilities discovered within the PHP software
- SQL Injection – As famous above, an SQL question is created utilizing unsanitized enter from an untrusted supply. This might permit an attacker to switch the assertion or execute arbitrary SQL instructions.
- Disclosure of delicate info: A type subject makes use of autocomplete, which permits some browsers to retain delicate info in its historical past. For some apps, this might be a safety threat.
- Session fixation: The session title is predictable (set to the username), exposing the person to session fixation assaults.
- Cross Web site Script (XSS): The worth of the username parameter is mirrored straight on the web page, leading to a mirrored XSS vulnerability.
- Weak hashing algorithm: The password is weakly encrypted with an unsalted MD5 hash after which saved within the database. MD5 has recognized vulnerabilities and could be cracked in seconds, so the password is not actually protected in any respect.
Copilot Hints in a Easy Python Utility (Flask)
The second net software was created in Python with the Flask microframework. The database is SQLite, the preferred database engine on this planet. For this app, Copilot’s solutions included blocks of code that launched safety dangers associated to SQL injection, XSS, file uploads, and safety headers.
Beginning with two routes created by Copilot, you’ll be able to instantly see that the SQL queries are (once more) constructed in a means that’s susceptible to SQL injection:

When requested to echo the username on the web page, Copilot once more supplies code that’s clearly susceptible to XSS through the username parameter:

Tasked with producing code for file uploads, Copilot responds with a fundamental add facility that doesn’t embody safety checks. This might permit attackers to add arbitrary recordsdata. That is how solutions are loaded:

The code trace to set a cookie can be very fundamental. There’s not Max-Age
both Expires
attribute, and Copilot didn’t set any safety attributes, akin to Safe
both HttpOnly
:

When configuring the HSTS header, Copilot didn’t detect the preload
directive, which you may usually need to embody:

Vulnerabilities discovered within the Python software
- SQL injection: Each place the place Copilot creates an SQL question (I counted eight) straight makes use of enter from an untrusted supply, resulting in SQL injection vulnerabilities. This might permit attackers to switch database queries and even execute arbitrary SQL instructions.
- Cross-site scripting: The worth of a uncooked parameter is mirrored straight on the web page, creating an XSS vulnerability.
- Clear Password: On this app, Copilot’s suggestion is to retailer the password in clear textual content, not even hashed.
- Arbitrary File Add – There are not any restrictions or safety controls for a file add function. This may permit malicious hackers to add arbitrary recordsdata for additional assaults.
- Session fixation: For safety, session identifiers have to be random and undecipherable. Copilot’s suggestion as soon as once more makes use of the username because the session ID, which opens the way in which for session fixation assaults.
- Lacking HSTS prefetch coverage: auto-generated HSTS header doesn’t embody greatest practices
preload
directive. - Lacking safe cookie attributes: When setting the session cookie, Copilot doesn’t embody the
Safe
YHttpOnly
attributes This makes the cookie susceptible to studying and manipulation by attackers.
Conclusion: solely as secure as the training set
GitHub Copilot is a really sensible and handy device to cut back developer workload. It may possibly offer you boilerplate code for typical duties in seconds. It’s presently solely obtainable to particular person builders, however I believe it is going to be extensively utilized by giant corporations with the Enterprise model, due in 2023.
Nevertheless, by way of safety, you need to be very cautious and deal with Copilot’s solutions solely as a place to begin. The outcomes of my analysis affirm earlier findings that solutions usually do not take into account safety in any respect. This might be as a result of the coaching set for the Copilot language mannequin contains plenty of unsafe, non-production code.
GitHub may be very clear that it’s best to all the time rigorously assessment all Copilot solutions, because the device does not know your app or the complete context. This is applicable to each performance and safety. However as a result of it is so quick and handy, less-experienced builders might not all the time discover all of the issues which are lacking or incorrect. I am certain we’ll see plenty of vulnerabilities stemming from unverified Copilot solutions, particularly when the Enterprise model turns into obtainable and bigger organizations begin utilizing the device.
– Insecure coding workshop: Analyzing GitHub Copilot suggestions