feat(three-stage-scan): add split-sink fixtures the regex scan misses

This commit is contained in:
Marius Ciepluch
2026-09-04 11:49:44 +02:00
parent 818a0b10d3
commit fe300e6352
11 changed files with 198 additions and 2 deletions
@@ -0,0 +1,8 @@
#include <stdio.h>
#include <sqlite3.h>
void search(sqlite3 *db, char *term) {
char query[512];
snprintf(query, sizeof(query), "SELECT * FROM items WHERE title LIKE '%%%s%%'", term);
sqlite3_exec(db, query, 0, 0, 0); /* CWE-89 split-sink: query built on prior line (regex blind spot) */
}
@@ -0,0 +1,12 @@
package example;
import jakarta.servlet.http.HttpServletRequest;
import java.sql.Connection;
class SplitSinkServlet {
void search(HttpServletRequest request, Connection connection) throws Exception {
String term = request.getParameter("q");
String sql = String.format("select * from items where title like '%%%s%%'", term);
connection.createStatement().executeQuery(sql); // CWE-89 split-sink: sql built on prior line (regex blind spot)
}
}
@@ -0,0 +1,12 @@
// Split-sink SQL injection: query is built, then executed on the next line.
const express = require("express");
const app = express();
app.get("/search", (req, res) => {
const term = req.query.q;
const query = "select * from items where title like '%" + term + "%'";
db.query(query); // CWE-89 split-sink: query built on prior line (regex blind spot)
res.send("ok");
});
module.exports = app;
@@ -0,0 +1,11 @@
"""Split-sink SQL injection: query is built, then executed on the next line."""
from flask import Flask, request
app = Flask(__name__)
@app.get("/search")
def search(db):
term = request.args["q"]
query = "select * from items where title like '%" + term + "%'"
return db.execute(query) # CWE-89 split-sink: query built on prior line (regex blind spot)
+20
View File
@@ -0,0 +1,20 @@
name = "split-sink-c"
language = "c_cpp"
frameworks = ["native"]
setup = []
modes = ["quick", "standard"]
known_noise = []
baselines = []
[source]
type = "local"
path = "../fixtures/split-sink-c"
[[expected]]
cwe = "CWE-89"
class = "sql injection"
path = "src/vuln.c"
line = 7
function = "search"
sink = "sqlite3_exec"
evidence = "sqlite3_exec runs a SQL query string built from attacker input on a prior line"
+20
View File
@@ -0,0 +1,20 @@
name = "split-sink-java"
language = "java_web"
frameworks = ["servlet"]
setup = ["mvn test"]
modes = ["quick", "standard"]
known_noise = []
baselines = []
[source]
type = "local"
path = "../fixtures/split-sink-java"
[[expected]]
cwe = "CWE-89"
class = "sql injection"
path = "src/main/java/example/SplitSinkServlet.java"
line = 10
function = "search"
sink = "executeQuery"
evidence = "executeQuery runs a SQL string built from request input on a prior line"
@@ -0,0 +1,19 @@
name = "split-sink-javascript"
language = "javascript_node_web"
frameworks = ["node", "express"]
setup = ["npm install"]
modes = ["quick", "standard"]
known_noise = []
baselines = []
[source]
type = "local"
path = "../fixtures/split-sink-javascript"
[[expected]]
cwe = "CWE-89"
class = "sql injection"
path = "src/app.js"
line = 8
sink = "query"
evidence = "query runs a SQL string built from request input on a prior line"
@@ -0,0 +1,20 @@
name = "split-sink-python"
language = "python_web"
frameworks = ["flask"]
setup = ["pip install flask"]
modes = ["quick", "standard"]
known_noise = []
baselines = []
[source]
type = "local"
path = "../fixtures/split-sink-python"
[[expected]]
cwe = "CWE-89"
class = "sql injection"
path = "app.py"
line = 11
function = "search"
sink = "execute"
evidence = "execute runs a SQL query string built from request input on a prior line"