
njsscan v1.0.0
Escáner SAST semánticamente consciente para aplicaciones Node.js que detecta patrones de código inseguros utilizando coincidencia de patrones de libsast y análisis con conciencia de sintaxis de semgrep.
njsscan
njsscan es una herramienta de pruebas estáticas de seguridad de aplicaciones (SAST) que puede encontrar patrones de código inseguros en tus aplicaciones node.js mediante el comparador de patrones simple de libsast y la herramienta de búsqueda de patrones de código semántico consciente de la sintaxis semgrep.
Apoya a njsscan
Cursos e-Learning y certificaciones
OpSecX Node.js Security: Pentesting and Exploitation - NJS
Instalación
pip install njsscan
Requiere Python 3.10+ y solo es compatible con Mac y Linux
Opciones de la línea de comandos
$ njsscan
usage: njsscan [-h] [--json] [--sarif] [--sonarqube] [--defectdojo] [--gitlab-sast] [--html] [-o OUTPUT] [-c CONFIG] [--missing-controls] [-w] [-v] [path ...]
positional arguments:
path Path can be file(s) or directories with source code
optional arguments:
-h, --help show this help message and exit
--json set output format as JSON
--sarif set output format as SARIF 2.1.0
--sonarqube set output format compatible with SonarQube
--defectdojo set output format compatible with DefectDojo Generic Findings Import
--gitlab-sast set output format as GitLab SAST report
--html set output format as HTML
-o OUTPUT, --output OUTPUT
output filename to save the result
-c CONFIG, --config CONFIG
Location to .njsscan config file
--missing-controls enable missing security controls check
-w, --exit-warning non zero exit code on warning
-v, --version show njsscan version
Ejemplo de uso
$ njsscan test.js
- Pattern Match ████████████████████████████████████████████████████████████ 1
- Semantic Grep ███████████████████████████ 160
njsscan: v0.1.9 | Ajin Abraham | opensecurity.in
╒═════════════╤═══════════════════════════════════════════════════════════════════════════════════════════════╕
│ RULE ID │ express_xss │
├─────────────┼───────────────────────────────────────────────────────────────────────────────────────────────┤
│ OWASP │ A1: Injection │
├─────────────┼───────────────────────────────────────────────────────────────────────────────────────────────┤
│ CWE │ CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') │
├─────────────┼───────────────────────────────────────────────────────────────────────────────────────────────┤
│ DESCRIPTION │ Untrusted User Input in Response will result in Reflected Cross Site Scripting Vulnerability. │
├─────────────┼───────────────────────────────────────────────────────────────────────────────────────────────┤
│ SEVERITY │ ERROR │
├─────────────┼───────────────────────────────────────────────────────────────────────────────────────────────┤
│ FILES │ ╒════════════════╤═══════════════════════════════════════════════╕ │
│ │ │ File │ test.js │ │
│ │ ├────────────────┼───────────────────────────────────────────────┤ │
│ │ │ Match Position │ 5 - 46 │ │
│ │ ├────────────────┼───────────────────────────────────────────────┤ │
│ │ │ Line Number(s) │ 7: 8 │ │
│ │ ├────────────────┼───────────────────────────────────────────────┤ │
│ │ │ Match String │ const { name } = req.query; │ │
│ │ │ │ res.send('<h1> Hello :' + name + "</h1>") │ │
│ │ ╘════════════════╧═══════════════════════════════════════════════╛ │
╘═════════════╧═══════════════════════════════════════════════════════════════════════════════════════════════╛
nodejsscan SAST
nodejsscan, construido sobre njsscan, proporciona una interfaz de usuario completa de gestión de vulnerabilidades junto con otras integraciones muy útiles.

