node vm and childprocess: executando códigos não confiáveis no seu servidor

40
Node VM and ChildProcess Executando códigos não confiáveis no seu servidor

Upload: evandro-eisinger

Post on 12-Apr-2017

165 views

Category:

Technology


1 download

TRANSCRIPT

Node VM and ChildProcessExecutando códigos não confiáveis no seu servidor

Evandro EisingerEngenheiro de Software - globo.com

Jonathan PratesEngenheiro de Software - globo.com

Motivação :)

LIGUE QUATRO

1. Como rodar código de uma forma segura?

2. Como otimizar o processamento das partidas?

Problemas :(

function Player () {var fs = require('fs');

this.move = function () {// hora de dar tchauwhile (true) {

console.log(process.pid);console.log(__filename);console.log(fs.readdirSync(__dirname));

}

return 0;}

}

Code time #

Modulo para gerenciar contextos (execution

environment) da engine (v8).

Node VM

Node VM server para compilar e executar código

em contextos isolados.

require('vm')

Compila, executa e retorna o resultado. Não tem

acesso ao escopo local, mas tem aos objetos

globais.

vm.runInThisContext(code, options)

Code time #

Gera um novo ambiente de execução na engine

(v8) a partir de um objeto.

vm.createContext(context)

Code time #

Compila, executa o código no contexto passado e

retorna o resultado.

vm.runInContext(code, context, options)

Code time #

Compila, não executa e nem vincula a um

contexto.

vm.Script(code, options)

Code time #

Solução \o/

Code time #

"Note that running untrusted code is a tricky

business requiring great care."

"script.runInNewContext is quite useful, but

safely running untrusted code requires a separate

process."

Carrega e executa um processo filho (no sistema

operacional) e captura as saídas do programa.

Child Process

"It is possible to stream data through a child's

stdin, stdout, and stderr in a fully non-blocking

way."

"Child processes and parent processes can

communicate neatly back and forth, and parent

processes can listen to and control their child

processes."

spawn, parent and pid #

stdin, stdout and stderr #

Executa um comando e armazena o retorno em

um buffer.

child_process.exec(cmd, opts, cb)

Code time #

Executa um comando e envia ao processo pai o

retorno através de streams.

child_process.spawn(cmd, args, opts)

Code time #

Executa um processo filho do nodejs. Permite a

comunicação entre pai e filho através da classe

EventEmitter.

child_process.fork(module, args, opts)

"These child Node.js processes are still whole new

instances of V8. Assume at least 30ms startup and

10mb memory for each new Node.js. That is, you

cannot create many thousands of them."

"Unlike the fork() POSIX system call,

child_process.fork() does not clone the current

process."

Code time #

Solução \o/

runnner.jsProcesso (pai)

Contexto

(v8)

X

match.jsProcesso (filho)

P1 Contexto

(v8)

P2 Contexto

(v8)

Contexto (v8)

cpu's

Cria partida

Retorna resultado

LIGUE QUATROlig4.globo.com

talentos.globo.com

Obrigado !

Dúvidas ?