2009-12-31 4 views
3

신뢰할 수없는 코드/어셈블리를 호스팅 할 응용 프로그램 도메인이 있습니다. 나는 보안 속성으로 보안 문제를 모두 해결했다. 신뢰할 수없는 코드는 전용 스레드에서 실행됩니다. CLR은 2.0입니다. 이것은 AppDomainShellAppDomainSeed입니다. 쉘이 주 도메인에서 실행 중이며 시드가 신뢰할 수없는 도메인의 신뢰할 수있는 프록시/도우미입니다.샌드 박스 AppDomain의 스레드 보안

새로운 스레드 생성 및 우선 순위 변경을 제한하고 싶습니다.. 현재 신뢰할 수없는 어셈블리가 ThreadPriority를 ​​설정할 수 있습니다. 10k 스레드를 생성하여 운영 체제를 가장 위험에 처하게하거나 죽일 수 있습니다. SecurityPermissionFlag.ControlThread이 있지만 Abort()와 같은 고급 작업을 막을 수 있습니다.

스레드 클래스 구현을 살펴 보았습니다. 간단한 작업을위한 C# API에는 선언적 보안이 없으며 나머지 구현은 기본입니다.

OS 레벨에서이를 막기 위해 Win32의 일부 기능을 사용할 수 있다고 생각합니다. 그러나 운영 체제가 신뢰할 수없는 스레드/코드/어셈블리를 어떻게 인식합니까? SetThreadPrincipal()?

악용 될 수있는 CLR API가 있습니까? 나는 설치가 필요없고 Mono에 포팅 할 필요가없는 솔루션을 선호한다. -/hmmm.

다른 아이디어는 환영합니다. 감사!

+0

제레미가 더 많은 문맥을 요구했습니다. 그래서 Robocode 로봇을위한 .NET 호스트에서 작업합니다. 처음 출시 된 것은 아닙니다. Robocode가 자바 일다는 것을 아시다시피. 로봇이 속임수를 쓰려고 시도 할 것입니다. 악의적 인 어셈블리입니다. 이제는 속도 때문에 같은 과정에서 필요합니다. Java의 robocode 전투 코어와 .NET의 로봇 사이에 초당 약 5000 건의 호출이 필요합니다. java nad .NET 간의 빠른 통합을 달성하기 위해 무료 프로젝트가 없기 때문에 새로운 프로젝트 jni4net을 시작했습니다. IKVM은 Robocode 커뮤니티의 대부분이 순수한 Java이므로 가능성이 없습니다. 내 블로그에 더. –

답변

2

다른 해결책을 고려 중입니다. 신뢰할 수없는 어셈블리의 CIL 정적 분석. 모든 메소드, 속성, 생성자를 검색 할 수 있습니다. 유형에 대한 참조를 인식합니다. 스레드 유형에 대한 참조를 찾으면 보안 예외가 발생하고 어셈블리가로드됩니다.

나는 Jb Evain의 일을 아주 좋아합니다. 그는 Mono Cecil을 만들었지 만 꽤 큰 체형입니다. 그는 또한 CIL reader의 초안을 .NET 리플렉션과 함께 작성했습니다.

CIL Reader를 사용하여 Linq over reflection을 만들었습니다. 사용법은 이렇게 보입니다.


var myAssembly = typeof (Program).Assembly; 
foreach (Type usedType in myAssembly.GetUsedTypes()) 
{ 
    if (typeof (Thread).IsAssignableFrom(usedType) || 
     typeof (ThreadPool).IsAssignableFrom(usedType) || 
     typeof (ThreadPriority).IsAssignableFrom(usedType) 
     ) 
    { 
     throw new SecurityException("Thread usage is banned here!"); 
    } 
} 
+0

파벨, 왜 '런타임'버전을 포기 했습니까? CLR을 호스팅하지 않으면 불가능한 것으로 드러났습니까? – Bond

+1

예, 호스팅 API없이 샌드 박스가 제공하는 제어가 충분하지 않았습니다. –

+0

리플렉션을 사용하여이를 우회하는 것이 비교적 쉽지 않습니까? – Iridium

0

스레드는 단일 프로세스 내에서 실행되므로 신뢰할 수없는 코드가 프로세스의 우선 순위를 변경할 수 없기 때문에 안전해야합니다. (자세한 내용은 MSDN here을 참조하십시오.)

프로세스 내에서 10k 스레드를 만들조차도 필연적으로 Windows를 죽일 것이라는 것은 확실하지 않습니다. 적어도 Windows NT 위의 Windows 버전은 아닙니다. 그러나 프로세스가 거의 실행되지 않을 것이므로 프로세스 인을 고려하고 원격 또는 WCF와 같은 메커니즘을 사용하여 프로세스간에 통신 할 수 있습니다.

+0

불행하게도 동일한 프로세스에서 실행되는 응용 프로그램의 다른 (Java) 부분으로 빠른 호출이 필요합니다. 그래서 다른 프로세스와 느린 메시지 인터페이스는 해결책이 아닙니다. –

+0

그러면 나는 당신이 무엇을 성취하려고하는지, 왜 악의적 인 의회가 그것을 막을 수 있다고 생각하는지에 대해 더 많이 말해야한다고 생각합니다. –

+0

Jeremy 나는 더 많은 컨텍스트를 제시했다. 부스트 된 스레드 우선 순위는 로봇에 대한 강력한 경쟁 우위입니다. –

0

아마 HostProtectionAttribute은 신뢰할 수없는 코드로 스레드 조작을 제한하기위한 올바른 것입니까?

+0

설명서는 네이티브 호스트를 실행하지 않으면 호스트 보호가 테스트되지 않는다고 말합니다. 정적 인 분석 도구가 아니라 런타임이라고 생각합니다. 어쩌면 나는 이해하지 못했을 것이다 ... –

+0

당신이 런타임을 호스트한다면 LinkDemand처럼 행동한다. –

+0

지금보고 있습니다. 발견 된 항목 : http://blogs.msdn.com/shawnfa/archive/2005/10/12/480186.aspx http://blogs.msdn.com/shawnfa/archive/2005/10/13/480210. aspx 이제 CLR을 실행하는 내부에서 어떻게 달성 할 수 있을지 궁금합니다. http://msdn.microsoft.com/en-us/library/zaf1h1h5%28VS.80%29.aspx –

관련 문제