Récemment vers le 19 avril 2016, iThemes Security a été patché contre une vulnérabilité découverte par notre équipe, un manque de vérification de capacité, laissant n’importe quel membre avec n’importe quel rôle réaliser une action d’un administrateur.
Quand un fichier est modifié sur votre installation, iThemes Security vous avertira dans votre back-office en utilisant les notices admin.
Dans cette notice vous trouverez un petit bouton pour pouvoir masquer cet avertissement. Normalement seuls les administrateurs peuvent masquer ce message.
Mais la vulnérabilité laisse n’importe qui pouvoir “faussement cliquer” sur ce bouton, cachant alors les modifications aux admins.
Lisez la suite si vous voulez en savoir plus sur où est la faille et comment l’exploiter.
Dans le fichier /core/modules/file-changes/class-itsec-file-change-admin.php
vous trouverez la fonction wp_ajax_itsec_file_
[pastacode lang=”php” message=”” highlight=”” provider=”manual” manual=”%09public%20function%20wp_ajax_itsec_file_change_warning_ajax()%20%7B%0A%0A%09%09if%20(%20!%20wp_verify_nonce(%20sanitize_text_field(%20%24_POST%5B’nonce’%5D%20)%2C%20’itsec_file_change_warning’%20)%20)%20%7B%0A%09%09%09die(%20__(%20’Security%20error!’%2C%20’better-wp-security’%20)%20)%3B%0A%09%09%7D%0A%0A%09%09die(%20delete_site_option(%20’itsec_file_change_warning’%20)%20)%3B%0A%0A%09%7D”/]
Comme vous pouvez le voir, le jeton de sécurité (nonce) est bien vérifié, mais pas le rôle. Oui, habituellement le jeton seul peut suffire à bloquer les tentatives de requêtes ajax. Mais pas si le jeton est connu de tout le monde.
Même fichier, nous pouvons lire ceci :
[pastacode lang=”php” message=”” highlight=”” provider=”manual” manual=”add_action(%20’admin_enqueue_scripts’%2C%20array(%20%24this%2C%20’admin_enqueue_scripts’%20)%20)%3B%20%2F%2Fenqueue%20scripts%20for%20admin%20page”/]
Une partie de la fonction admin_enqueue_scripts()
fait ceci :
[pastacode lang=”php” message=”” highlight=”” provider=”manual” manual=”%09%09wp_register_script(%20’itsec_file_change_warning_js’%2C%20%24this-%3Emodule_path%20.%20’js%2Fadmin-file-change-warning.js’%2C%20array(%20’jquery’%20)%2C%20%24itsec_globals%5B’plugin_build’%5D%20)%3B%0A%09%09wp_enqueue_script(%20’itsec_file_change_warning_js’%20)%3B%0A%09%09wp_localize_script(%0A%09%09%09’itsec_file_change_warning_js’%2C%0A%09%09%09’itsec_file_change_warning’%2C%0A%09%09%09array(%0A%09%09%09%09’nonce’%20%3D%3E%20wp_create_nonce(%20’itsec_file_change_warning’%20)%2C%0A%09%09%09%09’url’%20%20%20%3D%3E%20admin_url()%20.%20’admin.php%3Fpage%3Dtoplevel_page_itsec_logs%26itsec_log_filter%3Dfile_change’%2C%0A%09%09%09)%0A%09%09)%3B”/]
Donc, le jeton est écrit dans le code source du back-office, pour tout le monde, sans restriction.
Un simple abonné peut lire le jeton, faire un appel ajax sur le fichier de WP avec l’action itsec_file_
et le message d’avertissement de l’administration sera effacée jusqu’à la prochaine modification de fichier.
La solution brought par l’équipe de dev de iThemes Security a été de ne plus imprimer le jeton pour tout le monde ET de vérifier le rôle.
Vous devez toujours vérifier les deux, le jeton et le rôle quand vous faites ce genre de vérification. Aussi, n’imprimez jamais dans une page un jeton si la personne n’en a pas besoin. Enfin, utilisez toujours un nom de jeton différent et correct pour éviter la réplication des actions.