Guiding Symbolic Execution with Static Analysis and LLMs for Vulnerability Discovery
The paper presents SAILOR, a novel framework that automates symbolic execution harness construction by integrating static analysis for vulnerability targeting and LLMs for iterative driver synthesis, enabling the discovery of 379 previously unknown memory-safety vulnerabilities across 10 large C/C++ projects where existing baselines failed.
Original paper licensed under CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). This is an AI-generated explanation of the paper below. It is not written or endorsed by the authors. For technical accuracy, refer to the original paper. Read full disclaimer
Imagine you are a detective trying to find hidden traps in a massive, ancient castle (a huge software codebase). You have three powerful tools, but each has a major flaw on its own:
- The Static Analyzer (The Map Reader): This tool can scan the entire castle in seconds and point out 10,000 spots that look suspicious. But it's terrible at context; it flags everything from a loose brick to a whole wall, creating a mountain of false alarms.
- The Symbolic Executor (The Super-Tester): This is a robot that can walk through every possible hallway in the castle at once to see if a trap actually triggers. It's incredibly precise. However, it can't start walking until you give it a specific door to enter, a map of the furniture, and a list of rules. Writing these instructions manually for a 1.8-million-line castle takes years.
- The LLM (The Genius Intern): This is a super-smart AI that knows how to write code and understands the castle's layout. But if you just ask it, "Find the traps," it might hallucinate (make things up) or guess wrong because it can't actually walk the halls to prove a trap exists.
The Problem:
For years, finding deep, hidden software bugs has been stuck in a bottleneck. You need the Super-Tester (Symbolic Execution) to prove a bug is real, but you can't use it because you can't write the instructions (the "harness") fast enough.
The Solution: "Sailor"
The authors created a system called Sailor that acts like a perfect detective team, combining all three tools into a seamless assembly line. Think of it as a three-stage relay race:
Phase 1: The Scout (Static Analysis)
Instead of asking the AI to guess where to look, the Map Reader (Static Analysis) scans the code first. It doesn't try to prove the bug exists yet; it just says, "Hey, look at line 2699 in this file. Someone is copying data without checking the size. That looks risky."
- Analogy: It's like a security guard pointing a flashlight at a specific, suspicious door and handing a note to the next person: "Check this door. It might be unlocked."
Phase 2: The Architect & The Builder (LLM + Symbolic Execution)
This is the magic part. The Genius Intern (LLM) takes that note and tries to build a "test room" (a harness) to see if the door actually opens.
- The Struggle: The Intern builds a room, but it's missing a wall or has the wrong door handle. The Super-Tester (Symbolic Execution) tries to walk in, hits a wall, and says, "Error: Door handle missing."
- The Fix: The Intern reads the error, fixes the room, and tries again. It does this over and over (iterative refinement), learning from every mistake, until it builds a perfect test room that leads exactly to the suspicious door.
- The Test: Once the room is built, the Super-Tester walks through it. If it finds a trap (a bug), it doesn't just say "I think so." It produces a key (concrete input) that proves the trap works.
Phase 3: The Reality Check (Concrete Validation)
The Super-Tester is great, but sometimes it gets lost in a dream world. To be 100% sure, the team takes the key the Super-Tester made and tries it on the real, unmodified castle.
- Analogy: They hand the key to a human guard and say, "Try this key on the real door." If the door opens and the trap snaps shut, BINGO! It's a real vulnerability. If the key doesn't work on the real door, it was a false alarm, and they discard it.
Why is this a big deal?
The team tested Sailor on 10 massive, real-world software projects (like the tools that power the internet, image processing, and security).
- The Result: Sailor found 379 brand-new, previously unknown security bugs (memory safety issues).
- The Comparison: When they compared Sailor to other methods:
- Just using the AI alone found almost nothing real.
- Just using the Super-Tester with human-written instructions found almost nothing (because humans are too slow to write instructions for everything).
- Sailor was 30 times more effective than the next best method.
The Takeaway
Sailor solves the "scaling" problem. It uses the Map Reader to narrow the search, the Genius Intern to build the test environment automatically, and the Super-Tester to prove the bug is real, all while using a Reality Check to ensure no false alarms slip through.
It's like automating the entire process of finding a needle in a haystack: instead of one person looking for hours, you have a robot that finds the haystack, a smart assistant that builds a magnet, and a final test to make sure the magnet actually picked up a needle.
Drowning in papers in your field?
Get daily digests of the most novel papers matching your research keywords — with technical summaries, in your language.