Skip to content

Permessi

I permessi possono essere utilizzati per controllare a quali risorse di sistema il processo Node.js ha accesso o quali azioni il processo può eseguire con tali risorse.

  • I permessi basati sul processo controllano l'accesso del processo Node.js alle risorse. La risorsa può essere completamente consentita o negata, oppure è possibile controllare le azioni ad essa correlate. Ad esempio, le letture del file system possono essere consentite mentre le scritture vengono negate. Questa funzionalità non protegge da codice dannoso. Secondo la Policy di sicurezza di Node.js, Node.js si fida di qualsiasi codice che gli viene richiesto di eseguire.

Il modello di permessi implementa un approccio "cintura di sicurezza", che impedisce al codice attendibile di modificare inavvertitamente file o utilizzare risorse a cui non è stato esplicitamente concesso l'accesso. Non fornisce garanzie di sicurezza in presenza di codice dannoso. Il codice dannoso può bypassare il modello di permessi ed eseguire codice arbitrario senza le restrizioni imposte dal modello di permessi.

Se riscontri una potenziale vulnerabilità di sicurezza, fai riferimento alla nostra Policy di sicurezza.

Permessi basati sul processo

Modello di permessi

[Stabile: 2 - Stabile]

Stabile: 2 Stabilità: 2 - Stabile.

Il modello di permessi di Node.js è un meccanismo per limitare l'accesso a risorse specifiche durante l'esecuzione. L'API esiste dietro un flag --permission che, una volta abilitato, limiterà l'accesso a tutti i permessi disponibili.

I permessi disponibili sono documentati dal flag --permission.

Quando si avvia Node.js con --permission, la possibilità di accedere al file system tramite il modulo fs, generare processi, utilizzare node:worker_threads, utilizzare addon nativi, utilizzare WASI e abilitare l'inspector di runtime sarà limitata.

bash
$ node --permission index.js

Error: Accesso a questa API è stato limitato
    at node:internal/main/run_main_module:23:47 {
  code: 'ERR_ACCESS_DENIED',
  permission: 'FileSystemRead',
  resource: '/home/user/index.js'
}

È possibile consentire l'accesso alla generazione di un processo e alla creazione di thread worker utilizzando rispettivamente --allow-child-process e --allow-worker.

Per consentire gli addon nativi quando si utilizza il modello di permessi, utilizzare il flag --allow-addons. Per WASI, utilizzare il flag --allow-wasi.

API di runtime

Abilitando il Modello di Autorizzazione tramite il flag --permission, viene aggiunta una nuova proprietà permission all'oggetto process. Questa proprietà contiene una funzione:

permission.has(scope[, reference])

Chiamata API per verificare le autorizzazioni in runtime (permission.has())

js
process.permission.has('fs.write') // true
process.permission.has('fs.write', '/home/rafaelgss/protected-folder') // true

process.permission.has('fs.read') // true
process.permission.has('fs.read', '/home/rafaelgss/protected-folder') // false

Autorizzazioni del file system

Il Modello di Autorizzazione, per impostazione predefinita, limita l'accesso al file system tramite il modulo node:fs. Non garantisce che gli utenti non saranno in grado di accedere al file system attraverso altri mezzi, come ad esempio tramite il modulo node:sqlite.

Per consentire l'accesso al file system, utilizzare i flag --allow-fs-read e --allow-fs-write:

bash
$ node --permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!

Gli argomenti validi per entrambi i flag sono:

  • * - Per consentire rispettivamente tutte le operazioni FileSystemRead o FileSystemWrite.
  • Percorsi delimitati da virgola (,) per consentire solo le operazioni FileSystemRead o FileSystemWrite corrispondenti, rispettivamente.

Esempio:

  • --allow-fs-read=* - Consentirà tutte le operazioni FileSystemRead.
  • --allow-fs-write=* - Consentirà tutte le operazioni FileSystemWrite.
  • --allow-fs-write=/tmp/ - Consentirà l'accesso FileSystemWrite alla cartella /tmp/.
  • --allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore - Consente l'accesso FileSystemRead alla cartella /tmp/ e al percorso /home/.gitignore.

Sono supportati anche i caratteri jolly:

  • --allow-fs-read=/home/test* consentirà l'accesso in lettura a tutto ciò che corrisponde al carattere jolly. es: /home/test/file1 o /home/test2

Dopo aver passato un carattere jolly (*), tutti i caratteri successivi verranno ignorati. Ad esempio: /home/*.js funzionerà in modo simile a /home/*.

Quando il modello di autorizzazione viene inizializzato, aggiungerà automaticamente un carattere jolly (_) se la directory specificata esiste. Ad esempio, se esiste /home/test/files, verrà trattata come /home/test/files/_. Tuttavia, se la directory non esiste, il carattere jolly non verrà aggiunto e l'accesso sarà limitato a /home/test/files. Se si desidera consentire l'accesso a una cartella che non esiste ancora, assicurarsi di includere esplicitamente il carattere jolly: /my-path/folder-do-not-exist/\*.

Vincoli del modello di autorizzazione

Esistono dei vincoli che è necessario conoscere prima di utilizzare questo sistema:

  • Il modello non viene ereditato da un processo figlio o da un thread worker.

  • Quando si utilizza il Modello di Autorizzazione, le seguenti funzionalità saranno limitate:

    • Moduli nativi
    • Processi figlio
    • Thread worker
    • Protocollo ispettore
    • Accesso al file system
    • WASI
  • Il Modello di Autorizzazione viene inizializzato dopo che l'ambiente Node.js è stato configurato. Tuttavia, alcuni flag come --env-file o --openssl-config sono progettati per leggere file prima dell'inizializzazione dell'ambiente. Di conseguenza, tali flag non sono soggetti alle regole del Modello di Autorizzazione. Lo stesso vale per i flag V8 che possono essere impostati tramite runtime tramite v8.setFlagsFromString.

  • I motori OpenSSL non possono essere richiesti in fase di runtime quando il Modello di Autorizzazione è abilitato, influenzando i moduli crypto, https e tls integrati.

  • Le estensioni caricabili in fase di esecuzione non possono essere caricate quando il Modello di Autorizzazione è abilitato, influenzando il modulo sqlite.

  • L'utilizzo di descrittori di file esistenti tramite il modulo node:fs ignora il Modello di Autorizzazione.

Limitazioni e problemi noti

  • I collegamenti simbolici verranno seguiti anche in posizioni esterne all'insieme di percorsi a cui è stato concesso l'accesso. I collegamenti simbolici relativi possono consentire l'accesso a file e directory arbitrarie. Quando si avviano applicazioni con il modello di autorizzazione abilitato, è necessario assicurarsi che nessun percorso a cui è stato concesso l'accesso contenga collegamenti simbolici relativi.