Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!
vm2 — Sandbox JavaScript isolato per Node.js che esegue codice non attendibile con accesso limitato ai moduli integrati e alle risorse host tramite intercettazione basata su Proxy. | Kitploit
Sandbox JavaScript isolato per Node.js che esegue codice non attendibile con accesso limitato ai moduli integrati e alle risorse host tramite intercettazione basata su Proxy.
vm2 è una sandbox che può eseguire codice non attendibile con i moduli integrati di Node consentiti.
Installazione```sh
npm install vm2
root@kitploit:~
## Esempi rapidi```js
import { VM } from 'vm2';
const vm = new VM();
vm.run(`process.exit()`); // TypeError: process.exit is not a function
I'm ready to translate the Kitploit tool content from English to Italian. Please provide chunk 5 of 55.```js
import { NodeVM } from 'vm2';
const vm = new NodeVM({
require: {
external: true,
root: './',
},
});
vm.run(
var request = require('request'); request('http://www.google.com', function (error, response, body) { console.error(error); if (!error && response.statusCode == 200) { console.log(body); // Show the HTML for the Google homepage. } });,
'vm.js',
);
root@kitploit:~
## Importante Dichiarazione di Sicurezza
**Prima di usare vm2, dovresti capire come funziona e quali sono i suoi limiti.**
vm2 tenta di isolare codice JavaScript non attendibile **all'interno dello stesso processo Node.js** della tua applicazione. Lo fa attraverso una complessa rete di [Proxy](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy) che intercettano e mediano ogni interazione tra la sandbox e l'ambiente host.
### La Sfida Fondamentale
JavaScript è un linguaggio straordinariamente dinamico. Gli oggetti possono essere raggiunti tramite le catene di prototipi, i costruttori possono essere raggiunti tramite gli oggetti di errore, i simboli forniscono hook di protocollo e l'esecuzione asincrona crea finestre di temporizzazione. L'enorme numero di modi per passare da un oggetto all'altro in JavaScript rende estremamente difficile costruire una sandbox in-process a tenuta stagna.
**Siamo onesti su questa realtà:** Nonostante i nostri migliori sforzi, ricercatori e professionisti della sicurezza scoprono continuamente nuovi modi per evadere dalla sandbox di vm2. Correggiamo attivamente queste vulnerabilità man mano che vengono segnalate, ma la natura del gatto e del topo dell'isolamento in-process significa che:
1. **È probabile che in futuro vengano scoperti nuovi bypass.** Controlla i nostri [avvisi di sicurezza](https://github.com/patriksimek/vm2/security/advisories) per le vulnerabilità note.
2. **Devi mantenere vm2 aggiornato** per beneficiare delle ultime correzioni di sicurezza. Iscriviti agli avvisi di sicurezza e aggiorna tempestivamente.
3. **vm2 non dovrebbe essere la tua unica linea di difesa.** La difesa in profondità è essenziale quando si esegue codice non attendibile.
### Alternative Più Robuste
Se hai bisogno di garanzie di isolamento più forti, considera queste alternative che forniscono **un vero isolamento a livello di processo o hardware**:
| Soluzione | Approccio | Prestazioni | Compromessi |
|----------|----------|-------------|------------|
| **[isolated-vm](https://github.com/laverdet/isolated-vm)** | Isolati V8 separati (heap V8 diverso) | Veloce | In modalità manutenzione; richiede aggiornamenti manuali di V8 |
| **Processo separato / Worker** | `child_process` o thread Worker con permessi limitati | Medio | Maggiore overhead IPC; i dati devono essere serializzati |
| **Contenitori / VM** | Docker, gVisor, Firecracker | Lento | Overhead di avvio; uso intensivo di risorse |
| **Servizi gestiti** | Esecuzione di codice basata su cloud (es. AWS Lambda, Cloudflare Workers) | Variabile | Latenza di rete; dipendenza esterna |
### Quando vm2 Può Ancora Essere Appropriato
vm2 può essere adatto quando:
- Hai bisogno di una stretta integrazione con gli oggetti host e una comunicazione sincrona veloce
- Il codice non attendibile proviene da una fonte relativamente affidabile (es. strumenti interni, sistemi di plugin con autori verificati)
- Combini vm2 con altri livelli di sicurezza (isolamento di rete, restrizioni sul filesystem, limiti di risorse)
- Accetti il rischio e monitori attivamente gli aggiornamenti di sicurezza
**Se stai eseguendo codice da fonti completamente non attendibili (es. invii arbitrari da parte degli utenti), ti consigliamo vivamente di utilizzare una soluzione con garanzie di isolamento più forti.**
## Runtime
| Runtime | Stato |
|---------|--------|
| Node.js | Supportato. La sandbox è un confine di sicurezza. |
| Bun | **Sperimentale.** Compatibilità funzionale parziale — **non** è un confine di sicurezza. |
Due limitazioni separate si applicano a Bun, e nessuna implica l'altra.
**Non è un confine di sicurezza.** Il modello di minaccia di vm2, il catalogo degli attacchi in
[`docs/ATTACKS.md`](https://github.com/patriksimek/vm2/blob/main/docs/ATTACKS.md) e ogni test di regressione in `test/ghsa/`
derivano dagli interni di V8. JavaScriptCore, che Bun utilizza, ha i suoi
equivalenti, e nessuno è stato sottoposto ad audit rispetto al bridge di vm2. La suite che passa
sotto Bun dimostra compatibilità, non che la sandbox regga lì. **Non
usare vm2 su Bun per isolare codice non attendibile.**
**La compatibilità è parziale, non parità.** Un'esecuzione Bun verde copre solo i test
che vengono effettivamente eseguiti lì. `test/bun-skips.js` elenca cosa è escluso e perché,
e le lacune comportamentali note includono:
- `Buffer.from(arrayLike)` restituisce un buffer a lunghezza zero
- I metadati `filename` / `lineOffset` / `columnOffset` di `VMScript` non sono
osservabili, perché gli oggetti CallSite di JSC non hanno metodi
- `Object.freeze` su un oggetto host congelato con un accessor non configurabile
genera un `TypeError` di invariante proxy dove V8 non lo fa
- alcune operazioni `Buffer` attraverso il confine della sandbox sono drasticamente più lente —
un `allocUnsafe` da 64 MB richiede oltre 400 secondi contro 1.7 su Node, abbastanza lento
da sembrare un blocco
Tratta il supporto Bun come compatibilità best-effort per codice affidabile e controlla la
lista di esclusione prima di fare affidamento su un comportamento particolare.
## Caratteristiche
- Esegue codice non attendibile in modo sicuro in un singolo processo con il tuo codice affiancato
- Controllo completo sull'output della console della sandbox
- La sandbox ha accesso limitato ai metodi del processo
- È possibile richiedere moduli (integrati ed esterni) dalla sandbox
- Puoi limitare l'accesso a determinati (o tutti) i moduli integrati
- Puoi chiamare metodi in modo sicuro e scambiare dati e callback tra le sandbox
- Mantenuto attivamente con patch per i metodi di fuga noti (vedi [Dichiarazione di Sicurezza](#importante-dichiarazione-di-sicurezza))
- Supporto transpiler
## Come funziona
- Utilizza il modulo VM interno per creare un contesto sicuro.
- Utilizza [Proxy](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy) per impedire la fuga dalla sandbox.
- Sostituisce il require integrato per controllare l'accesso ai moduli.
Per un'analisi approfondita degli interni di vm2, vedi [docs/ATTACKS.md](https://github.com/patriksimek/vm2/blob/main/docs/ATTACKS.md).
## Qual è la differenza tra il modulo vm di Node e vm2?
Provalo tu stesso:```js
import { runInNewContext } from "node:vm";
runInNewContext('this.constructor.constructor("return process")().exit()');
console.log('Never gets executed.');
Strumenti di Sicurezza Offensiva
Questa sezione elenca strumenti di sicurezza offensiva, inclusi framework di penetration testing, suite di exploit, strumenti di social engineering e toolkit di attacco. Questi strumenti sono progettati per test di sicurezza autorizzati e valutazioni di vulnerabilità.
Framework di Penetration Testing
Framework completi che forniscono suite integrate di strumenti per test di sicurezza completi.
Metasploit Framework - Il framework di exploitation più utilizzato al mondo, con oltre 1.500 exploit, payload e tecniche di post-exploitation.
Cobalt Strike - Software di emulazione delle minacce commerciale che consente ai team rossi di simulare attaccanti persistenti avanzati.
Empire - Framework di post-exploitation puramente PowerShell e Python per test di penetrazione.
BeEF - Browser Exploitation Framework focalizzato sul browser web.
Social-Engineer Toolkit (SET) - Framework per attacchi di social engineering con vettori di attacco automatizzati.
Pupy - Framework di post-exploitation cross-platform scritto in Python.
Koadic - Strumento di post-exploitation compatibile con Windows che utilizza tecnologie native come JScript e VBScript.
Powershell Empire - Framework di post-exploitation che utilizza PowerShell per l'accesso e la persistenza.
Suite di Exploit
Collezioni di exploit e strumenti di exploitation per vari sistemi e applicazioni.
ExploitDB - Database pubblico di exploit con oltre 40.000 exploit e shellcode.
SearchSploit - Utilità da riga di comando per cercare nel database ExploitDB.
RouterSploit - Framework di exploitation per dispositivi embedded e router.
Windows Exploit Suggester - Suggerisce potenziali exploit per sistemi Windows in base al numero di build.
Linux Exploit Suggester - Suggerisce potenziali exploit per sistemi Linux in base alla versione del kernel.
Browser Exploit Framework - Framework per lo sviluppo e il test di exploit per browser.
BeEF - Framework di exploitation focalizzato sul browser web.
Armitage - Interfaccia grafica per Metasploit che visualizza gli obiettivi e consente la condivisione di sessioni.
Strumenti di Social Engineering
Strumenti progettati per testare il fattore umano nella sicurezza.
SET - Social-Engineer Toolkit per attacchi di phishing, spear-phishing e vettori di attacco fisico.
GoPhish - Toolkit di phishing open-source per test di phishing e campagne di sensibilizzazione.
PhishX - Framework di phishing automatizzato con modelli e campagne personalizzabili.
Evilginx2 - Framework di phishing man-in-the-middle che aggira l'autenticazione a due fattori.
Modlishka - Framework di phishing reverso che supporta l'autenticazione a due fattori.
King Phisher - Strumento di phishing per test di penetrazione che simula attacchi di phishing reali.
PhishTank - Database collaborativo di siti di phishing verificati.
SocialFish - Toolkit di phishing educativo con modelli di siti web popolari.
Toolkit di Attacco
Strumenti specializzati per tipi specifici di attacchi.
SQLMap - Strumento automatizzato per l'iniezione SQL e l'acquisizione di database.
XSSer - Framework automatizzato per il rilevamento e lo sfruttamento di vulnerabilità XSS.
Commix - Strumento automatizzato per l'iniezione di comandi.
WFuzz - Strumento di fuzzing per applicazioni web per trovare risorse nascoste.
DirBuster - Strumento di brute force per directory e file su server web.
Hydra - Strumento di brute force per password su vari protocolli.
John the Ripper - Cracker di password veloce che supporta molti formati di hash.
Hashcat - Cracker di password avanzato con supporto GPU.
Aircrack-ng - Suite di strumenti per il test di sicurezza delle reti Wi-Fi.
Reaver - Strumento di attacco WPS per reti Wi-Fi.
Wifite - Strumento automatizzato per attacchi alle reti wireless.
Kismet - Rilevatore di reti wireless, sniffer e sistema di rilevamento intrusioni.
Bettercap - Framework di attacco man-in-the-middle potente, flessibile e portabile.
Ettercap - Suite completa per attacchi man-in-the-middle su reti locali.
Responder - Strumento di avvelenamento LLMNR/NBT-NS per l'acquisizione di credenziali.
Mimikatz - Strumento per l'estrazione di credenziali da sistemi Windows.
Impacket - Collezione di classi Python per la costruzione e la decodifica di pacchetti di rete.
PowerSploit - Collezione di script PowerShell per post-exploitation.
Nishang - Framework offensivo PowerShell per penetration testing.
Veil - Framework per generare payload Metasploit che bypassano le soluzioni antivirus.
Shellter - Strumento di iniezione dinamica di shellcode per bypassare i software antivirus.
TheFatRat - Generatore di payload che crea backdoor e bypassa i software antivirus.
MSFvenom - Generatore di payload e encoder di Metasploit.
C2 Frameworks - Framework di comando e controllo per la gestione di sistemi compromessi.
Sliver - Framework di comando e controllo open-source generato da un impianto di impianti.
- Framework di comando e controllo moderno e collaborativo.
new VM().run('this.constructor.constructor("return process")().exit()');
// Throws ReferenceError: process is not defined
root@kitploit:~
## Documentazione
- [VM](#vm)
- [NodeVM](#nodevm)
- [VMScript](#vmscript)
- [Gestione degli errori](#gestione-degli-errori)
- [Debug del codice in sandbox](#debug-del-codice-in-sandbox)
- [Oggetti di sola lettura](#oggetti-di-sola-lettura-sperimentale)
- [Oggetti protetti](#oggetti-protetti-sperimentale)
- [Relazioni tra sandbox](#relazioni-tra-sandbox)
- [CLI](#cli)
- [Modifiche dalla 2.x alla 3.x](https://github.com/patriksimek/vm2/wiki/2.x-to-3.x-changes)
- [Documentazione 1.x e 2.x](https://github.com/patriksimek/vm2/wiki/1.x-and-2.x-docs)
- [Contributi](https://github.com/patriksimek/vm2/wiki/Contributing)
## VM
VM è una sandbox semplice per eseguire in modo sincrono codice non attendibile senza la funzionalità `require`. Sono disponibili solo gli oggetti integrati di JavaScript e il `Buffer` di Node. Le funzioni di pianificazione (`setInterval`, `setTimeout` e `setImmediate`) non sono disponibili per impostazione predefinita.
**Opzioni:**
- `timeout` - Timeout dello script in millisecondi. **ATTENZIONE**: Potresti voler usare questa opzione insieme a `allowAsync=false`. Inoltre, operare sugli oggetti restituiti dalla sandbox può eseguire codice arbitrario e aggirare il timeout. Si dovrebbe verificare se l'oggetto restituito è un primitivo con `typeof` e scartarlo completamente (anche registrare log o creare messaggi di errore con tale oggetto potrebbe eseguire nuovamente codice arbitrario) nel caso contrario.
- `sandbox` - Oggetto globale della VM.
- `compiler` - `javascript` (predefinito), `typescript`, `coffeescript` o una funzione di compilazione personalizzata. La libreria si aspetta che tu abbia il compilatore preinstallato se il valore è impostato su `typescript` o `coffeescript`. **`typescript` richiede `typescript@6` o versioni precedenti** — vedi [Compilatori](#compilatori).
- `eval` - Se impostato su `false`, qualsiasi chiamata a `eval` o ai costruttori di funzioni (`Function`, `GeneratorFunction`, ecc.) genererà un `EvalError` (predefinito: `true`).
- `wasm` - Se impostato su `false`, qualsiasi tentativo di compilare un modulo WebAssembly genererà un `WebAssembly.CompileError` (predefinito: `true`). Nota: `WebAssembly.JSTag` viene rimosso all'interno della sandbox per motivi di sicurezza, quindi il codice wasm non può intercettare le eccezioni JavaScript.
- `allowAsync` - Se impostato su `false`, qualsiasi tentativo di eseguire codice che utilizza `async` genererà un `VMError` (predefinito: `true`).
- `bufferAllocLimit` - Dimensione massima in byte per una singola richiesta `Buffer.alloc` / `Buffer.allocUnsafe` / `Buffer.allocUnsafeSlow` / `Buffer(N)` / `new Buffer(N)` dall'interno della sandbox. Le richieste che superano questo limite generano un `RangeError` in modo sincrono senza eseguire l'allocazione host. Predefinito: `Infinity` (nessun limite, completamente retrocompatibile). Gli embedder che eseguono codice non attendibile in ambienti con memoria limitata (Docker / Kubernetes / Lambda / serverless) dovrebbero optare per un limite finito (ad es. `32 * 1024 * 1024`) come parte della difesa a strati contro il DoS, allo stesso modo in cui optano per `timeout`. Vedi [Raccomandazioni di hardening](#raccomandazioni-di-hardening) di seguito.
**IMPORTANTE**: Il timeout è efficace solo sul codice sincrono che esegui tramite `run`. Il timeout **NON** funziona su alcun metodo restituito dalla VM. Ci sono alcune situazioni in cui il timeout non funziona - vedi [#244](https://github.com/patriksimek/vm2/pull/244).```js
import { VM } from 'vm2';
const vm = new VM({
timeout: 1000,
allowAsync: false,
sandbox: {},
});
vm.run('process.exit()'); // throws ReferenceError: process is not defined
Puoi anche recuperare valori dalla VM.```js
let number = vm.run('1337'); // returns 1337
root@kitploit:~
**SUGGERIMENTO**: Consulta i test per ulteriori esempi di utilizzo.
## NodeVM
A differenza di `VM`, `NodeVM` consente di richiedere moduli nello stesso modo in cui si farebbe nel contesto regolare di Node.
**Opzioni:**
- `console` - `inherit` per abilitare la console, `redirect` per reindirizzare agli eventi, `off` per disabilitare la console (predefinito: `inherit`).
- `sandbox` - Oggetto globale della VM.
- `compiler` - `javascript` (predefinito), `typescript`, `coffeescript` o una funzione di compilazione personalizzata (che riceve il codice e il suo percorso file). La libreria si aspetta che tu abbia il compilatore preinstallato se il valore è impostato su `typescript` o `coffeescript`. **`typescript` richiede `typescript@6` o versioni precedenti** — vedi [Compilatori](#compilers).
- `eval` - Se impostato su `false`, qualsiasi chiamata a `eval` o ai costruttori di funzioni (`Function`, `GeneratorFunction`, ecc.) genererà un `EvalError` (predefinito: `true`).
- `wasm` - Se impostato su `false`, qualsiasi tentativo di compilare un modulo WebAssembly genererà un `WebAssembly.CompileError` (predefinito: `true`). Nota: `WebAssembly.JSTag` viene rimosso all'interno della sandbox per motivi di sicurezza, quindi il codice wasm non può intercettare le eccezioni JavaScript.
- `bufferAllocLimit` - Stessa semantica di `VM` — dimensione massima in byte per una singola richiesta della famiglia `Buffer.alloc` dall'interno della sandbox. Predefinito: `Infinity`. Vedi [Raccomandazioni di hardening](#hardening-recommendations).
- `sourceExtensions` - Array di estensioni di file da trattare come codice sorgente (predefinito: `['js']`).
- `require` - `true`, un oggetto o un Resolver per abilitare il metodo `require` (predefinito: `false`).
- `require.external` - I valori possono essere `true`, un array di moduli esterni consentiti, o un oggetto (predefinito: `false`). Tutti i percorsi che corrispondono a `/node_modules/${qualsiasi_modulo_esterno_consentito}/(?!/node_modules/)` possono essere richiesti.
- `require.external.modules` - Array di moduli esterni consentiti. Supporta anche i caratteri jolly, quindi specificare `['@scope/*-ver-??]`, ad esempio, consentirà di utilizzare tutti i moduli con un nome della forma `@scope/something-ver-aa`, `@scope/other-ver-11`, ecc. Il carattere jolly `*` non corrisponde ai separatori di percorso.
- `require.external.transitive` - Booleano che indica se le dipendenze transitive dei moduli esterni sono consentite (predefinito: `false`). **ATTENZIONE**: Quando un modulo viene richiesto transitivamente, qualsiasi modulo può poi richiederlo normalmente, anche se ciò non era possibile prima del suo caricamento.
- `require.builtin` - Array di moduli integrati consentiti, accetta ["\*"] per tutti (predefinito: nessuno). **ATTENZIONE**: "\*" può essere pericoloso poiché possono essere aggiunti nuovi moduli integrati.
- `require.root` - Percorso(i) limitato(i) in cui i moduli locali possono essere richiesti (predefinito: ogni percorso).
- `require.mock` - Raccolta di moduli fittizi (sia esterni che integrati).
- `require.context` - `host` (predefinito) per richiedere moduli nell'host e inoltrarli nella sandbox. `sandbox` per caricare, compilare e richiedere moduli nella sandbox. `callback(moduleFilename, ext)` per scegliere dinamicamente un contesto per ogni modulo. Il predefinito sarà sandbox se non viene specificato nulla. Ad eccezione di `events`, i moduli integrati vengono sempre richiesti nell'host e inoltrati nella sandbox.
- `require.import` - Un array di moduli da caricare in NodeVM all'avvio.
- `require.resolve` - Una funzione di ricerca aggiuntiva nel caso in cui un modulo non venga trovato in uno dei percorsi di ricerca tradizionali di node.
- `require.customRequire` - Da usare al posto della funzione `require` per caricare moduli dall'host.
- `require.strict` - `false` per non forzare la modalità strict sui moduli caricati tramite require (predefinito: `true`).
- `require.fs` - Implementazione personalizzata del file system.
- `nesting` - **ATTENZIONE**: Consentire questo è un rischio per la sicurezza poiché gli script possono creare una NodeVM che può richiedere qualsiasi modulo host. `true` per abilitare l'annidamento delle VM (predefinito: `false`).
- `wrapper` - `commonjs` (predefinito) per avvolgere lo script nel wrapper CommonJS, `none` per recuperare il valore restituito dallo script.
- `argv` - Array da passare a `process.argv`.
- `env` - Oggetto da passare a `process.env`.
- `strict` - `true` per caricare i moduli in modalità strict (predefinito: `false`).
**IMPORTANTE**: Il timeout non è efficace per NodeVM, quindi non è immune a `while (true) {}` o simili attacchi.
**RICORDA**: Più moduli consenti, più fragile diventa la tua sandbox.```js
import { NodeVM } from 'vm2';
const vm = new NodeVM({
console: 'inherit',
sandbox: {},
require: {
external: true,
builtin: ['fs', 'path'],
root: './',
mock: {
fs: {
readFileSync: () => 'Nice try!',
},
},
},
});
// Sync
let functionInSandbox = vm.run('module.exports = function(who) { console.log("hello "+ who); }');
functionInSandbox('world');
// Async
let functionWithCallbackInSandbox = vm.run('module.exports = function(who, callback) { callback("hello "+ who); }');
functionWithCallbackInSandbox('world', greeting => {
console.log(greeting);
});
Quando wrapper è impostato su none, NodeVM si comporta più come VM per il codice sincrono.```js
assert.ok(vm.run('return true') === true);
root@kitploit:~
**SUGGERIMENTO**: Consulta i test per ulteriori esempi di utilizzo.
### Caricamento di moduli tramite percorso relativo
Per caricare moduli tramite percorso relativo, devi passare il percorso completo dello script che stai eseguendo come secondo argomento al metodo `run` di vm se lo script è una stringa. Il nome del file viene quindi visualizzato in qualsiasi stack trace generato dallo script.```js
vm.run('require("foobar")', '/data/myvmscript.js');
Se lo script che stai eseguendo è un VMScript, il percorso viene fornito nel costruttore di VMScript.```js
const script = new VMScript('require("foobar")', { filename: '/data/myvmscript.js' });
vm.run(script);
root@kitploit:~
### Resolver
Un resolver può essere creato tramite `makeResolverFromLegacyOptions` e utilizzato per più istanze di `NodeVM`, consentendo di condividere il codice dei moduli compilati e potenzialmente accelerando i tempi di caricamento. Il primo esempio di `NodeVM` può essere riscritto utilizzando `makeResolverFromLegacyOptions` come segue.```js
const resolver = makeResolverFromLegacyOptions({
external: true,
builtin: ['fs', 'path'],
root: './',
mock: {
fs: {
readFileSync: () => 'Nice try!',
},
},
});
const vm = new NodeVM({
console: 'inherit',
sandbox: {},
require: resolver,
});
VMScript
Puoi aumentare le prestazioni utilizzando script precompilati. Il VMScript precompilato può essere eseguito più volte. È importante notare che il codice non è legato a nessuna VM (contesto); piuttosto, viene associato prima di ogni esecuzione, solo per quella esecuzione.```js
import { VM, VMScript } from 'vm2';
const vm = new VM();
const script = new VMScript('Math.random()');
console.log(vm.run(script));
console.log(vm.run(script));
root@kitploit:~
Funziona sia per `VM` che per `NodeVM`.```js
import { NodeVM, VMScript } from 'vm2';
const vm = new NodeVM();
const script = new VMScript('module.exports = Math.random()');
console.log(vm.run(script));
console.log(vm.run(script));
Il codice viene compilato automaticamente la prima volta che viene eseguito. È possibile compilare il codice in qualsiasi momento con script.compile(). Una volta che il codice è compilato, il metodo non ha alcun effetto.
Compilatori
compiler accetta javascript (predefinito), typescript, coffeescript oppure una propria funzione. I compilatori typescript e coffeescript sono opzionali — installa il pacchetto tu stesso; vm2 non dipende da nessuno dei due.
TypeScript
Il compilatore typescript integrato richiede typescript@6 o versioni precedenti.
vm2 esegue la transpilazione tramite l'API transpileModule() di TypeScript. TypeScript 7 l'ha rimossa dal punto di ingresso del pacchetto — require('typescript') lì risolve solo a { version, versionMajorMinor }, e l'API sostitutiva si trova dietro i sottopercorsi esplicitamente instabili typescript/unstable/*, nessuno dei quali fornisce un equivalente di transpilazione a file singolo. Non c'è quindi nulla a cui vm2 possa ripiegare sulla 7.x.
Selezionare compiler: 'typescript' con TypeScript 7 installato genera un'eccezione in new VMScript(...) / new VM(...):```
VMError: The installed TypeScript (7.0.2) does not expose the transpileModule() API that
vm2's built-in TypeScript compiler uses; it was removed from the package entry point in
TypeScript 7. Install typescript@6 or earlier, or pass your own transpiler as a function:
{ compiler: (code, filename) => javaScriptSource }.
root@kitploit:~
Either pin `typescript@6`, or supply your own transpiler — any function returning JavaScript works, so TypeScript 7's `tsc`, esbuild, swc, or a type-stripper are all valid:```js
import { VM, VMScript } from 'vm2';
import { transformSync } from 'esbuild';
const script = new VMScript('const x: number = 1; x', {
compiler: (code, filename) => transformSync(code, { loader: 'ts', format: 'cjs' }).code,
});
new VM().run(script);
Un compilatore personalizzato riceve (code, filename) e deve restituire codice sorgente JavaScript. Viene eseguito nel realm host, prima del sandboxing — trattalo come codice fidato e non crearne mai uno a partire da input non fidato.
CoffeeScript
Richiede che coffee-script sia installato. Compilato con { header: false, bare: true }; qualsiasi compilerOptions tu passi viene unito a quelle.
Gestione degli errori
Gli errori nella compilazione del codice e nell'esecuzione sincrona del codice possono essere gestiti con try-catch. Gli errori nell'esecuzione asincrona del codice possono essere gestiti collegando un gestore di eventi uncaughtException al process di Node.```js
try {
var script = new VMScript('Math.random()').compile();
} catch (err) {
console.error('Failed to compile script.', err);
}
## Debug di un codice in sandbox
Puoi eseguire il debug o ispezionare il codice in esecuzione nella sandbox come se fosse eseguito in un processo normale.
- Puoi usare i breakpoint (che richiedono di specificare un nome di file di script)
- Puoi usare la parola chiave `debugger`.
- Puoi usare step-in per entrare nel codice in esecuzione nella sandbox.
### Esempio
/tmp/main.js:```js
import { VM, VMScript } from 'vm2';
import { readFileSync } from 'node:fs';
const file = `${__dirname}/sandbox.js`;
// By providing a file name as second argument you enable breakpoints
const script = new VMScript(readFileSync(file), file);
new VM().run(script);
/tmp/sandbox.js```js
const foo = 'ahoj';
// The debugger keyword works just fine everywhere.
// Even without specifying a file name to the VMScript object.
debugger;
root@kitploit:~
## Oggetti di sola lettura (sperimentale)
Per impedire agli script in sandbox di aggiungere, modificare o eliminare proprietà dagli oggetti proxy, puoi usare i metodi `freeze` per rendere l'oggetto di sola lettura. Questo è efficace solo all'interno della VM. Gli oggetti congelati vengono influenzati in profondità. I tipi primitivi non possono essere congelati.
**Esempio senza usare `freeze`:**```js
const util = {
add: (a, b) => a + b,
};
const vm = new VM({
sandbox: { util },
});
vm.run('util.add = (a, b) => a - b');
console.log(util.add(1, 1)); // returns 0
Esempio con l'uso di freeze:```js
const vm = new VM(); // Objects specified in the sandbox cannot be frozen.
vm.freeze(util, 'util'); // Second argument adds object to global.
vm.run('util.add = (a, b) => a - b'); // Fails silently when not in strict mode.
console.log(util.add(1, 1)); // returns 2
root@kitploit:~
**IMPORTANTE:** Non è possibile congelare oggetti che sono già stati inoltrati tramite proxy alla VM.
## Oggetti protetti (sperimentale)
A differenza di `freeze`, questo metodo consente agli script in sandbox di aggiungere, modificare o eliminare proprietà sugli oggetti, con un'eccezione: non è possibile associare funzioni. Gli script in sandbox non sono quindi in grado di modificare metodi come `toJSON`, `toString` o `inspect`.
**IMPORTANTE:** Non è possibile proteggere oggetti che sono già stati inoltrati tramite proxy alla VM.
## Relazioni tra sandbox```js
const assert = require('assert');
const { VM } = require('vm2');
const sandbox = {
object: new Object(),
func: new Function(),
buffer: new Buffer([0x01, 0x05]),
};
const vm = new VM({ sandbox });
assert.ok(vm.run(`object`) === sandbox.object);
assert.ok(vm.run(`object instanceof Object`));
assert.ok(vm.run(`object`) instanceof Object);
assert.ok(vm.run(`object.__proto__ === Object.prototype`));
assert.ok(vm.run(`object`).__proto__ === Object.prototype);
assert.ok(vm.run(`func`) === sandbox.func);
assert.ok(vm.run(`func instanceof Function`));
assert.ok(vm.run(`func`) instanceof Function);
assert.ok(vm.run(`func.__proto__ === Function.prototype`));
assert.ok(vm.run(`func`).__proto__ === Function.prototype);
assert.ok(vm.run(`new func() instanceof func`));
assert.ok(vm.run(`new func()`) instanceof sandbox.func);
assert.ok(vm.run(`new func().__proto__ === func.prototype`));
assert.ok(vm.run(`new func()`).__proto__ === sandbox.func.prototype);
assert.ok(vm.run(`buffer`) === sandbox.buffer);
assert.ok(vm.run(`buffer instanceof Buffer`));
assert.ok(vm.run(`buffer`) instanceof Buffer);
assert.ok(vm.run(`buffer.__proto__ === Buffer.prototype`));
assert.ok(vm.run(`buffer`).__proto__ === Buffer.prototype);
assert.ok(vm.run(`buffer.slice(0, 1) instanceof Buffer`));
assert.ok(vm.run(`buffer.slice(0, 1)`) instanceof Buffer);
CLI
Prima di poter usare vm2 dalla riga di comando, installalo globalmente con npm install vm2 -g.```sh
vm2 ./script.js
root@kitploit:~
## Raccomandazioni di hardening
vm2 previene le evasioni della sandbox (codice non fidato che ottiene accesso al realm dell'host). Non previene, **da solo**, ogni forma di esaurimento delle risorse o denial-of-service. Gli integratori che eseguono codice non fidato dovrebbero aggiungere le seguenti difese a strati attorno alla sandbox.
### 1. Limitare l'allocazione di memoria con `bufferAllocLimit`
Una singola chiamata `Buffer.alloc(N)` con `N` controllato dall'attaccante viene eseguita come un'unica allocazione C++ sincrona dell'host che il `timeout` di V8 non può interrompere. In ambienti con memoria limitata, un payload della sandbox di ~100 byte può far aumentare l'RSS dell'host di oltre 100 MB e mandare in crash il processo host tramite OOM. Imposta `bufferAllocLimit` (ad es. `32 * 1024 * 1024`) per limitare le singole allocazioni:```js
const vm = new VM({
timeout: 1000,
bufferAllocLimit: 32 * 1024 * 1024,
allowAsync: false,
});
Il cap si applica anche ai percorsi deprecati Buffer(N) e new Buffer(N). Nota che l'esaurimento aggregato (molte piccole allocazioni, Buffer.concat, Uint8Array, String.repeat, Array(n).fill(), ecc.) non è coperto da questo cap — combinalo con un limite di memoria lato host (--max-old-space-size, limite del container, cgroup) per una copertura completa.
2. Installare un handler unhandledRejection lato host
Esiste una classe di DoS da terminazione del processo host in cui il codice della sandbox crea una async function, async function* o await using il cui corpo lancia un valore che attiva un errore nel realm host durante la formattazione dello stack (ad es. e.name = Symbol(); e.stack). V8 crea la promise di rifiuto tramite la Promise intrinseca del realm, che bypassa il wrap della sottoclasse Promise di vm2, quindi il rifiuto sfugge all'host come unhandledRejection. Su Node 15+ il comportamento predefinito è terminare il processo.
Chiudere questa falla richiede di modificare il comportamento osservabile dell'host, quindi vm2 non fornisce una correzione per impostazione predefinita. Gli embedder dovrebbero installare un handler a livello di processo che inghiotta (o registri) i rifiuti provenienti dalla sandbox:```js
// Recommended: filter rejections that originated inside vm2 and swallow them,
// while letting your own host-side rejections propagate.
process.on('unhandledRejection', (reason, promise) => {
// Heuristic: rejections from the sandbox frequently surface as values
// without proper Error semantics, or with stacks pointing at vm.js.
// Adjust the predicate to match your application.
if (looksLikeSandboxOrigin(reason)) {
return; // swallow — don't terminate the process
}
// Otherwise: handle (or rethrow) as normal for your host code.
yourLogger.error('unhandled rejection', reason);
});
root@kitploit:~
Se la tua applicazione non ha altre fonti di rejection non gestite, un "swallow" generico + log è accettabile:```js
process.on('unhandledRejection', reason => {
yourLogger.warn('swallowed sandbox rejection', reason);
});
Una correzione mirata potrebbe essere distribuita dietro un flag opt-in swallowSandboxUnhandledRejections in una futura release minore; fino ad allora, il gestore lato host è la mitigazione raccomandata.
3. Esegui con un limite di memoria a livello di processo
Anche con bufferAllocLimit impostato, esegui il processo host con --max-old-space-size (o un limite di memoria del container equivalente) dimensionato per il carico di lavoro. Il limite protegge contro la primitiva di allocazione singola; il limite a livello di OS protegge contro l'esaurimento aggregato e contro qualsiasi futura primitiva di allocazione che vm2 non ha ancora limitato.
4. Tratta require.builtin: ['*'] come una configurazione non-sandbox
Il wildcard '*' si espande alla maggior parte dei built-in di Node, inclusi child_process, fs, dgram, net, http e dns. Questi sono primitive a piena capacità host — require('child_process').execSync('id') è raggiungibile dalla sandbox sotto '*'. La semantica di '*' di vm2 è intenzionale (alcuni embedder eseguono codice fidato ma isolato), ma non dovrebbe essere usata come default per codice non fidato. Preferisci una allowlist esplicita del set più piccolo di moduli di cui la tua sandbox ha realmente bisogno.
5. nesting: true è un portello di fuga
nesting: true consente al codice della sandbox di fare require('vm2') e costruire NodeVM annidate. La configurazione require della VM annidata è scelta dal codice della sandbox che la costruisce, non vincolata dalla VM esterna. Concretamente:```js
const vm = new NodeVM({ nesting: true, require: { builtin: [] } });
vm.run( const { NodeVM: NVM } = require('vm2'); // Inner VM's config is whatever the sandbox writes here: const inner = new NVM({ require: { builtin: ['child_process'] } }); inner.run('require("child_process").execSync("id")'); // RCE);
root@kitploit:~
Se imposti `nesting: true`, hai di fatto concesso alla sandbox lo stesso livello di fiducia che hai tu. **Non abilitare `nesting: true` per codice non attendibile.** Usalo solo quando ti fidi del codice in sandbox ma vuoi una semantica di esecuzione in stile VM (global fresco, timeout controllati) per motivi non legati alla sicurezza.
`nesting: true` **richiede un oggetto `require` esplicito** (es. `require: { builtin: [] }` o `require: {}`). Qualsiasi altra forma — `require: false`, `require: undefined`, `require: null`, o l'omissione di `require` — genera un `VMError` in fase di costruzione (GHSA-m4wx-m65x-ghrr, che sostituisce GHSA-8hg8-63c5-gwmx). Tutte queste forme producono un resolver solo-NESTING_OVERRIDE: la sandbox può fare `require('vm2')` ma nient'altro, il che è una pura primitiva di fuga senza alcun uso legittimo. Per negare tutti i require, rimuovi `nesting: true`. Per consentire VM annidate, fornisci una configurazione `require` esplicita così che il compromesso sia visibile nel punto di chiamata.
## Problemi noti
- Non è possibile definire una classe che estende una classe proxata. Questo include l'uso di una classe proxata in `Object.create`.
- L'eval diretta non funziona.
- Il logging degli array della sandbox ripeterà la parte dell'array nelle proprietà.
- Le trasformazioni del codice sorgente possono produrre una stringa sorgente diversa per una funzione.
- Ci sono modi per far crashare il processo node dall'interno della sandbox. Vedi [Raccomandazioni per l'hardening](#hardening-recommendations).
- Il compilatore `typescript` integrato non funziona con TypeScript 7 o versioni successive, che hanno rimosso l'API `transpileModule()` usata da vm2. Usa `typescript@6` o passa il tuo transpiler — vedi [Compilers](#compilers).
[npm-image]: https://img.shields.io/npm/v/vm2.svg
[npm-url]: https://www.npmjs.com/package/vm2
[license-image]: https://img.shields.io/npm/l/vm2.svg
[license-url]: https://raw.githubusercontent.com/patriksimek/vm2/resurrection/LICENSE.md
[downloads-image]: https://img.shields.io/npm/dm/vm2.svg
[downloads-url]: https://www.npmjs.com/package/vm2
[snyk-image]: https://snyk.io/test/github/patriksimek/vm2/badge.svg
[snyk-url]: https://snyk.io/test/github/patriksimek/vm2
Brute Ratel - Framework di comando e controllo commerciale con funzionalità evasive.
Nighthawk - Framework di comando e controllo commerciale con tecniche avanzate di evasione.
Villain - Framework di comando e controllo per la gestione di sessioni di shell.
Merlin - Framework di comando e controllo post-exploitation scritto in Go.
PoshC2 - Framework di comando e controllo basato su PowerShell.
Covenant - Framework di comando e controllo .NET per la post-exploitation.
Faction - Framework di comando e controllo basato su API.
Pupy - Framework di post-exploitation cross-platform con supporto per più trasporti.
Koadic - Strumento di post-exploitation compatibile con Windows.
DeathStar - Strumento di automazione per l'escalation dei privilegi in Active Directory.
BloodHound - Strumento di analisi dei percorsi di attacco in Active Directory.
SharpHound - Collettore di dati per BloodHound.
Rubeus - Toolkit per l'utilizzo di Kerberos in ambienti Active Directory.
Kerberoast - Tecnica per l'estrazione di ticket Kerberos e il cracking delle password.
ASREPRoast - Tecnica per l'estrazione di hash di account senza pre-autenticazione.
Golden Ticket - Tecnica per la creazione di ticket Kerberos falsi.
Silver Ticket - Tecnica per la creazione di ticket di servizio falsi.
Pass-the-Hash - Tecnica per l'autenticazione utilizzando hash di password.
Pass-the-Ticket - Tecnica per l'autenticazione utilizzando ticket Kerberos.
Overpass-the-Hash - Tecnica per la conversione di hash in ticket Kerberos.
DC Sync - Tecnica per l'estrazione di hash di password da controller di dominio.
DC Shadow - Tecnica per la creazione di controller di dominio ombra.
Skeleton Key - Tecnica per l'iniezione di una backdoor in un controller di dominio.
DCSync - Tecnica per l'estrazione di hash di password da controller di dominio.
Mimikatz - Strumento per l'estrazione di credenziali da sistemi Windows.
LaZagne - Strumento per il recupero di password memorizzate su sistemi locali.
Windows Credential Editor - Strumento per l'estrazione di credenziali da sistemi Windows.
NirSoft Suite - Collezione di strumenti per il recupero di password e dati.
Browser Password Recovery - Strumenti per il recupero di password salvate nei browser.
Wifi Password Recovery - Strumenti per il recupero di password Wi-Fi salvate.
Mail Password Recovery - Strumenti per il recupero di password di client di posta.
FTP Password Recovery - Strumenti per il recupero di password di client FTP.
Database Password Recovery - Strumenti per il recupero di password di database.
SSH Password Recovery - Strumenti per il recupero di password SSH.
VPN Password Recovery - Strumenti per il recupero di password VPN.
Instant Messenger Password Recovery - Strumenti per il recupero di password di messaggistica istantanea.
Network Password Recovery - Strumenti per il recupero di password di rete.
System Password Recovery - Strumenti per il recupero di password di sistema.
Application Password Recovery - Strumenti per il recupero di password di applicazioni.
Registry Password Recovery - Strumenti per il recupero di password dal registro di sistema.
Memory Password Recovery - Strumenti per il recupero di password dalla memoria.
Disk Password Recovery - Strumenti per il recupero di password di dischi.
File Password Recovery - Strumenti per il recupero di password di file.
Archive Password Recovery - Strumenti per il recupero di password di archivi.
Office Password Recovery - Strumenti per il recupero di password di documenti Office.
PDF Password Recovery - Strumenti per il recupero di password di PDF.
ZIP Password Recovery - Strumenti per il recupero di password di archivi ZIP.
RAR Password Recovery - Strumenti per il recupero di password di archivi RAR.
7-Zip Password Recovery - Strumenti per il recupero di password di archivi 7-Zip.
Windows Login Password Recovery - Strumenti per il recupero di password di accesso a Windows.
Linux Login Password Recovery - Strumenti per il recupero di password di accesso a Linux.
macOS Login Password Recovery - Strumenti per il recupero di password di accesso a macOS.
BIOS Password Recovery - Strumenti per il recupero di password BIOS.
CMOS Password Recovery - Strumenti per il recupero di password CMOS.
EFI Password Recovery - Strumenti per il recupero di password EFI.
UEFI Password Recovery - Strumenti per il recupero di password UEFI.
TPM Password Recovery - Strumenti per il recupero di password TPM.
BitLocker Password Recovery - Strumenti per il recupero di password BitLocker.
FileVault Password Recovery - Strumenti per il recupero di password FileVault.
LUKS Password Recovery - Strumenti per il recupero di password LUKS.
TrueCrypt Password Recovery - Strumenti per il recupero di password TrueCrypt.
VeraCrypt Password Recovery - Strumenti per il recupero di password VeraCrypt.
PGP Password Recovery - Strumenti per il recupero di password PGP.
GPG Password Recovery - Strumenti per il recupero di password GPG.
SSH Key Password Recovery - Strumenti per il recupero di password di chiavi SSH.
SSL Certificate Password Recovery - Strumenti per il recupero di password di certificati SSL.
PKCS#12 Password Recovery - Strumenti per il recupero di password PKCS#12.
Java Keystore Password Recovery - Strumenti per il recupero di password di keystore Java.
Android Lock Screen Password Recovery - Strumenti per il recupero di password di schermata di blocco Android.
iOS Lock Screen Password Recovery - Strumenti per il recupero di password di schermata di blocco iOS.
Windows Hello Password Recovery - Strumenti per il recupero di password Windows Hello.
Fingerprint Password Recovery - Strumenti per il recupero di password tramite impronte digitali.
Face Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento facciale.
Iris Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento dell'iride.
Voice Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento vocale.
Behavioral Biometrics Password Recovery - Strumenti per il recupero di password tramite biometria comportamentale.
Keystroke Dynamics Password Recovery - Strumenti per il recupero di password tramite dinamica di battitura.
Mouse Dynamics Password Recovery - Strumenti per il recupero di password tramite dinamica del mouse.
Touch Dynamics Password Recovery - Strumenti per il recupero di password tramite dinamica del tocco.
Gait Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento dell'andatura.
Heartbeat Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del battito cardiaco.
Brainwave Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle onde cerebrali.
DNA Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del DNA.
Retina Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della retina.
Palm Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del palmo.
Hand Geometry Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della geometria della mano.
Vein Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle vene.
Ear Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento dell'orecchio.
Nose Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del naso.
Lip Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle labbra.
Teeth Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento dei denti.
Tongue Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della lingua.
Skin Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della pelle.
Hair Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento dei capelli.
Nail Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle unghie.
Scar Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle cicatrici.
Tattoo Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento dei tatuaggi.
Birthmark Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle voglie.
Mole Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento dei nei.
Freckle Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle lentiggini.
Wrinkle Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle rughe.
Dimple Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle fossette.
Cleft Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle fossette.
Chin Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del mento.
Cheek Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle guance.
Forehead Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della fronte.
Eyebrow Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle sopracciglia.
Eyelash Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle ciglia.
Eyelid Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento delle palpebre.
Eye Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento degli occhi.
Pupil Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della pupilla.
Iris Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento dell'iride.
Sclera Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della sclera.
Conjunctiva Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della congiuntiva.
Cornea Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della cornea.
Lens Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del cristallino.
Vitreous Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del vitreo.
Retina Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della retina.
Optic Nerve Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del nervo ottico.
Macula Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della macula.
Fovea Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della fovea.
Blind Spot Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del punto cieco.
Visual Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia visiva.
Auditory Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia uditiva.
Olfactory Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia olfattiva.
Gustatory Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia gustativa.
Somatosensory Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia somatosensoriale.
Motor Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia motoria.
Prefrontal Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia prefrontale.
Temporal Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia temporale.
Parietal Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia parietale.
Occipital Cortex Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento della corteccia occipitale.
Cerebellum Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del cervelletto.
Brainstem Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del tronco encefalico.
Spinal Cord Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del midollo spinale.
Peripheral Nerve Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento dei nervi periferici.
Autonomic Nervous System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema nervoso autonomo.
Sympathetic Nervous System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema nervoso simpatico.
Parasympathetic Nervous System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema nervoso parasimpatico.
Enteric Nervous System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema nervoso enterico.
Somatic Nervous System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema nervoso somatico.
Central Nervous System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema nervoso centrale.
Peripheral Nervous System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema nervoso periferico.
Nervous System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema nervoso.
Endocrine System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema endocrino.
Immune System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema immunitario.
Lymphatic System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema linfatico.
Circulatory System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema circolatorio.
Respiratory System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema respiratorio.
Digestive System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema digerente.
Urinary System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema urinario.
Reproductive System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema riproduttivo.
Muscular System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema muscolare.
Skeletal System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema scheletrico.
Integumentary System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema tegumentario.
Exocrine System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema esocrino.
Sensory System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema sensoriale.
Motor System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema motorio.
Cognitive System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema cognitivo.
Emotional System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema emotivo.
Behavioral System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema comportamentale.
Social System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema sociale.
Cultural System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema culturale.
Economic System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema economico.
Political System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema politico.
Legal System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema legale.
Educational System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema educativo.
Healthcare System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema sanitario.
Transportation System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di trasporto.
Communication System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di comunicazione.
Energy System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema energetico.
Water System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema idrico.
Food System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema alimentare.
Agricultural System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema agricolo.
Industrial System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema industriale.
Manufacturing System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema manifatturiero.
Construction System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema edilizio.
Mining System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema minerario.
Forestry System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema forestale.
Fishery System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema ittico.
Livestock System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema zootecnico.
Poultry System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema avicolo.
Dairy System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema lattiero-caseario.
Aquaculture System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di acquacoltura.
Horticulture System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema orticolo.
Viticulture System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema viticolo.
Oenology System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema enologico.
Brewing System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di birrificazione.
Distilling System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di distillazione.
Fermentation System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di fermentazione.
Biotechnology System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema biotecnologico.
Genetic Engineering System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di ingegneria genetica.
Synthetic Biology System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di biologia sintetica.
Nanotechnology System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema nanotecnologico.
Robotics System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema robotico.
Artificial Intelligence System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di intelligenza artificiale.
Machine Learning System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di apprendimento automatico.
Deep Learning System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di apprendimento profondo.
Neural Network System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di rete neurale.
Expert System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema esperto.
Decision Support System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di supporto decisionale.
Management Information System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema informativo gestionale.
Enterprise Resource Planning System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema ERP.
Customer Relationship Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema CRM.
Supply Chain Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della supply chain.
Human Resource Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione delle risorse umane.
Financial Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione finanziaria.
Accounting System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema contabile.
Inventory Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dell'inventario.
Warehouse Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione del magazzino.
Logistics Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione logistica.
Transportation Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei trasporti.
Fleet Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della flotta.
Asset Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione degli asset.
Maintenance Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della manutenzione.
Quality Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della qualità.
Safety Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della sicurezza.
Environmental Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione ambientale.
Energy Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione energetica.
Water Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione delle acque.
Waste Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei rifiuti.
Recycling Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione del riciclaggio.
Pollution Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dell'inquinamento.
Climate Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione del clima.
Weather Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione meteorologica.
Disaster Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei disastri.
Emergency Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione delle emergenze.
Crisis Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione delle crisi.
Risk Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei rischi.
Compliance Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della conformità.
Audit Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione degli audit.
Governance Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della governance.
Security Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della sicurezza.
Privacy Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della privacy.
Data Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei dati.
Database Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei database.
Information Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione delle informazioni.
Knowledge Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della conoscenza.
Document Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei documenti.
Content Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei contenuti.
Learning Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dell'apprendimento.
Training Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della formazione.
Talent Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei talenti.
Performance Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione delle prestazioni.
Compensation Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione della compensazione.
Benefits Management System Recognition Password Recovery - Strumenti per il recupero di password tramite riconoscimento del sistema di gestione dei benefit.