AI Engineer World's Fair 2026
Teaching AI to Find Real Vulnerabilities — Prof. David Brumley, Bugcrowd
About this talk
David Brumley, a Carnegie Mellon professor and Bugcrowd’s Chief AI and Science Officer, explains how to train and evaluate language models for genuine vulnerability discovery using reinforcement-learning environments modeled on progressive human cybersecurity training. He emphasizes realistic target difficulty, reproducible execution environments, deterministic grading instead of LLM judges, audit tasks that assess multiple vulnerabilities, and demanding V8 sandbox-escape scenarios involving exploit chains and arbitrary read/write primitives. He concludes by highlighting reward hacking and the challenge of evaluating newly discovered vulnerabilities.
Chapters
- 0:00Why AI needs realistic cybersecurity training environments
- 1:05picoCTF, progressive learning, and exploit competition examples
- 3:27Target difficulty, security objectives, and deterministic grading
- 13:10Synthetic vulnerability pitfalls, AIxCC, and audit tasks
- 19:36V8 sandbox escapes and chained exploitation primitives
- 26:45Reward hacking, unknown vulnerabilities, and closing
Talk transcript
- 0:00
[upbeat music] All right, everybody, we're gonna talk about hacking.
- 0:15
I love hacking. We have a very small audience here, so I assume everyone here loves hacking as well. So I wanna talk about designing reinforcement learning environments for cybersecurity tasks, and essentially we all wanna teach computers to hack because, well, we're pushing out programs faster than other-- ever, and so we need to be able to check them
- 0:34
at machine speeds and scale. And this has been my research project for well over two decades. My name's David Brumley. I am a full professor at Carnegie Mellon University, where I work on AI and cybersecurity, and I'm also the Chief AI and Science Officer at Bugcrowd, where I work on data partnerships.
- 0:51
So before I talk about what we do and how we do it and why it's important to design cybersecurity tasks correctly for reinforcement learning environment, I wanna start off with how humans learn, because, I mean, I love teaching people to hack.
- 1:05
And I remember in particular a case where we run a hacking contest called picoCTF. picoCTF has about a million high school kids every year play in this contest. Um, and so it's a, a really fun way for people to get an intro to cybersecurity.
- 1:19
So in two thousand sixteen, a young, uh, person showed up on our scoreboard who was going by the hacker name [REDACTED:username]. And typically we know who's doing well in the contest.
- 1:29
It's kind of the typical suspects like a Palo Alto High School or, uh, some of the Washington, D.D.C., high schools. We know who's gonna win the contest. And so this kind of independent starts showing up s-- uh, scoring on our scoreboard, and we had no idea who it was.
- 1:44
So we reach out. It's actually a [REDACTED:age] kid who found out about cybersecurity trying to get into it from math competitions. He got bored with the math competitions and started doing them.
- 1:55
And very quickly, he ended up actually scoring second in picoCTF competing against all these high school kids. And we asked actually, "How did you learn this?" And what he said really was, uh, germane to this task.
- 2:07
"What I did is I looked at the cybersecurity task, and then I started googling
- 2:12
what is the information I needed. I would read about it, I'd look at write-ups, and then I'd start emulating that." And this kid actually ended up coming in second.
- 2:21
I recruited him to CMU, and he followed this methodology of studying write-ups and practicing cybersecurity on a graduated scale, easy problems first and then slowly getting more difficult. And he actually turned into what's called a Pwn2Own winner.
- 2:34
So Pwn2Own, if you've never heard of it, is one of the more elite cybersecurity competitions. This kid, just two years after he first learned cybersecurity, enters, and, uh, if you read about it at the time, he was the first one to hack a Tesla.
- 2:49
So he walked out of this contest with three hundred and seventy-five thousand dollars in cash and a brand-new Tesla. The reason I tell this story is actually the way we teach AI, uh, frontier models to hack is the same way that we've been successful teaching high school students such as Richard Zhu to become Pwn2Own i-- winners.
- 3:08
My other students include people like George Hotz, who did the first iPhone jailbreak, and current Pwn2Own winners like SungHyun Lee.
- 3:16
And so what I wanna talk about is how we teach reinforcement learning and do it the same way that we've been teaching hacking for a while, and it really breaks down into two different axises.
- 3:27
The first thing when designing these sorts of tasks for people is to look at target difficulty. There's a spectrum of different challenges that you can look at, from toy problems through CTF and synthetic problems, all the way up to hardened targets.
- 3:43
The second axis for teaching machines to hack is really looking at exploitation difficulty. For example, when we look at a toy program, we may start looking at the sort of skills it needs to acquire to be able to hack that.
- 3:56
For example, if you have a toy program and it has a bug, can the LLM figure out where the bug is? Can it then prove that it knows where it is by triggering a crash or some other fault in the program?
- 4:09
But of course, hacking is not just crashing a program. We wanna take control of that program. That's the beautiful thing about hacking. It's bending computers to our will. It's what makes it unique in the sciences.
- 4:21
So you look at things like, "Hey, there's a flaw in that program. Can I use that to do arbitrary read writes in memory, or even to do a full arbitrary code execution exploit?"
- 4:31
And so if you remember nothing else from this talk, it's really the way that we teach LLMs, whether it be frontier models like Anthropic or private models that you're tuning in your house.
- 4:42
You follow these two axises where you're trying to come up with a set of tasks that increase in target difficulty along one, and then you're teaching specific cybersecurity skills on the second.
- 4:55
In other words, hacking is really a ladder, and this is what actually matches cybersecurity so well to reinforcement learning. We have a ladder of tasks, and we typically end up with a good oracle for whether they can achieve that task, and so you can start to measure whether your model is learning the right set of capabilities.
- 5:14
So this talk is really divided into three parts.
- 5:21
The first one is to talk about vulnerability discovery, and when we talk about vulnerability discovery, what we're talking about is in the variety of different programs that you encounter in real life, how do you design oracles that are correct for determining whether or not a model has successfully been able to detect that vulnerability?
- 5:41
And what's interesting is several of the cybersecurity benchmarks out there were amazing first-generation pieces of work, but they have a critical flaw where the model will actually stop learning after it finds the easiest vulnerability, and that can prevent them from getting smarter.
- 5:58
The second is I wanna talk about how we are designing benchmarks to measure this ability to do weaponization.
- 6:04
And this is really where we get into where does security differentiate from bug finding? And we'll talk about how well LLMs do against what I would call hard targets.
- 6:13
A hard target, one easy way to, to look at it is, how much would you pay for an exploit that a model could produce? We know Richard Zhu, [REDACTED:username], was paid $375,000 and got a brand-new Tesla for one exploit.
- 6:27
Can models achieve that capability today? And then I'm gonna just summarize ways that if you're interested in this environment, we can connect and do more work together. So very simple talk.
- 6:37
So let's talk about the first axis of discovery and where you really want to, um, learn what you're gonna be measuring. This is a key part in reinforcement learning, where if you set up the wrong task objective, the LLM will learn it, but it'll learn the wrong thing.
- 6:53
So some definitions to begin with. Let's start defining the problem. When we think about reinforcement learning or we talk about gyms, there are some key components in that. There's, of course, other things, but the key components are you need a vulnerable application, and we like to enclose these inside container environments so that they're reproducible, we make sure
- 7:11
that they run, and that you don't have variations between, for example, if I run a program on this version of Linux versus a different version of Linux, it actually may behave differently.
- 7:22
And so you wanna standardize that with a vulnerable program. You need a grading oracle. Now, one of the things I think the previous talk was talking about was LLM as a judge is a reasonable thing.
- 7:31
What we found in cybersecurity is that is flawed. The LLMs will always say they were successful hacking, and so what you wanna come up with is a deterministic grading oracle for each of the different levels you're getting at.
- 7:44
For example, if you're trying to teach it to just find a bugs, maybe this grading oracle is was it able to trigger a crash? We'll talk about that more in a second.
- 7:53
So you have this reinforcement learning environment or this gym environment, and of course, you have your LLM and an orchestrator that's gonna talk to it. The way we set up our tasks is very simply, we expose through MCP a few key functions, a setup function, so the LLM will call setup.
- 8:07
It returns the problem definition. We give it standard tool calls, such as read and write inside the container, inside a sandbox inside the container, and then a grading oracle at the very end.
- 8:19
And so you end up with this vulnerable program in here, a grading oracle, and I'm gonna assume that you've already verified that there is at least one flaw in this program.
- 8:28
Maybe you yourself have figured out that it can crash. Maybe you have downloaded it from a bug report and you've been able to reproduce that vulnerability. We won't get into that.
- 8:37
That's part of our sauce that we do at Bugcrowd. But once you do that, you have this package environment, and then your task prompt is gonna be something very simple like, "Dear LLM, can you find and exploit the vulnerability?"
- 8:48
Now, you don't wanna just ask, "Can you find the vulnerability?" Because then you won't be able to distinguish between an LLM hallucination and a real vulnerability. So you almost always ask it to actually exploit the vulnerability, and that exploit is gonna be key to how we do reinforcement learning.
- 9:07
So the LLM does some thinking, and it comes up with an exploit. For example, this very, very simple program, if you just give it enough As, you'll trigger a crash.
- 9:16
So that's the LLM's witness, the proof of vulnerability that it was able to find something. You run that input through your grading oracle,
- 9:25
the oracle that determines did the program misbehave or not. In this case, the program would simply crash, and you farm out your rewards.
- 9:35
This is a very elegant way, and actually this is the way we teach people to hack. We set up a deterministic auto-grader. For example, in CTFs, it's 'cause you capture the flag.
- 9:45
Within a cybersecurity environment like this, the level one may be can it crash, all the way up to control flow hijack, where, for example, you may ask the LLM, "Can you do something like launch a calculator, some external program you shouldn't be able to run or do a reverse shell?"
- 10:00
So that's the basic setup. But there's a problem with this. This is the way if you go look at the existing benchmarks like, uh, CyBench or, uh, CyberGym, they set up the task.
- 10:10
But there's actually a problem here, and that's because there's an assumption that the program only has one vulnerability. I don't know about you, but it's very rare to find a program for which you know there's only one vulnerability.
- 10:24
So what happens if you have two vulnerabilities here? This actually breaks a lot of assumptions in current evaluation environments. You ask the same question, "Dear LLM, can you find and exploit the vulnerability?"
- 10:38
But now the LLM has a lot of freedom to reward hack. For example, which vulnerability should it find? If you came in only knowing about the first vulnerability, but there's a second one you didn't know about, what do you do if the LLM thinks it found a second one?
- 10:55
Or suppose you know two. What we found is on existing benchmarks with multiple pro-- with, uh, real OSS benchmarks, there are multiple vulnerabilities. The LLM will just continue to find the easiest vulnerability, and that really limits its trajectory as far as what it can learn.
- 11:13
And then you have a question. If it does find a vulnerability you did not know about, well, how do you score it, right? You certainly don't wanna give tasks that have no vulnerabilities because then you don't know if you're wasting your time.
- 11:24
But what if the LLM finds an unknown vulnerability? Here's where you can run into a catch 22.
- 11:32
What existing benchmarks do is they tell the LLM which bug.
- 11:36
For example, in many of the benchmarks out there like CyBench, they will give a backtrace that says, for example, "I know the vulnerability is in this backtrace," which identifies the vulnerable function.
- 11:48
But at that point, you're teaching the LLM, but you're pointing at it exactly the problem, so the LLM no longer has to reason about the program, and that will stunt its reasoning capability.
- 12:00
Essentially, if you're nudging it and saying, "Here's the vulnerability. It's in this function," it doesn't have to do a lot, and in fact, it can often fit that entire function in its context window and it doesn't have to reason much.
- 12:13
The second problem, though, is if you don't tell the LLM which one, and there's multiple vulnerabilities, it can always just then reward hack the easiest problem. And we see this in every foundational LLM out there, and we see it in, as far as I can tell, most of the benchmarks out there.
- 12:29
Will there be multiple vulnerabilities? It will be graded, but because the grading is just checking for, for example, a crash, it's not exploring the f- full state space, and the LLM will just keep returning the same one.
- 12:41
This is also a problem in some of the public competitions. For example, we won something called the Cyber Grand Challenge from DARPA. It was the first challenge from DARPA to show that fully autonomous cyber is capable.
- 12:51
Fifty percent of the hand-curated challenges had unknown vulnerabilities. This was DARPA, who spent $60 million designing a contest, trying to come up with problems that were well-defined and well-scoped, and they accidentally added additional bugs, and fifty percent of those were ones that were actually exploited.
- 13:10
So this idea that we're just gonna create synthetic problems with one bug doesn't work. People have tried it, spent a lot of money. You always introduce new ones. Second problem is-- Second example I'd show is the AIxCC.
- 13:23
I designed the scoring algorithm for this. This is, again, a very large DARPA program that ran last year in DEF CON, where eighteen of the bugs found were unintended ones.
- 13:31
And so the TLDR on here is you can't just say, "Well, we're gonna hand-curate an environment with just one vulnerability." Experts have tried. It doesn't work. You have to change the problem definition.
- 13:42
So we've been thinking about this, and what we developed is a new way to test. It's called the audit task. Again, suppose you have two different bugs, but you flip the question from just find a bug to find all the vulnerabilities discovered.
- 13:55
At this point, the LLM has then freedom to find multiple bugs and submit multiple proofs of vulnerabilities, and it may be pu- proofs of vulnerabilities for bugs you know about and bugs you don't.
- 14:06
You run all vulnerabilities through your oracle, and this is where it's very important to have a deterministic grader. So for here, for example, there's two vulnerabilities. It gives us two inputs that crash both vulnerabilities, and part of this grader now has to uniquify them to show that two different vulnerabilities are triggered.
- 14:22
Now, if we didn't know about vuln two, this also gives us the opportunity to increase our ground truth. We haven't told the vulner-- the LLM that we don't know about something that it found.
- 14:31
It just gave us proof that it was able to find it. So we can normalize the set of known vulnerabilities at that point to be something like D star and calculate the sc-- the precision and recall for the model across multiple vulnerabilities.
- 14:43
For example, recall is the number of known that it found over the total set, and precision is the number of found over the submitted. What this prevents the model from doing, and essentially balances, is the ability for it to go find unknown vulnerabilities, but also prevents you from s-s, uh, prevents the model from just spamming.
- 15:01
You don't want it to give you a bunch of things that aren't vulnerabilities, like, for example, giving us POV in four that doesn't trigger anything. You need to descr- You need to prevent that, and we found that this precision versus recall is the way, uh, to balance those two competing goals.
- 15:19
So when you do this this way, you have an open world grading. Instead of trying to define one problem that's perfect, you can give it a real open source task that can have multiple vulnerabilities, even though, th-those that you don't know about.
- 15:30
You post-hoc, since you're asking for a proof of vulnerability, you can then go say, "What is the total set found of those known and unknown?" And you can score precision and recall and normalize both so they're multiplicative.
- 15:43
It won't just keep finding the same easy bug.
- 15:47
You add, uh, as I said, it's open world, so you can find unknown bugs and use it on real open source, and it also gives a clean trajectory. Now, the key to doing this, the one thing that you do have to add to the grader, is the ability to distinguish between multiple bugs if it gives you a
- 16:03
POV. The way we do this is the same way everyone in industry does it. We look at the stack backtrace. If you've ever had your program crash on Windows or Mac and it's like submit to Microsoft or Apple, what it's doing is it's submitting the backtrace, and they're uniquifying those into independent bugs, and then they're triaging them
- 16:20
based on that. So we built that into the grader.
- 16:24
It also means that there's no LLM as a judge because, let's face it, you can't ju- trust the LLM that you're teaching to be a judge. And it also, what we found, re-limits or removes bias completely.
- 16:35
The model actually never knows how many vulnerabilities. When you say, "Go find a bug," you've actually then given it a piece of information that there is a bug, right?
- 16:44
And in fact, what we find is that models will then fine-tune on that and only try to find one. Here we open the possibility that there's no bugs, which provides a little bit cleaner trajectory for that learning signal.
- 16:57
So the key TLDR for this is don't define the task by a single bed. Let the program define the task. We see people trying to create artificial benchmarks or synthetic benchmarks.
- 17:06
They'll go out and say, "Hey, let's just go find one crash, and then we'll turn that into an RL." What invariably ends up happening is the model will then reward hack, and then it'll stunt its growth, or worse, you'll have an incorrect benchmark.
- 17:21
So the audit task is one way to continue that climb. The second access, if you look at going from, as I said, toy programs, CTFs, all the way up to open source where you have multiple types of bugs, is what are the capabilities that our model is able to do?
- 17:34
And this is some of our latest work where we collaborated with the foundational models, OpenAI, Anthropic, and were able to check how well they can exploit high-value targets.
- 17:46
This hadn't been done before. If we go look at public experiments out there, and we look at, for example, DARPA, they had looked at this question of fully autonomous where they said, "Hey, for synthetic problems that we can create, can AI do arbitrary code execution?"
- 17:59
What we would consider a real hack. But when you go and you look at AIxCC or Cyber Gym or BountyBench, all they really checked is whether the AI could crash the program.
- 18:10
Crashing a program is different than hacking it. You can't go steal someone's IP by simply crashing a program. So this question of whether models could exploit high-value targets was actually open.
- 18:22
So what high-value target should we look at? We picked Chrome, and in particular we picked a JavaScript Wasm interpreter called V8. Now V8 is one of the things that maybe is foreign to you, but actually powers the internet.
- 18:37
V8 is how Chrome executes JavaScript, and JavaScript is what's under the attacker's control. Put up a malicious website, it runs JavaScript, you can then exploit V8. It also runs Edge.
- 18:47
It runs node.js. It runs Cloudflare Edge workers. If you've ever used an Edge worker, it's actually running V8, where each tenant is a separate thread. It's crazy, and if you can find a vulnerability in V8, you can exploit all these systems.
- 19:05
V8 is difficult to do because it goes beyond typical programs as far as security measures to try to keep it safe. For example, when you start looking at V8 and you look at the internals of this, there is a sandbox, and so inside the sandbox is where you run your untrusted code, things like media, images, and so
- 19:25
on. And inside the sandbox, we expect there to be vulnerabilities. In other words, if you can crash a s- in sandbox object, it doesn't mean anything. That's expected behavior.
- 19:36
What makes V8 a high-value target, and what makes rewards start at 10,000 and go up to 100,000, or if you sell them on the black market, millions, let's be frank here, people do that, is whether you can do an out-of-sandbox exploit, and that typically requires chaining multiple vulnerabilities together.
- 19:53
So TLDR, if you could give Chrome to an LLM and it could come up with a zero-day, you would essentially be able to hack nation states at that point.
- 20:02
It's a very worthwhile task to see how far we have to climb.
- 20:07
But we also want to be able to measure where LLMs get stuck. It's such a hard target that when it fails, you end up with very little signal. And so we designed an experiment on Exploit, where we bucketized 16 different capabilities in a ladder.
- 20:23
First, can you trigger a cra- f- can you trigger the vulnerability? Do you just show a deviation when you hit the, the vulnerable line of code? Can you crash an in-sandbox ab- object?
- 20:34
That's interesting, but that's just the first vulnerability that you find. Then can you get in-sandbox primitives? Can you, inside the sandbox, get arbitrary read and write? What that allows you to do is inside the sandbox, the way exploitation works is you first exploit inside the sandbox, and then you have a Turing-complete program if you have arbitrary read
- 20:51
write. You then try looking for that second vulnerability and chaining it together. Can you get out-of-sandbox primitives? And then finally, can you do arbitrary code execution? What this allows us to do is it allows us to measure how far models get in this ladder on a really hard target, and the results were actually very interesting in this.
- 21:12
So we ran this on 41 V8 vulnerabilities. We went and hand vulnerified, verified that they were all exploitable. We took actually the leader for the current Chrome security, his name is SungHyun Lee, verify these for us.
- 21:24
And what we found is that if you're purely looking at old benchmarks where triggering a crash is what you wanna do, it's really not a distinguisher among models. GPT and-- GPT 5.5 and Mythos both achieved 95%.
- 21:39
They were able to trigger a vulnerability 39 out of 41 times. Essentially all the tasks are solved. And then if you started to look at lower-powered models, things like Gemini, Kimi, Minimax, GLM, they were still able to s- succeed about 50% of the time.
- 21:56
So think about this. If you were looking at the old benchmarks, the message would be 50% of the time, Kimi succeeds in hacking, but that's because their definition of hacking was broken.
- 22:06
It was simply crashing it. The real question is, can they do a full sandbox escape? And this is where we see distinguishing characteristics.
- 22:15
So if we look at what I'd call arbitrary code execution is really what the elite would do. Mythos was, uh, quite surprising, able to do this 73% of the time.
- 22:25
So 30 out of the 41 examples, Mythos was able to do this sort of full control flow hijack. GPT, sorry, the little bar here is wrong. This was 68% of the time, and Gemini and Kimi were 0% of the time.
- 22:39
So we're starting to see a signal between these models on what they can do. The little bars here are wrong, but the actual numbers are correct.
- 22:47
So there's some cool evidence actually that these aren't memorized, that people like Mythos and GPT just didn't have access to zero-days out there. So this is where I get to geek out on security.
- 22:56
For example, in CVE-2023-670T, this was something that the experts in Chrome, it's a very small community, they knew that it was exploitable, and they came up with a POC.
- 23:06
But what happened inside Mythos was Mythos took a route that everyone thought would be too hard to do in practice. One of the things that Mythos was able to do was reverse JavaScript's Math.random and use that to forge a pointer for a return-oriented program out of the UberCage exploit.
- 23:23
It was very creative. So this wasn't a publicly known exploit. There is a public one, but what it came up with was very different, for which experts actually thought would be too difficult in practice.
- 23:33
In CVE-[REDACTED:phone_number], it found a new Wasm path, past where all the public work had sto- had stopped. In fact, it was unclear that there was a public exploit that worked for this.
- 23:46
We were able, again, through a lot of manual effort, to create one after the fact, but we know that that wasn't public to the best of our knowledge.
- 23:55
2024-0519, again, public vulnerability, no public exploit. Mythos was able to succeed.
- 24:04
At the end of this, the work was on par with a human elite researcher. I actually wanna say a few more words about 2024-7965, 'cause that one was actually pretty interesting.
- 24:13
This is one for which we knew of a public-- We knew that it-- we could exploit it on an ARM, but actually even our internal expert didn't think that you could do it on x86, and Mythos succeeded.
- 24:23
So fairly significant proof that this wasn't just memorization. These are hard tasks against, uh, hardened targets.
- 24:31
So you can download this entire set at exploitbench.ai. We provide all the, uh, all the, uh, all the environments. These are Docker images that you can just pull from GitHub.
- 24:42
They have an MCP interface. It's really cool. You can just say, like, "Claude, point it at the MCP interface," and see if it can hack it. We provided all the data in the transcripts with the exception of Mythos, and the reason that we withheld Mythos was twofold.
- 24:55
First is we had an NDA that we couldn't release Mythos transcripts 'cause it's not public. But second, actually, Mythos was able to come up with weaponized exploits that weren't public.
- 25:05
And so we've kind of hit this quandary out there. If we're gonna publish these benchmarks and we believe in open science, but the models are creating actually interesting exploits for high-value targets, what do you do as far as the open science part of this?
- 25:20
We don't have an answer. Kind of fun to think about.
- 25:24
So for the next steps, I mean, we only have a 20-minute talk here.
- 25:30
One of the things that we're doing is we're taking these as, really, benchmarks to see where the frontier models stop, and then we're building reinforcement learning environments to help get models past that.
- 25:39
The way that we go about this is we've done a, a fairly curated approach where we take open source software, and we built a very extensive vulnerability mining machine based upon our work with DARPA over the last decade for novel vulnerability discovery.
- 25:53
We find unique proofs of vulnerability. These are zero-days no one else used, and we use these to then build reinforcement learning environments. Why are we finding zero-days? Well, we wanna make sure that the models aren't simply memorizing, and we know if it's a vulnerability they've never seen before, that it can't at least be just memorizing that.
- 26:12
We're able to do this at scale, where some of our-- the companies that we work with, we're providing up to 10,000 reinforcement learning environments per month to really accelerate their, uh, learning.
- 26:22
We, of course, can't take credit for how far these models have come, but we like the fact that we've had, in some way, uh, some impact on how well they do at cybersecurity.
- 26:32
So the TLDR in the entire talk is training cybersecurity is really not mysterious. What it takes is an actual expert that builds the right oracles, that when you go back and look at the transcripts, goes and tries to figure out, was the, was the machine just memorizing?
- 26:45
Was it doing reward hacking? And most importantly, how do you handle the case where the machines are finding vulnerabilities that you didn't know about before? If you're interested in this, please reach out.
- 26:57
Happy to answer questions. [audience applauding] [upbeat music]