
njsscan v1.0.1
Scanner SAST sémantique pour les applications Node.js qui détecte les modèles de code non sécurisés en utilisant la correspondance de motifs de libsast et l'analyse syntaxique de semgrep.
njsscan
njsscan est un outil de test statique d'application (SAST) qui peut détecter des motifs de code non sécurisés dans vos applications node.js en utilisant un simple comparateur de motifs issu de libsast et l'outil de recherche de motifs de code sémantique sensible à la syntaxe semgrep.
Soutenir njsscan
Cours e-Learning et Certifications
OpSecX Node.js Security: Pentesting and Exploitation - NJS
Installation
pip install njsscan
Nécessite Python 3.10+ et ne prend en charge que Mac et Linux
Options de ligne de commande
$ 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
Exemple d'utilisation
$ 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, construit au-dessus de njsscan, fournit une interface utilisateur complète de gestion des vulnérabilités ainsi que d'autres intégrations astucieuses.

Voir nodejsscan
API 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': []
}
Configurer njsscan
Un fichier .njsscan à la racine du répertoire du code source vous permet de configurer njsscan. Vous pouvez également utiliser un fichier .njsscan personnalisé via l'argument --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
Supprimer des résultats
Vous pouvez supprimer des résultats provenant de fichiers source javascript en ajoutant le commentaire // njsscan-ignore: rule_id1, rule_id2 sur la ligne qui déclenche les résultats.
Exemple :
app.get('/some/redirect', function (req, res) {
var target = req.param("target");
res.redirect(target); // njsscan-ignore: express_open_redirect
});
Intégrations CI/CD
Vous pouvez activer njsscan dans vos pipelines CI/CD ou DevSecOps.
Github Action
Ajoutez ce qui suit au fichier .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@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.12'
- name: nodejsscan scan
id: njsscan
uses: ajinabraham/njsscan-action@231750a435d85095d33be7d192d52ec650625146 # v9
with:
args: '.'
Exemple : dvna avec njsscan github action
Intégration Github Code Scanning
Ajoutez ce qui suit au fichier .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@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.12'
- name: nodejsscan scan
id: njsscan
uses: ajinabraham/njsscan-action@231750a435d85095d33be7d192d52ec650625146 # v9
with:
args: '. --sarif --output results.sarif || true'
- name: Upload njsscan report
uses: github/codeql-action/upload-sarif@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
with:
sarif_file: results.sarif

Gitlab CI/CD
Ajoutez ce qui suit au fichier .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:
when: always
reports:
sast: gl-sast-report.json
Exemple de commande (en local) :
njsscan . --gitlab-sast -o gl-sast-report.json
Cela écrit un rapport GitLab SAST natif afin que les résultats apparaissent dans le Vulnerability Report / widget de sécurité des MR sans convertisseur SARIF.
Exemple : dvna avec njsscan gitlab
Travis CI
Ajoutez ce qui suit au fichier .travis.yml.
language: python
install:
- pip3 install --upgrade njsscan
script:
- njsscan .
Circle CI
Ajoutez ce qui suit au fichier .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
Image préconstruite depuis DockerHub
docker pull opensecurity/njsscan
docker run -v /path-to-source-dir:/src opensecurity/njsscan /src
Construire localement
docker build -t njsscan .
docker run -v /path-to-source-dir:/src njsscan /src
en Inde 
