Vitaliy Margolen wrote:
After
checking object's SD against token we fail some tests.
What it seems to me is that some one tried to "optimize" this part in
windows and instead created a security problem.

If you already have a valid handle to the object, then it isn't really a security problem to have another one with the same access rights.

@@ -450,25 +453,34 @@ obj_handle_t duplicate_handle( struct pr
                                unsigned int access, unsigned int attr, 
unsigned int options )
 {
     obj_handle_t res;
+    struct handle_entry *entry;
+    unsigned int src_access, dst_access;
     struct object *obj = get_handle_obj( src, src_handle, 0, NULL );
if (!obj) return 0;
-    if (options & DUP_HANDLE_SAME_ACCESS)
+    if ((entry = get_handle( src, src_handle )))
+        src_access = entry->access;
+    else  /* pseudo-handle, give it full access */
     {
-        struct handle_entry *entry = get_handle( src, src_handle );
-        if (entry)
-            access = entry->access;
-        else  /* pseudo-handle, give it full access */
-        {
-            access = obj->ops->map_access( obj, GENERIC_ALL );
-            clear_error();
-        }
+        src_access = obj->ops->map_access( obj, GENERIC_ALL );
+        clear_error();
     }
-    access &= ~RESERVED_ALL;
+    src_access &= ~RESERVED_ALL;
+
+    if (options & DUP_HANDLE_SAME_ACCESS)
+        dst_access = src_access;
+    else
+        dst_access = obj->ops->map_access( obj, access ) & ~RESERVED_ALL;
+
+    /* asking for more or the same/less access rights */
+    access = ~src_access & dst_access ? dst_access : 0;
+
     if (options & DUP_HANDLE_MAKE_GLOBAL)
         res = alloc_global_handle( obj, access );
     else
         res = alloc_handle( dst, obj, access, attr );
+    if (res) get_handle( dst, res )->access = dst_access;
+

It would seem better to add an extra parameter to alloc_handle and alloc_global_handle to tell them to not check access rather than adding this hack. It should use less processor time and it should make patch 2 not necessary.


--
Rob Shearman



Reply via email to