2011-09-16 2 views
33

node.js에서 사용자 제출 스크립트 (안전하게 악의적 인)를 실행할 수있는 옵션은 무엇입니까? 나는. 코드가 민감한 데이터 및 API에 액세스하지 못하도록하는 환경에서node.js 샌드 박스에서 사용자 제출 스크립트를 안전하게 실행하는 방법은 무엇입니까?

vm.runInNewContext(userScript, {})은 유혹적인 출발점이지만 ... known issues이있는 것 같습니다.

sandbox module은 재미있어 보이지만 runInNewContext()도 사용합니다.

+0

노드 코어의 일부이기 때문에'vm '을 사용하는 것이 좋습니다. 그리고 노드 코어가 버그를 고치는 경향이 있기 때문에 문제가 해결 될 것이라고 가정합니다. – Raynos

+0

@Raynos 버그가 아닙니다. 워드 프로세서는 단지 알려진 코드만을위한 것이라고 말합니다. – thejh

+0

@thejh - true이지만, API는 코드가 완전히 다른 컨텍스트에서 실행되고 있다는 사실에 대해 매우 합리적인 믿음을 갖기 때문에이 코드가 현재 컨텍스트에 액세스 할 수 없어야 함을 의미합니다. API의 * 의도 *가 정확히 스크립트를 실행하는 샌드 박스를 제공하기를 기대합니다. ... 이건 아주 잘 문서화 된 버그라고 생각합니다. :) – broofa

답변

29

항상 신뢰할 수없는 코드는 별도의 프로세스에서 실행해야합니다. 이는 샌드 박스 모듈이 수행하는 것과 정확히 같습니다. 간단한 이유는 노드를 고정시킵니다.

별도의 프로세스를 시작하여 나중에 표준 출력에서 ​​JSON에 직렬화 된 결과를 전송합니다. 부모 프로세스는 자식이 수행하는 작업에 관계없이 실행을 계속하고 제한 시간을 트리거 할 수 있습니다.

그런 다음 신뢰할 수없는 코드는 strict mode이라는 클로저로 래핑됩니다 (일반 JavaScript에서는 arguments.callee.caller을 사용하여 범위 외부의 데이터에 액세스 할 수 있음). 마지막으로 매우 제한된 global 개체가 전달되어 노드의 API에 대한 액세스를 차단합니다. 신뢰할 수없는 코드는 기본 계산 만 수행 할 수 있으며 파일이나 소켓에 액세스 할 수 없습니다. 당신은 영감 샌드 박스의 코드를 읽어야하는 동안

, 나는 그대로 사용을 권장하지 것이다 :

  • 코드는 기존지고 7 개월 동안 업데이트되지 않았습니다.
  • 노드의 하위 프로세스 모듈은 필요한 대부분의 기능, 특히 child_process.fork()을 제공합니다.
  • child_process.fork에서 제공하는 IPC 채널의 성능이 아마도 좋을 것입니다.

보안을 강화하려면 setuid-sandbox을 고려해 볼 수도 있습니다. 탭 프로세스가 파일 시스템에 액세스하지 못하도록 Google 크롬에서 사용하는 코드입니다. 네이티브 모듈을 만들어야하지만이 example은 간단합니다.

+3

'vm' 모듈의 메소드는 이제'while (true) {}'을 안전하게 실행할 수있는'timeout' 매개 변수를 지원합니다. 분명히 보안 문제를 해결하지는 않지만 끝없는 루프를 처리합니다. –

+0

@AndrewPaprocki 시간 제한이 표시되는 문서에 연결할 수 있습니까? –

+0

@RobFox 이것은 v0.11에 있습니다. http://nodejs.org/docs/v0.11.13/api/vm.html –

8

특히 Node.JS 응용 프로그램에서 이러한 문제 중 일부를 해결하는 a newer module on github called vm2이 있습니다. 어쩌면 그게 내가 방금 한 것처럼 다른 사람들이 찾는데 도움이 될지도 모른다.

관련 문제