Consulta nodejsscan
API de Python
>>> from njsscan.njsscan import NJSScan
>>> node_source = '/node_source/true_positives/sqli_node.js'
>>> scanner = NJSScan([node_source], json=True, check_controls=False)
>>> scanner.scan()
{
'templates': {},
'nodejs': {
'node_sqli_injection': {
'files': [{
'file_path': '/node_source/true_positives/sqli_node.js',
'match_position': (1, 24),
'match_lines': (4, 11),
'match_string': 'var employeeId = req.foo;\n\nvar sql = "SELECT * FROM trn_employee WHERE employee_id = " + employeeId;\n\n\n\nconnection.query(sql, function (error, results, fields) {\n\n if (error) {\n\n throw error;\n\n }\n\n console.log(results);'
}],
'metadata': {
'owasp': 'A1: Injection',
'cwe': "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')",
'description': 'Untrusted input concatinated with raw SQL query can result in SQL Injection.',
'severity': 'ERROR'
}
}
},
'errors': []
}
Configurar njsscan
Un archivo .njsscan en la raíz del directorio del código fuente te permite configurar njsscan. También puedes usar un archivo .njsscan personalizado mediante el argumento --config.
---
- nodejs-extensions:
- .js
template-extensions:
- .new
- .hbs
- ''
ignore-filenames:
- skip.js
ignore-paths:
- __MACOSX
- skip_dir
- node_modules
ignore-extensions:
- .jsx
ignore-rules:
- regex_injection_dos
- pug_jade_template
severity-filter:
- WARNING
- ERROR
severity-overrides:
express_xss: WARNING
node_secret: ERROR
Suprimir hallazgos
Puedes suprimir hallazgos de los archivos fuente de JavaScript añadiendo el comentario // njsscan-ignore: rule_id1, rule_id2 en la línea que desencadena los hallazgos.
Ejemplo:
app.get('/some/redirect', function (req, res) {
var target = req.param("target");
res.redirect(target); // njsscan-ignore: express_open_redirect
});
Integraciones CI/CD
Acción de GitHub
Añade lo siguiente al archivo .github/workflows/njsscan.yml.
name: njsscan
on:
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]
jobs:
njsscan:
runs-on: ubuntu-latest
name: njsscan check
steps:
- name: Checkout the code
uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: '3.12'
- name: nodejsscan scan
id: njsscan
uses: ajinabraham/njsscan-action@master
with:
args: '.'
Ejemplo: dvna con la acción de GitHub de njsscan
Integración de escaneo de código de GitHub
Añade lo siguiente al archivo .github/workflows/njsscan_sarif.yml.
name: njsscan sarif
on:
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]
jobs:
njsscan:
runs-on: ubuntu-latest
name: njsscan code scanning
steps:
- name: Checkout the code
uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: '3.12'
- name: nodejsscan scan
id: njsscan
uses: ajinabraham/njsscan-action@master
with:
args: '. --sarif --output results.sarif || true'
- name: Upload njsscan report
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif

GitLab CI/CD
Añade lo siguiente al archivo .gitlab-ci.yml.
stages:
- test
njsscan:
image: python:3.12
stage: test
before_script:
- pip3 install --upgrade njsscan
script:
- njsscan . --gitlab-sast -o gl-sast-report.json
artifacts:
reports:
sast: gl-sast-report.json
Ejemplo de comando (local):
njsscan . --gitlab-sast -o gl-sast-report.json
Esto genera un informe SAST nativo de GitLab para que los hallazgos aparezcan en el informe de vulnerabilidades / widget de seguridad de MR sin necesidad de un conversor SARIF.
Ejemplo: dvna con njsscan en GitLab
Travis CI
Añade lo siguiente al archivo .travis.yml.
language: python
install:
- pip3 install --upgrade njsscan
script:
- njsscan .
Circle CI
Añade lo siguiente al archivo .circleci/config.yaml.
version: 2.1
jobs:
njsscan:
docker:
- image: cimg/python:3.9.6
steps:
- checkout
- run:
name: Install njsscan
command: pip install --upgrade njsscan
- run:
name: njsscan check
command: njsscan .
Docker
Imagen precompilada de DockerHub
docker pull opensecurity/njsscan
docker run -v /path-to-source-dir:/src opensecurity/njsscan /src
Construir localmente
docker build -t njsscan .
docker run -v /path-to-source-dir:/src njsscan /src
en India 
