Volver a actualizaciones
Nuevo releaseAug 11, 2026

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.

Compartir

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.

Hecho con Amor en India Tweet

PyPI version platform License python Build

Apoya a njsscan

  • Dona vía PayPal: Donate via Paypal
  • Patrocina el proyecto: Github Sponsors

Cursos e-Learning y certificaciones

OpSecX Video Course 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.

interfaz web de nodejsscan

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

interfaz web de nodejsscan

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

Categorías