views:

207

answers:

3

I have application domain to host untrusted code/assembly. I solved all problems with security with security attributes and it works well. The untrusted code runs on dedicated thread. CLR is 2.0. This is what I have AppDomainShell AppDomainSeed, Shell is running in main domain, seed is trusted proxy/helper in untrusted domain.

I'm interested to restrict creating new threads and changing priority. At the moment my untrusted assembly could set ThreadPriority.Highest or kill operating system by creating 10k threads. There is SecurityPermissionFlag.ControlThread but that prevents just from advanced operations like Abort().

I was looking at Thread class implementation and there is no declarative security on C# API of it for those simple operations, rest of the implementation is native.

I guess I could use some Win32 functions to ban that on OS level. But how operating system recognizes the thread/code/assembly which is not trusted? SetThreadPrincipal() ?

Is there any API of CLR which could be abused ? I prefer solution without need for installation and portable to Mono, :-/ hmmm.

Any other ideas welcome. Thanks!

A: 

Threads run within a single process, and you should be safe as your untrusted code can't change the priority of the process. (See MSDN here for details.)

I'm not sure that even creating 10k threads within a process would necessarily kill Windows - at least, not any version of Windows above Windows NT. Your process would almost certainly stop running, however, so you might want to consider two processes and use a mechanism such as remoting or WCF to communciate between them.

Jeremy McGee
Unfortunately I need fast calls into other (Java) part of the application running in same process. So another process and any slow message interface is not solution.
Pavel Savara
Then I think you need to say more about what it is you're trying to achieve and why you assume a malicious assembly might stop it.
Jeremy McGee
Jeremy I gave more context above. Boosted thread priority is strong competitive advantage for robot.
Pavel Savara
A: 

Maybe HostProtectionAttribute is the right thing for limiting thread manipulation by untrusted code?

Pent Ploompuu
Documentation says that the host protection is not tested if you don't run native host. I think it's rather attribute for static analysis tool, not the runtime. Maybe I understood incorrectly...
Pavel Savara
If you host the runtime yourself then it acts like a LinkDemand.
Pent Ploompuu
I'm looking at it now. Found this:http://blogs.msdn.com/shawnfa/archive/2005/10/12/480186.aspxhttp://blogs.msdn.com/shawnfa/archive/2005/10/13/480210.aspxNow I wonder how to achieve that from inside running CLR.http://msdn.microsoft.com/en-us/library/zaf1h1h5%28VS.80%29.aspx
Pavel Savara
It was interesting, but not possible. CLR till v4 can't be twice in same process. I tried code below, but there is restriction in CLR hosting code. It could be verified in Rotor sources.I wrapped several COM interfaces from mscoree.hCLRRuntimeHostClass host = new CLRRuntimeHostClass();ICLRControl icc;host.GetCLRControl(out icc);// this throws COM exception invalid operation,// if CLR is already startedicc.GetCLRManager(ref IID_ICLRHostProtectionManager, out hpmp);
Pavel Savara
Anyway, this is not guaranteed security. Search for "(HPA)" in this article: http://blogs.msdn.com/cbrumme/archive/2004/02/21/77595.aspx
Pavel Savara
A: 

I consider another solution. Static analysis of CIL of untrusted assembly. I could search thru all methods, properties, constructors. Recognize references to types. If I found reference to Thread type, I throw security exception and unload assembly.

I quite like work of Jb Evain. He created Mono Cecil, but that's quite heavyweight. He also drafted CIL reader, just with .NET reflection.

I created Linq over reflection using CIL Reader. Usage look like this.


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!");
    }
}
Pavel Savara