SAST languages

Agentic SAST in Workbench hunts across the languages present in the cloned repository. Class hunters and language-aware research agents share one worker cap (maximum eight).

Research agents may only list, search, and read the pinned clone. Shell, network, package audit, third-party scanners, and write tools are unavailable. Each language family below is the same matrix the agents receive: typical files, frameworks, attacker-controlled sources, and sensitive sinks.

Start a run from Source analysis in Workbench with a credential-free HTTPS repository URL.

Source analysis in Workbench with repository and upload inputs
Source analysis in Workbench with repository and upload inputs

Language families

FamilyTypical filesFrameworksTypical sourcesTypical sinks
Go.gonet/http, chi, gin, echo, fiber, gorilla, gRPC, sqlc, ent, buffalorequest fields, router params, gRPC metadata, env, flags, queue payloads, deserialized JSONdatabase/sql, sqlx, GORM raw, os/exec, templates, http.Client, file I/O, path joins, gob/yaml/interface{} JSON
JVM.java, .kt, .kts, .scala, .groovy, .clj, .jsp, Gradle/Maven, JenkinsfileSpring, WebFlux, Jakarta EE, Micronaut, Quarkus, Play, Struts, Hibernate, MyBatisHttpServletRequest, @RequestParam / @PathVariable, Kafka/JMS, ObjectInputStream cousinsJDBC/JdbcTemplate, Runtime.exec, ObjectInputStream, XMLDecoder, SnakeYAML, ScriptEngine, SpEL, OGNL, JNDI, Freemarker/Velocity
JavaScript / TypeScript.js, .mjs, .cjs, .ts, .mts, .cts, .jsx, .tsx, Vue, Svelte, Astro, MDX, CoffeeScriptExpress, Fastify, Koa, Nest, Next.js, Nuxt, Remix, SvelteKit, Angular, React Router, Honoreq.body / query / params / headers, URLSearchParams, postMessage, location.hash, cookies, GraphQL variables, Next.js searchParamseval / Function, child_process, innerHTML, ORM raw SQL, res.redirect, user-controlled fetch, vm, YAML load, dangerouslySetInnerHTML
Python.py, .pyi, .pyw, python shebangsDjango, Flask, FastAPI, Tornado, Celery, Starlette, Pyramid, SQLAlchemy, Pandasrequest.args / form / json, Django GET/POST, FastAPI Depends, Celery args, pickle, YAMLcursor.execute, subprocess, os.system, eval/exec, pickle.loads, yaml.load, Jinja2, send_file, user-controlled HTTP, tarfile.extract
PHP.php, .phtml, .inc, Drupal .module / .themeLaravel, Symfony, WordPress, Magento, Yii, CodeIgniter, Drupal$_GET / $_POST / $_REQUEST / $_COOKIE / $_FILES / $_SERVER, php://input, Laravel request()mysqli_query, PDO exec, unserialize, eval, include/require, system/exec, file_get_contents, curl_exec, preg_replace /e, extract
Ruby.rb, .erb, .rake, Haml, Slim, Gemfile, RackupRails, Sinatra, Hanami, Rack, Sidekiqparams, cookies, request.env, Sidekiq jobs, YAML, MarshalActiveRecord.execute, system/exec/backticks, eval, Marshal.load, YAML.load, inline render, send_file, constantize
.NETC#, F#, VB.NET, Razor, .aspx, ASHX/ASMXASP.NET Core, MVC, Web API, Blazor, WCF, Entity Framework, NancyHttpRequest, [FromBody] / [FromQuery], SignalR, gRPC, BinaryFormatter cousins, ViewStateSqlCommand, Process.Start, BinaryFormatter, Newtonsoft TypeNameHandling, XSLT, file writes, HttpClient, Assembly.Load, LDAP paths
C / C++ / Objective-C.c, .cpp, .h, .m, .mm, CUDAPOSIX daemons, CGI, Qt, JNI bridges, Apache modules, CUDAargv, getenv, recv, fread, CGI query, JNI, protobuf parse, CUDA buffersstrcpy/sprintf/gets, system/popen, unbounded memcpy, format-string printf, mmap, execve, SQL concat, XML entity parsers
Rust.rsactix-web, axum, rocket, warp, tonic, diesel, sqlxactix/axum extractors, clap args, serde JSON, envCommand::new, std::fs, sqlx/diesel raw, unsafe / transmute, user-controlled reqwest, shell-bound format_args
Swift.swiftVapor, Kitura, Perfect, UIKit/SwiftUI backendsURL query, JSONDecoder, UserDefaults, deep links, IPCProcess / NSTask, sqlite3, FileManager, WKWebView loadHTMLString, keychain writes, user-controlled URLSession
MobileDart / Flutter, Godot, QML, AIDL, Smali, AndroidManifest.xml, Info.plistFlutter, Android (also JVM), React Native JS, Godot, Qt QuickIntent extras, deep links, MethodChannel, isolate messages, Godot signalsProcess.run, dart:io File, user-controlled HTTP, SQL concat, WebView JavaScript, secrets in SharedPreferences
FunctionalElixir, Erlang, Haskell, Elm, OCaml, Lisp, Gleam, ReScript, Mix/RebarPhoenix, Plug, Cowboy, LiveViewPlug.Conn params, cowboy req, Phoenix socket, BEAM messagesos:cmd, Ecto raw SQL, Code.eval_string, File.write!, user-controlled HTTP, :erlang.binary_to_term
SystemsZig, Nim, Crystal, D, Ada, Fortran, Pascal, assembly, WASM text, Haxe, ValaInfer from neighboring build filesargv, sockets, FFI buffers, WASM importssystem()/exec, unbounded copies, format strings, FFI into libc, wasm memory.grow
ScriptingShell, PowerShell, Perl, Lua, R, Julia, Tcl, Awk, batch, VBScript, AppleScriptInfer from shebang and callerspositional args, env, curl bodies, config fileseval, unquoted expansions, Invoke-Expression, system(), backticks, os.execute, source of a user path
Templates (SSTI)Jinja, Nunjucks, Handlebars, EJS, Pug, Liquid, Twig, Freemarker, Velocity, ColdFusion, XSLTSame engines plus CMS/email mergetemplate context from request, CMS fields, email merge fieldsunescaped HTML, {{constructor}}, Twig/Freemarker/Jinja SSTI, cfinclude, XSLT document(), eval in filters
NotebooksJupyter .ipynb, R Markdown, QuartoJupyter, R Markdown, Quartonotebook parameters, widgets, uploaded data framesshell magics, pickle, pandas reads of a user path, eval of cells, IPython !system
SalesforceApex .cls / .trigger, Visualforce .page / .componentSalesforce, Visualforce, LightningApexPages params, Trigger.new, REST @HttpGet, concatenated SOQLDatabase.query(string), executeAnonymous, eval, callout to a user URL, without sharing classes
IaC / CITerraform, Dockerfile, Helm, GitHub Actions, GitLab CI, Ansible, Bazel, Jsonnet, YAML/TOML, MakefileTerraform, Pulumi, Helm, Kubernetes, GitHub Actions, GitLab CI, CloudFormation, Ansible, Bazelvar interpolations, Helm values, Actions inputs, CI secrets contextprivileged containers, hostPath, wildcard IAM, public buckets, unpinned actions, local-exec, curl | sh, unquoted script:
DataSQL, GraphQL, protobuf, Prisma, Thrift, Avro, Cypher, SPARQL, PL/SQLInfer from neighboring application codebound parameters that became concatenation, GraphQL variablesdynamic SQL, unauth GraphQL mutations, giant nested proto parsers, Prisma $queryRaw
Smart contractsSolidity, Vyper, Move, Cairo, Clarity, Cadence, TON FunC/Tact, YulFoundry, Hardhat, and the chain SDKs abovemsg.sender, calldata, token amounts, signaturesdelegatecall, call.value, unauthorized initialize, reentrancy, tx.origin auth, unchecked transfers
MarkupHTML, CSS/SCSS, SVG, XML, XSD, WSDLInfer from the serving applicationreflected query into templates, CSS expression leftovers, SVG onload, XML entitiesinline event handlers, javascript: URLs, unescaped template holes, CSS url() to internal, XXE
App configJSON/JSONC, INI, properties, plist, .env.example, package.json, go.mod, Cargo.toml, pyproject.tomlPackage and policy manifests next to application sourceconfig values interpolated into commands or URLshardcoded secrets, wildcard CORS, debug=true, 0.0.0.0 binds, overly broad IAM JSON
Other textual sourceExtensionless or uncommon UTF-8 sourceInfer from syntax and neighboring filesInfer from the repositoryInfer from the repository

