Skip to content

Tips and tricks

This page captures advanced customization and tweaks supported by scan.

Automatic build

Scan can attempt to build certain project types such as Java, go, node.js, rust and csharp using the bundled runtimes. To enable auto build simply pass --build argument or set the environment variable SCAN_AUTO_BUILD to a non-empty value.

Workspace path prefix

scan tool is typically invoked using the docker container image with volume mounts. Due to this behaviour, the source path the tools would see would be different to the source path in the developer laptop or in the CI environment.

To override the prefix, simply pass the environment variable WORKSPACE with the path that should get prefixed in the reports.

export WORKSPACE="/home/shiftleft/src"

# To specify url
export WORKSPACE="https://github.com/ShiftLeftSecurity/sast-scan/blob/master"

Config file

scan can load configurations automatically from .sastscanrc in the repo root directory. This file is a json file containing the keys from config.py.

Below is an example for overriding the default build breaker logic.

{
  "build_break_rules": {
    "default": {"max_critical": 2, "max_high": 5, "max_medium": 15}
  }
}

Any number of vulnerabilities over and above this limit would cause the build to fail. It is also possible to specify a tool specific rule.

{
  "build_break_rules": {
    "default": {"max_critical": 2, "max_high": 5, "max_medium": 15},
    "Security audit for PHP": {"max_critical": 2, "max_high": 50, "max_medium": 500}
  }
}

With this rule, the tool Security audit for PHP would mark the build as success as shown.

SAST Scan Summary
╔═════════════════════════════════╤══════════╤══════╤════════╤═════╤════════╗
║ Tool                             Critical  High  Medium  Low  Status ║
╟─────────────────────────────────┼──────────┼──────┼────────┼─────┼────────╢
║ Security audit for PHP                  0     0     309    0       ║
║ Security taint analysis for PHP       130     0       0    0       ║
╚═════════════════════════════════╧══════════╧══════╧════════╧═════╧════════╝

With a local config you can override the scan type and even configure the command line args for the tools as shown. In the following table, you can see which are the keys to use in order to configure its build_break_rules:

Tool Key
nodejsscan Static Security code scan
njsscan Static Security code scan
findsecbugs Class File Analyzer
pmd Source Code Analyzer
/opt/pmd-bin/bin/run.sh Source Code Analyzer
gitleaks Secrets Audit
gosec Go Security Audit
tfsec Terraform Static Analysis
lint-tf Terraform Static Analysis
shellcheck Shell Script Analysis
bandit Security Audit for Python
checkov Security Audit for Infrastructure
source-aws Security Audit for AWS
source-arm Security Audit for Azure Resource Manager
source-k8s Kubernetes Security Audit
source-kt Kotlin Static Analysis
audit-kt Kotlin Security Audit
audit-groovy Groovy Security Audit
audit-scala Scala Security Audit
detekt Kotlin Static Analysis
source-tf Terraform Security Audit
source-yaml Security Audit for IaC
staticcheck Go Static Analysis
source Source Aode Analyzer
source-java Java Source Analyzer
source-python Python Source Analyzer
source-php PHP Source Analyzer
phpstan PHP Source Analyzer
audit-python Python Security Audit
audit-php PHP Security Audit
taint-php PHP Security Analysis
taint-python Python Security Analysis
psalm PHP Security Audit
/opt/phpsast/vendor/bin/psalm PHP Security Analysis
source-js JavaScript Source Analyzer
source-go Go Source Analyzer
source-vm Apache Velocity Source Analyzer
source-vf VisualForce Source Analyzer
source-sql SQL Source Analyzer
source-jsp JSP Source Analyzer
source-serverless Serverless Security Audit
audit-jsp JSP Security Audit
source-apex Apex Source Analyzer
binary Binary byte-code Analyzer
class Class File Analyzer
jar Jar File Analyzer
cpg ShiftLeft NextGen Analyzer
inspect ShiftLeft NextGen Analyzer
ng-sast ShiftLeft NextGen Analyzer
source-ruby Ruby Source Analyzer

Note

It is currently not possible to include dependency and license scan result as a build breaker rule. This issue tracks this feature request.

Use CI build reference as runGuid

By setting the environment variable SCAN_ID you can re-use the CI build reference as the run guid for the reports. This is useful to reverse lookup the pipeline result based on the scan result.

Creating bash alias

Add the below alias to your .bashrc or .zshrc file to simplify the scan command for terminal invocations.

scan() {
    docker run --rm -e "WORKSPACE=$(pwd)" -e GITHUB_TOKEN -v "$(pwd):/app" shiftleft/scan scan $*
}

To perform scan with this alias, simply use the word scan

scan --type java

This approach seems to work with Linux, Mac and WSL 1 and 2 for Windows.

Run as normal user

Pass --user uid:gid to the docker run commands to run scan as a normal user. If you get any directory creation errors then create the reports and VDB_HOME directories upfront, chown and then run scan.

mkdir -p reports,vdb
chown -R 1000:1000 reports,vdb
docker run --user 1000:1000 ...

Run without network connectivity

Pass --network none to the docker run command to perform security scan without any external connectivity.

docker run --network none ...

Automatic build and depscan will not work without connectivity. However, by caching the vulnerability database in a directory defined by the environment variable VDB_HOME and by building the projects upfront it is possible to run security scan without any external connectivity.

Seccomp profile

Scan supports invocation with a seccomp profile which can be downloaded from here

# Copy seccomp.json from https://github.com/ShiftLeftSecurity/sast-scan/blob/master/contrib/seccomp.json
podman run --security-opt seccomp=/home/guest/sast-scan/contrib/seccomp.json -e "WORKSPACE=$(pwd)" -v "$(pwd):/app" shiftleft/scan scan

Troubleshooting

Scan by default suppresses all errors and messages from the tools as a philosophy. To debug issues, especially when 0 results are reported by all tools, simply pass the environment variable SCAN_DEBUG_MODE=debug as shown.

-e SCAN_DEBUG_MODE=debug

Last update: January 25, 2023