MDL-70130 core: Compare realpaths for file attachment checks
authorAndrew Nicols <andrew@nicols.co.uk>
Fri, 6 Nov 2020 02:46:02 +0000 (10:46 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Fri, 6 Nov 2020 03:00:30 +0000 (11:00 +0800)
Rather than using the provided path, the `realpath` must be used to
ensure that the use of symlinks in paths is normalised.

lib/moodlelib.php

index 107b4ef..e31c9a1 100644 (file)
@@ -6312,7 +6312,8 @@ function email_to_user($user, $from, $subject, $messagetext, $messagehtml = '',
             $mimetype = mimeinfo('type', $attachname);
 
             // Before doing the comparison, make sure that the paths are correct (Windows uses slashes in the other direction).
             $mimetype = mimeinfo('type', $attachname);
 
             // Before doing the comparison, make sure that the paths are correct (Windows uses slashes in the other direction).
-            $attachpath = str_replace('\\', '/', $attachment);
+            // The absolute (real) path is also fetched to ensure that comparisons to allowed paths are compared equally.
+            $attachpath = str_replace('\\', '/', realpath($attachment));
 
             // Add allowed paths to an array (also check if it's not empty).
             $allowedpaths = array_filter([
 
             // Add allowed paths to an array (also check if it's not empty).
             $allowedpaths = array_filter([