2013-07-09 3 views
0

저는 Node.js (-awesome-)를 배우고 있으며 차세대 MUD (온라인 텍스트 기반 게임)를 만드는 데이 아이디어를 사용하고 있습니다. 이러한 게임에는 다양한 명령, 스킬, 주문 등이있어서 당신이 뛰어 다니고 수백 개의 방/장소를 탐색 할 때 악의적 인 사람을 죽이는 데 사용할 수 있습니다. 일반적으로 이러한 기능은 꽤 정적입니다. 일반적으로 새 주문을 만들거나 새 방을 만들 수는 없습니다. 그러나 나는 맞춤법과 방 등을 정의하는 코드를 사용자가 편집 할 수있는 머드를 만들고 싶습니다.Sandboxing Node.js 모듈 - 완료 할 수 있습니까?

보안 문제가 있습니다. 예를 들어, 악의적 인 사용자가 자식 프로세스 'rm -r /'을 분기하는 일부 JS를 업로드 할 수 있습니다. 나는 게임의 내부를 보호하는 것에 관심이 없다. (가능한 한 많이 확보하고 있지만 모든 것이 공개 된 언어로 할 수있는 일은 너무 많다.) 코드 변경 위키 스타일을 항상 추적하고 예를 들어 사용자를 처벌 할 수 있습니다. 서버를 충돌 시키거나 9000 이상으로 전원을 높이십시오.하지만 서버의 OS를 확실하게 보호하고 싶습니다.

비슷한 질문에 대한 다른 답변을 살펴본 결과 대부분의 사람들은 샌드 박스 버전의 Node를 실행하는 것이 좋습니다. 내 상황에서는 (적어도 잘) 작동하지 않을 것입니다. 사용자 정의 JS가 파일 시스템, 시스템 명령, 중요한 코어 모듈 등과 상호 작용할 필요가있는 MUD 엔진과 상호 작용할 필요가 있기 때문입니다. 가설처럼 이러한 트랜잭션은 모두 엔진에서 JSON 인코딩되어 샌드 박스 처리 된 프로세스로 보내져 JSON을 통해 엔진으로 반환 될 수 있지만 플레이어의 히트 포인트를 얻기 위해 호출 할 때마다 고비용의 노력이 필요합니다. 다른 프로세스로 전달되었습니다. 말할 필요도없이 동기를 피하는 것이 좋습니다.

단일 노드 모듈을 "샌드하는"방법이 있는지 궁금합니다. 내 생각에 그런 샌드 박스는 단순히 '요구'기능을 비활성화해야하며 모든 것이 더없이 행복 할 것입니다. 그래서 Google/SO에서 아무 것도 찾을 수 없기 때문에 스스로 질문을 던질 것이라고 생각했습니다.

+0

이것은 매우 청초하게 들립니다 :) 브라우저에서 사용자의 코드를 실행하고 결과 값을 ajax를 통해 노드로 전송하는 방법에 대해 어떻게 생각하십니까? 그렇게하면 특정 값만 수정할 수있는 인터페이스 (예 : 건강, 마나, 레벨, 스킬 등)를 제공 할 수 있고 서버 측을 제한 할 수 있으며 서버에서 악의적 인 코드가 실행될 위험이 없습니다. 그게 뭔가 효과가있는 것처럼 보이나요? – asifrc

+0

감사합니다. :-). 불행히도 그것은 내가하고자하는 일을 위해 잘 작동하지 않을 것입니다. 샌드 박스 처리 방식과 거의 비슷합니다. 예를 들어, 방이 이벤트를 등록하여 누군가가 들어 왔을 때를 감지하고 마법의 빛을 자동으로 켭니다 (;-)). 또는 NPC가 당신을 따라하거나, 치유 주문을 시전하거나, 약점 등을 기준으로 적에게 원소 주문을 지능적으로 던지기로 결정할 수 있습니다. 따라서이 엔티티는 실제로 서버에서 서로 상호 작용할 수 있어야합니다. 그래도 고마워! – opensourcejunkie

답변

1

좋아, 그래서 좀 더 지금 그것에 대해 생각하고, 나는 기본적인 전략이 있다고 생각 : eval'ed에서

var require = function(module) { 
    throw "Uh-oh, untrusted code tried to load module '" + module + "'"; 
} 
var module = null; 
// use similar strategy for anything else susceptible 

var loadUntrusted = function() { 
    eval(code); 
} 

기본적으로, 우리가 노드 API를 숨기기 위해 로컬 범위 변수를 사용을 코드를 작성하고 코드를 실행하십시오. 또 다른 취약점은 노드 API의 객체가 신뢰할 수없는 코드로 전달된다는 것입니다. 예를 들어 버퍼가 신뢰할 수없는 객체/함수로 전달되었으므로 해당 객체/함수가 프로토 타입 체인을 따라 작동하고 키 버퍼 함수를 ​​자체 악의적 인 버전으로 바꿀 수있었습니다. 이는 예를 들어, 모든 버퍼를 사용하게 할 것이다. 파일 IO 또는 파이핑 시스템 명령 등은 주입에 취약합니다.

그래서이 작업을 성공적으로 수행하려면 신뢰할 수없는 개체를 자신의 세계로 분할해야합니다. 외부 세계는 메서드를 호출 할 수 있지만 외부 세계의 메서드를 호출 할 수는 없습니다. 물론 누구나이 전략과 관련하여 생각할 수있는 보안 취약점에 대해 자유롭게 말해 줄 수 있습니다.