CVE-2022-46169
Injection de commande non authentifiée
- Publié
- 5 déc. 2022
- Mise à jour
- 21 oct. 2025
- Attribution de CNA
- GitHub_M
- Preuve observée
- 16 févr. 2023
CVSS primaire
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HÉlevé · 30 prochains jours
- Percentile
- 100,0 %
- Date du modèle
- 21 sept. 2026
EPSS est une estimation statistique, et non une certitude ou une mesure d'impact. Combinez-le avec CVSS, le statut KEV, l'exposition et votre environnement.
CISA Connu Exploité
Ce CVE apparaît dans le catalogue des vulnérabilités exploitées connues de CISA.
Résumé
Cacti est une plateforme open source qui fournit aux utilisateurs un cadre robuste et extensible de surveillance opérationnelle et de gestion des pannes. Dans les versions concernées, une vulnérabilité d'injection de commandes permet à un utilisateur non authentifié d'exécuter du code arbitraire sur un serveur exécutant Cacti, si une source de données spécifique a été sélectionnée pour un quelconque périphérique surveillé. La vulnérabilité réside dans le fichier `remote_agent.php`. Ce fichier peut être accédé sans authentification. Cette fonction récupère l'adresse IP du client via `get_client_addr` et résout cette adresse IP en nom d'hôte correspondant via `gethostbyaddr`. Ensuite, il est vérifié qu'une entrée dans la table `poller` existe, dont le nom d'hôte correspond au nom d'hôte résolu. Si une telle entrée est trouvée, la fonction retourne `true` et le client est autorisé. Cette autorisation peut être contournée en raison de l'implémentation de la fonction `get_client_addr`. Cette fonction est définie dans le fichier `lib/functions.php` et vérifie plusieurs variables `$_SERVER` pour déterminer l'adresse IP du client. Les variables commençant par `HTTP_` peuvent être définies arbitrairement par un attaquant. Comme il existe une entrée par défaut dans la table `poller` avec le nom d'hôte du serveur exécutant Cacti, un attaquant peut contourner l'authentification, par exemple en fournissant l'en-tête `Forwarded-For: <TARGETIP>`. De cette manière, la fonction `get_client_addr` retourne l'adresse IP du serveur exécutant Cacti. L'appel suivant à `gethostbyaddr` résoudra cette adresse IP en nom d'hôte du serveur, qui passera la vérification du nom d'hôte `poller` grâce à l'entrée par défaut. Une fois l'autorisation du fichier `remote_agent.php` contournée, un attaquant peut déclencher différentes actions. L'une de ces actions est appelée `polldata`. La fonction appelée `poll_for_data` récupère quelques paramètres de requête et charge les entrées `poller_item` correspondantes depuis la base de données. Si l'`action` d'un `poller_item` est égale à `POLLER_ACTION_SCRIPT_PHP`, la fonction `proc_open` est utilisée pour exécuter un script PHP. Le paramètre `$poller_id` contrôlé par l'attaquant est récupéré via la fonction `get_nfilter_request_var`, qui autorise les chaînes arbitraires. Cette variable est ensuite insérée dans la chaîne passée à `proc_open`, ce qui conduit à une vulnérabilité d'injection de commandes. Par exemple, en fournissant `poller_id=;id`, la commande `id` est exécutée. Pour atteindre l'appel vulnérable, l'attaquant doit fournir un `host_id` et un `local_data_id`, où l'`action` du `poller_item` correspondant est définie sur `POLLER_ACTION_SCRIPT_PHP`. Ces deux identifiants (`host_id` et `local_data_id`) peuvent facilement être bruteforcés. La seule exigence est qu'un `poller_item` avec une action `POLLER_ACTION_SCRIPT_PHP` existe. C'est très probable sur une instance en production car cette action est ajoutée par certains modèles prédéfinis comme `Device - Uptime` ou `Device - Polling Time`. Cette vulnérabilité d'injection de commandes permet à un utilisateur non authentifié d'exécuter des commandes arbitraires si un `poller_item` avec le type d'`action` `POLLER_ACTION_SCRIPT_PHP` (`2`) est configuré. Le contournement de l'autorisation devrait être empêché en ne permettant pas à un attaquant de faire retourner une adresse IP arbitraire à `get_client_addr` (fichier `lib/functions.php`). Cela pourrait être fait en ne tenant pas compte des variables `$_SERVER` de type `HTTP_...`. Si celles-ci doivent être conservées pour des raisons de compatibilité, il faudrait au moins empêcher de falsifier l'adresse IP du serveur exécutant Cacti. Cette vulnérabilité a été corrigée dans les branches de version 1.2.x et 1.3.x, `1.2.23` étant la première version contenant le correctif.
Utilisation responsable
Utilisez les informations de vulnérabilité uniquement sur les systèmes que vous possédez ou que vous êtes autorisé à tester. Kitploit renvoie aux métadonnées de la recherche publique et ne stocke pas de code d'exploitation ni de charges utiles malveillantes.