Problem/Motivation
Unlike default entry point install process has no error handler so PHP errors come out. In some cases this leads to interesting security implications. For example this URL core/install.php?profile=foo causes the following PHP warning.
User warning: The following module is missing from the file system: foo in drupal_get_filename()
The URL can be used to built a list of contributed modules existing on a given Drupal 8 site.
You can see it in action on drupal.com.
http://drupal.com/core/install.php?profile=foo // Emits PHP warning because foo is missing.
http://drupal.com/core/install.php?profile=node // Emits no PHP warnings because node is found.
Note that this is not the only way to check modules on Drupal site. For instance www.drupalxray.com I take it checks HTTP response code for known module files to find out if a module is used on a site. However their approach is not so reliable as this one because it needs somehow to determine the directory of contributed modules (say modules, modules/contrib, profiles/PROFILE_NAME/modules, etc).
The issue initially was reported on security.drupal.org and posted here after security team approval.
Steps to reproduce
Unauthenticated user tries to install Drupal and specifies invalid `profile`:
https://victim.site/core/install.php?profile=%3Cinvalid%20value%3E
Application responds with an error:
User warning: The following module is missing from the file system: invalidvalue in drupal_get_filename() (line 240 of core/includes/bootstrap.inc).
drupal_get_filename('module', 'invalidvalue') (Line: 263)
drupal_get_path('profile', 'invalidvalue') (Line: 244)
Drupal\Core\Extension\ExtensionDiscovery->setProfileDirectoriesFromSettings() (Line: 157)
Drupal\Core\Extension\ExtensionDiscovery->scan('module') (Line: 148)
drupal_required_modules() (Line: 1087)
install_profile_info('minimal') (Line: 1236)
_install_select_profile(Array) (Line: 440)
install_begin_request(Object, Array) (Line: 114)
install_drupal(Object) (Line: 44)
...
After some time, the application stops working for authenticated users (Denial of Service). Functionality is "fixed" when the following URL is accessed:
http://victim.site/core/install.php?profile=standard
From #2878767: "The following module is missing from the file system" when specifying an invalid install profile as a query parameter
Comments
Comment #2
chi commentedComment #3
chi commentedHere is a simple CLI tool proving the concept.
Comment #4
chi commentedComment #15
quietone commentedClosed #2878767: "The following module is missing from the file system" when specifying an invalid install profile as a query parameter as a duplicate, adding credit. Changing to Major based on the comment by cilefen in the duplicate.
Comment #16
quietone commentedComment #19
andypost