Improper Authorization in modoboa/modoboa
Description
Improper Authorization in GitHub repository modoboa/modoboa prior to 2.1.0.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Improper authorization in Modoboa prior to 2.1.0 allows unauthorized access to sensitive component information via missing permission checks on API endpoints.
Vulnerability
Description CVE-2023-2227 is an improper authorization vulnerability in the Modoboa mail hosting platform prior to version 2.1.0. The issue stems from missing permission checks on certain API endpoints, specifically the ComponentsInformationAPIView that provides information about installed components. The endpoint lacked the required IsSuperUser permission, allowing any user to access it.
Exploitation
An attacker can exploit this vulnerability by making a request to the vulnerable API endpoint. No special privileges are required; any authenticated user, or potentially even unauthenticated users if no authentication is enforced, can retrieve a list of installed extensions and their versions. The fix, as seen in commit [4], adds both IsAuthenticated and IsSuperUser permission classes to restrict access.
Impact
Successful exploitation allows an attacker to enumerate the enabled extensions on a Modoboa instance. This information can be used to identify vulnerable or misconfigured components, aiding in further attacks against the system.
Mitigation
The vulnerability is patched in Modoboa version 2.1.0 [1][2]. Users are strongly advised to upgrade to this version or later. No workarounds are documented; updating is the recommended action.
AI Insight generated on May 20, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
modoboaPyPI | < 2.1.0 | 2.1.0 |
Affected products
2- modoboa/modoboa/modoboav5Range: unspecified
Patches
17bcd3f6eb264Added missing permissions on API endpoints
4 files changed · +19 −4
modoboa/admin/api/v1/viewsets.py+0 −1 modified@@ -93,7 +93,6 @@ def get_throttles(self): throttles = super().get_throttles() if self.action == "reset_password": throttles.append(PasswordResetRequestThrottle()) - return throttles def get_serializer_class(self):
modoboa/core/api/v2/views.py+7 −2 modified@@ -9,15 +9,19 @@ from django.contrib.auth import login from drf_spectacular.utils import extend_schema -from rest_framework import response, status +from rest_framework import permissions, response, status from rest_framework.exceptions import AuthenticationFailed from rest_framework_simplejwt import views as jwt_views from rest_framework_simplejwt.exceptions import InvalidToken from rest_framework.views import APIView from modoboa.core.password_hashers import get_password_hasher from modoboa.core.utils import check_for_updates -from modoboa.lib.throttle import UserLesserDdosUser, LoginThrottle, PasswordResetApplyThrottle, PasswordResetRequestThrottle, PasswordResetTotpThrottle +from modoboa.lib.permissions import IsSuperUser +from modoboa.lib.throttle import ( + UserLesserDdosUser, LoginThrottle, PasswordResetApplyThrottle, + PasswordResetRequestThrottle, PasswordResetTotpThrottle +) from modoboa.parameters import tools as param_tools from smtplib import SMTPException @@ -192,6 +196,7 @@ def post(self, request, *args, **kwargs): class ComponentsInformationAPIView(APIView): """Retrieve information about installed components.""" + permission_classes = [permissions.IsAuthenticated, IsSuperUser] throttle_classes = [UserLesserDdosUser] @extend_schema(responses=serializers.ModoboaComponentSerializer(many=True))
modoboa/lib/permissions.py+9 −0 modified@@ -3,6 +3,8 @@ from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType +from rest_framework import permissions + from modoboa.core import constants as core_constants, signals as core_signals from modoboa.core.models import ObjectAccess, User @@ -150,3 +152,10 @@ def add_permissions_to_group(group, permissions): group.permissions.add( Permission.objects.get(content_type=ct, codename=permname) ) + + +class IsSuperUser(permissions.BasePermission): + """Permission class to allow only super users.""" + + def has_permission(self, request, view): + return request.user.is_superuser
modoboa/parameters/api/v2/viewsets.py+3 −1 modified@@ -1,9 +1,10 @@ """Parameters viewsets.""" from drf_spectacular.utils import extend_schema, OpenApiParameter -from rest_framework import response, viewsets +from rest_framework import permissions, response, viewsets from rest_framework.decorators import action +from modoboa.lib.permissions import IsSuperUser from modoboa.lib.throttle import GetThrottleViewsetMixin from . import serializers @@ -14,6 +15,7 @@ class ParametersViewSet(GetThrottleViewsetMixin, viewsets.ViewSet): """Parameter viewset.""" lookup_value_regex = r"\w+" + permission_classes = [permissions.IsAuthenticated, IsSuperUser] serializer_class = None @extend_schema(responses=serializers.ApplicationSerializer(many=True))
Vulnerability mechanics
Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
5- github.com/advisories/GHSA-67mg-gm8m-ph5rghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2023-2227ghsaADVISORY
- github.com/modoboa/modoboa/commit/7bcd3f6eb264d4e3e01071c97c2bac51cdd6fe97ghsaWEB
- github.com/pypa/advisory-database/tree/main/vulns/modoboa/PYSEC-2023-35.yamlghsaWEB
- huntr.dev/bounties/351f9055-2008-4af0-b820-01ff66678bf3ghsaWEB
News mentions
0No linked articles in our index yet.