Unrecognized textual files are still offered to a research agent as Other textual source. Binary, lock, and generated files are skipped.

How files are classified

  1. Match a known extension (.go, .tsx, .tf, …).
  2. Else match a known basename (Dockerfile, Jenkinsfile, mix.exs, androidmanifest.xml, …).
  3. Else sniff a shebang (python, bash, ruby, …).
  4. Else, if the file is non-empty valid UTF-8 with no NUL bytes, treat it as other textual source.

Classification stops at 4,000 files. Higher-risk paths (auth, handlers, routes, upload, CI workflows, Terraform) are ranked first when workers pick anchors.

What is skipped

Directories: .git, node_modules, vendor, dist, build, target, out, coverage, .next, .nuxt, virtualenvs, __pycache__, testdata/fixtures, .gradle, .idea, .terraform, Pods, Carthage, bower_components, and other hidden directories except CI roots (.github, .gitlab, .circleci, .buildkite, .woodpecker).

Files: README/license/changelog, lockfiles (package-lock.json, go.sum, Cargo.lock, …), minified *.min.*, generated stubs (.pb.go, .g.cs, .designer.cs), docs/spreadsheets, and binaries (images, archives, .wasm, .class, .jar, native objects). Empty files, files over 2 MiB, and symlink trees are ignored.

How a run is assigned

  1. Recon maps attack surface and emits class hunts (injection, authz, SSRF, and the rest of the SAST taxonomy).
  2. The same hunt stage adds research workers for the language families actually present, then fills remaining slots with domain focus (authorization, injection, request forgery, deserialization, crypto, business logic, supply chain).
  3. Candidates must cite a real file, line, and snippet. Inflated “zero-day” or CVE claims are dropped.
  4. Survivors still pass Validate and Trace before they are stored as findings.

Need a workflow that is not documented here? Email contact@eresussec.com.