Bruteforce sinks (adversarial-payload reachability)
--bruteforce-sinks statically drives a fixed set of hostile payloads at every risky call site and reports each payload that reaches the call without a recognised guard.
vulkro scan . --bruteforce-sinks
vulkro scan . --bruteforce-sinks --bruteforce-categories sql,payment,llm
Nothing is executed and no network call is made: it is a walk over your code. It is off by default because it is the slowest pass. In the local console, turn it on in the scan run options. Languages: Python, JavaScript and TypeScript.
What it adds to taint analysis
Taint analysis says an input reaches stripe.charges.create. This pass says which kinds of input get there, for example:
amount = -1reaching a payment call with no sign check../../adminreachings3.getObjectwith no path checkignore previous instructionsreaching an LLM call with no system and user role split' OR 1=1 --reachingcursor.executewith no parameter binding
Sink categories
| Tag | Examples |
|---|---|
sql | cursor.execute, Sequelize.query, knex.raw, prisma.$queryRaw |
shell | subprocess.run(shell=True), child_process.exec, os.system |
http | requests.get, httpx.post, axios.*, fetch |
payment | stripe.charges.create, braintree.transaction.sale, razorpay.orders.create |
llm | anthropic.messages.create, openai.chat.completions.create, bedrock.invoke_model |
file-write | open(path, 'w'), Path.write_text, fs.writeFile |
deserialization | pickle.loads, yaml.load, eval, vm.runInNewContext |
email | sendgrid.send, ses.send_email, smtplib.sendmail |
Payload classes (--bruteforce-payload-classes): type-confusion, numeric-extreme, size-extreme, unicode, injection, path-traversal, prompt-injection, payment-extreme.
Recognised guards include type and null checks, length and range checks, anchored regexes, allowlists, sanitisers (html.escape, DOMPurify.sanitize, shlex.quote), parameter binding, path canonicalisation, schema validation (Pydantic, Zod, Joi, Yup, AJV) and yaml.SafeLoader.
Confidence
| Level | Meaning |
|---|---|
| High (default) | No recognised guard on the path. |
| Medium | A guard exists but is not shown to cover this payload class. Opt in with --bruteforce-confidence medium. |
Rule IDs
BFS-<CATEGORY>-<payload-tag>, for example BFS-SQL-sql-or-1-eq-1 or BFS-PAYMENT-payment-negative-amount. IDs are stable across runs, so baselines can key on them.
Environment variables
| Variable | Default | Meaning |
|---|---|---|
VULKRO_BRUTEFORCE_SINKS | unset | 1 turns the pass on |
VULKRO_BRUTEFORCE_DEPTH | 6 | Call depth, 2 to 12 |
VULKRO_BRUTEFORCE_PATHS_PER_FN | 64 | Paths per function, 8 to 512 |
VULKRO_BRUTEFORCE_CATEGORIES | all | Comma-separated tags |
VULKRO_BRUTEFORCE_CONFIDENCE | high | high or medium |
VULKRO_BRUTEFORCE_PAYLOAD_CLASSES | all | Comma-separated tags |
See also: Attack paths, Taint analysis