[Mono-list] Does System.Security.Permissions.FileIOPermission work?
Andy Hume
andyhume32 at yahoo.co.uk
Mon Apr 21 07:52:11 EDT 2008
On 21 April 2008 00:21 Yawar Amin wrote:
> I'm running Mono 1.2.4 on Ubuntu 7.10. I've been trying to
> use the System.Security.Permissions.FileIOPermission class to
The first thing to note is that CAS is not fully implemented on Mono,
and is disabled by default. http://www.mono-project.com/CAS However
this is immaterial here, see below.
> `demand' write access to my home directory and all its parent
> directories (i.e.
> /home, /). Here's a sample script based on my understanding
> of the security permissions concept:
>
> // test_security_permissions.cs
> using System.IO;
> using System.Security.Permissions;
>
> class Test_Security_Permissions {
> /*
> Demands write access to all parents of this directory. Framework
> is supposed to throw an exception if access is not granted.
> */
This is actually /not/ what CAS is for, remember that it is *Code*
Access Security. That is, it is orthogonal to *Role* Access Security.
As a user I run some .NET code in my web browser, *I* (logged in as Role
"user1" say) have full rights to do anything with files in my home
directory (chmod etc shows that), however I don't trust the *Code* that
I'm downloading and running, so *it* has no rights to do anything with
files at all.
> static void demand_write_access_to_all_parents(string dir_arg) {
> DirectoryInfo curr_dir = new DirectoryInfo(dir_arg);
>
> (new FileIOPermission(FileIOPermissionAccess.Write,
> curr_dir.FullName)).Demand();
So here Demand is checking that all the *calling methods* on the stack
have CAS permission for that permission. (So, assuming CAS was fully
implemented or running on the MSFT CLR) since we're running a
command-line program on the local disk it will be Fully-Trusted, and
thus all the code is fully-trusted and all permissions will be granted
and thus any demand will always succeed.
> System.Console.WriteLine("Successfully demanded write
> access to {0}", curr_dir.FullName);
> if (curr_dir.FullName != curr_dir.Root.FullName) {
>
> Test_Security_Permissions.demand_write_access_to_all_parents(c
> urr_dir.Parent.FullName);
> }
> }
>
> public static void Main() {
> Test_Security_Permissions.demand_write_access_to_all_parents(".");
> }
> }
>
> What's happening is that it seems to successfully `get' write
> access to all these directories:
>
Yup, as above. When I run this on the MSFT CLR I see the same behaviour
-- all successes.
However, if I run the code from the network it then gets "Intranet"
permissions. In that permission set FileIOPermission is a restricted
set (Read/Dir access to the network directory from which it was run).
So I get the following failure:
[[
C:\temp>"\\pc1\temp\Test_Security_Permissions.exe"
Unhandled Exception: System.Security.SecurityException: Request for the
permission of type 'System.Security.Permissions.FileIOPermission,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089' failed.
at System.Security.CodeAccessSecurityEngine.Check(Object demand,
StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.CodeAccessPermission.Demand()
at System.IO.DirectoryInfo..ctor(String path)
at
Test_Security_Permissions.demand_write_access_to_all_parents(String
dir_arg)
at Test_Security_Permissions.Main()
The action that failed was:
Demand
The type of the first permission that failed was:
System.Security.Permissions.FileIOPermission
The first permission that failed was:
<IPermission class="System.Security.Permissions.FileIOPermission,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089"
version="1"
Read="C:\temp\."/>
....
....
]]
> yawar at yawar-laptop:~/code$ gmcs test_security_permissions.cs
> /t:exe && mono test_security_permissions.exe Successfully
> demanded write access to /home/yawar/code Successfully
> demanded write access to /home/yawar Successfully demanded
> write access to /home Successfully demanded write access to /
> yawar at yawar-laptop:~/code$
>
> But obviously I don't have write access to /home and /:
>
> yawar at yawar-laptop:~/code$ ls -ldh / /home drwxr-xr-x 21 root
> root 4.0K 2008-04-13 23:08 / drwxr-xr-x 3 root root 4.0K
> 2008-04-14 03:01 /home yawar at yawar-laptop:~/code$
>
> Could someone be kind enough to run this on their own machine
> and/or explain what I'm doing wrong?
More information about the Mono-list
mailing list