I have an 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!
I'm considering 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!");
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With