Merge pull request #4454 from kumpera/allow_sioc_with_managed_impl
authorRodrigo Kumpera <kumpera@users.noreply.github.com>
Thu, 2 Mar 2017 19:45:00 +0000 (14:45 -0500)
committerGitHub <noreply@github.com>
Thu, 2 Mar 2017 19:45:00 +0000 (14:45 -0500)
Allow banned assemblies with LoaderFrom

mono/metadata/appdomain.c
mono/metadata/assembly-internals.h
mono/metadata/assembly.c
mono/metadata/image-internals.h
mono/metadata/image.c
mono/metadata/metadata-internals.h
tools/nuget-hash-extractor/nuget-hash-extractor.cs

index cfc917660e2034ac87d8e2c5f742248fabc86a6a..f92cc949b6ee5160c1931415f97aa874881eb5bf 100644 (file)
@@ -39,6 +39,7 @@
 #include <mono/metadata/domain-internals.h>
 #include "mono/metadata/metadata-internals.h"
 #include <mono/metadata/assembly.h>
+#include <mono/metadata/assembly-internals.h>
 #include <mono/metadata/exception.h>
 #include <mono/metadata/exception-internals.h>
 #include <mono/metadata/threads.h>
@@ -2053,7 +2054,7 @@ ves_icall_System_Reflection_Assembly_LoadFrom (MonoStringHandle fname, MonoBoole
        if (!is_ok (error))
                goto leave;
        
-       MonoAssembly *ass = mono_assembly_open_full (filename, &status, refOnly);
+       MonoAssembly *ass = mono_assembly_open_a_lot (filename, &status, refOnly, TRUE);
        
        if (!ass) {
                if (status == MONO_IMAGE_IMAGE_INVALID)
index 5af7bd6b9a3d02e569a70a7a42106b1135239562..c24e328f33083ff1c3beb8da8736aefe9be59bf7 100644 (file)
@@ -9,4 +9,6 @@
 
 MONO_API MonoImage*    mono_assembly_load_module_checked (MonoAssembly *assembly, uint32_t idx, MonoError *error);
 
+MonoAssembly * mono_assembly_open_a_lot (const char *filename, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context);
+
 #endif /* __MONO_METADATA_ASSEMBLY_INTERNALS_H__ */
index 1766d1d51763c8f8392d790d7c0fe40674fe0c00..922671d00f7bc06749245be995566609bec77f1b 100644 (file)
@@ -1671,6 +1671,13 @@ mono_assembly_open_from_bundle (const char *filename, MonoImageOpenStatus *statu
 MonoAssembly *
 mono_assembly_open_full (const char *filename, MonoImageOpenStatus *status, gboolean refonly)
 {
+       return mono_assembly_open_a_lot (filename, status, refonly, FALSE);
+}
+
+MonoAssembly *
+mono_assembly_open_a_lot (const char *filename, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context)
+{
+
        MonoImage *image;
        MonoAssembly *ass;
        MonoImageOpenStatus def_status;
@@ -1746,7 +1753,7 @@ mono_assembly_open_full (const char *filename, MonoImageOpenStatus *status, gboo
        }
 
        if (!image)
-               image = mono_image_open_full (fname, status, refonly);
+               image = mono_image_open_a_lot (fname, status, refonly, load_from_context);
 
        if (!image){
                if (*status == MONO_IMAGE_OK)
index 6281e3b241c35eb37cbb5d1ead242c7ab41ccb16..e6868daee9c2887f672d7e3d2f374ee8ae0a72cd 100644 (file)
@@ -16,4 +16,7 @@ mono_image_load_file_for_image_checked (MonoImage *image, int fileidx, MonoError
 MonoImage*
 mono_image_load_module_checked (MonoImage *image, int idx, MonoError *error);
 
+MonoImage *
+mono_image_open_a_lot (const char *fname, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context);
+
 #endif /* __MONO_METADATA_IMAGE_INTERNALS_H__ */
index f494a57f1471849533476a95b434211e00746ea7..0c507f5c1da1301a5ba886ac032240700bb0b143 100644 (file)
@@ -1253,9 +1253,13 @@ do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status,
                goto invalid_image;
 
        if (!image->ref_only && is_problematic_image (image)) {
-               mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Denying load of problematic image %s", image->name);
-               *status = MONO_IMAGE_IMAGE_INVALID;
-               goto invalid_image;
+               if (image->load_from_context) {
+                       mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Loading problematic image %s", image->name);
+               } else {
+                       mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Denying load of problematic image %s", image->name);
+                       *status = MONO_IMAGE_IMAGE_INVALID;
+                       goto invalid_image;
+               }
        }
 
        if (image->loader == &pe_loader && !image->metadata_only && !mono_verifier_verify_table_data (image, &errors))
@@ -1285,7 +1289,7 @@ invalid_image:
 
 static MonoImage *
 do_mono_image_open (const char *fname, MonoImageOpenStatus *status,
-                                       gboolean care_about_cli, gboolean care_about_pecoff, gboolean refonly, gboolean metadata_only)
+                                       gboolean care_about_cli, gboolean care_about_pecoff, gboolean refonly, gboolean metadata_only, gboolean load_from_context)
 {
        MonoCLIImageInfo *iinfo;
        MonoImage *image;
@@ -1329,6 +1333,7 @@ do_mono_image_open (const char *fname, MonoImageOpenStatus *status,
        image->name = mono_path_resolve_symlinks (fname);
        image->ref_only = refonly;
        image->metadata_only = metadata_only;
+       image->load_from_context = load_from_context;
        image->ref_count = 1;
        /* if MONO_SECURITY_MODE_CORE_CLR is set then determine if this image is platform code */
        image->core_clr_platform_code = mono_security_core_clr_determine_platform_image (image);
@@ -1525,6 +1530,12 @@ mono_image_open_from_module_handle (HMODULE module_handle, char* fname, gboolean
 
 MonoImage *
 mono_image_open_full (const char *fname, MonoImageOpenStatus *status, gboolean refonly)
+{
+       return mono_image_open_a_lot (fname, status, refonly, FALSE);
+}
+
+MonoImage *
+mono_image_open_a_lot (const char *fname, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context)
 {
        MonoImage *image;
        GHashTable *loaded_images = get_loaded_images_hash (refonly);
@@ -1624,7 +1635,7 @@ mono_image_open_full (const char *fname, MonoImageOpenStatus *status, gboolean r
        mono_images_unlock ();
 
        // Image not loaded, load it now
-       image = do_mono_image_open (fname, status, TRUE, TRUE, refonly, FALSE);
+       image = do_mono_image_open (fname, status, TRUE, TRUE, refonly, FALSE, load_from_context);
        if (image == NULL)
                return NULL;
 
@@ -1663,7 +1674,7 @@ mono_pe_file_open (const char *fname, MonoImageOpenStatus *status)
 {
        g_return_val_if_fail (fname != NULL, NULL);
        
-       return do_mono_image_open (fname, status, FALSE, TRUE, FALSE, FALSE);
+       return do_mono_image_open (fname, status, FALSE, TRUE, FALSE, FALSE, FALSE);
 }
 
 /**
@@ -1680,7 +1691,7 @@ mono_image_open_raw (const char *fname, MonoImageOpenStatus *status)
 {
        g_return_val_if_fail (fname != NULL, NULL);
        
-       return do_mono_image_open (fname, status, FALSE, FALSE, FALSE, FALSE);
+       return do_mono_image_open (fname, status, FALSE, FALSE, FALSE, FALSE, FALSE);
 }
 
 /*
@@ -1691,7 +1702,7 @@ mono_image_open_raw (const char *fname, MonoImageOpenStatus *status)
 MonoImage *
 mono_image_open_metadata_only (const char *fname, MonoImageOpenStatus *status)
 {
-       return do_mono_image_open (fname, status, TRUE, TRUE, FALSE, TRUE);
+       return do_mono_image_open (fname, status, TRUE, TRUE, FALSE, TRUE, FALSE);
 }
 
 void
index ae524c9f35164b83d38898cbae52b152d5900a3c..5ff20a90e6e6b80c3d23d41ea84a2aeeb51b3ad8 100644 (file)
@@ -212,6 +212,9 @@ struct _MonoImage {
        /* Whenever this image contains metadata only without PE data */
        guint8 metadata_only : 1;
 
+       /*  Whether this image belongs to load-from context */
+       guint8 load_from_context: 1;
+
        guint8 checked_module_cctor : 1;
        guint8 has_module_cctor : 1;
 
index 9a69cc80b971dcc891314fca9aac36d337f7f94a..013097f83c8e9c1a21c27d07e423300605f6f83c 100644 (file)
@@ -90,6 +90,7 @@ class DoParse : MarshalByRefObject {
                var str = FileToEnum (name);
 
                string ver_str = version + " " + FileToMoniker (fullname);      
+
                Console.WriteLine ($"IGNORED_ASSEMBLY (0x{hash_code}, {str}, \"{id}\", \"{ver_str}\"),");
        }
 }
\ No newline at end of file