Miggo Logo

CVE-2025-49143: Nautobot may allows uploaded media files to be accessible without authentication

6.3

CVSS Score
4.0

Basic Information

EPSS Score
0.39565%
Published
6/10/2025
Updated
6/10/2025
KEV Status
No
Technology
TechnologyPython

Technical Details

CVSS Vector
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Package NameEcosystemVulnerable VersionsFirst Patched Version
nautobotpip< 1.6.321.6.32
nautobotpip>= 2.0.0, < 2.4.102.4.10

Vulnerability Intelligence
Miggo AIMiggo AI

Miggo AIRoot Cause Analysis

The vulnerability allowed unauthenticated access to media files because the Django built-in serve function (django.views.static.serve) was directly exposed in the URL configuration (nautobot/core/urls.py) for the /media/ path. This function, by default, does not enforce application-level authentication. The patches (9c892dc300429948a4714f743c9c2879d8987340 for Nautobot 2.x and d99a53b065129cff3a0fa9abe7355a9ef1ad4c95 for Nautobot 1.6) address this by replacing the direct use of serve with a custom MediaView class. This new view, defined in nautobot/core/views/__init__.py, explicitly checks if a user is authenticated (request.user.is_authenticated) before serving most media files (with an exception for public branding files). Therefore, the django.views.static.serve function, as it was configured in nautobot/core/urls.py before the patch, is the vulnerable component that would be hit during exploitation when an unauthenticated user requests a protected media file. A runtime profiler would show django.views.static.serve being executed for these unauthenticated requests to the media endpoint prior to the patch being applied.

Vulnerable functions

Only Mi**o us*rs **n s** t*is s**tion

WAF Protection Rules

WAF Rule

### Imp**t *il*s uplo**** *y us*rs to N*uto*ot's `M**I*_ROOT` *ir**tory, in*lu*in* **vi**Typ* im*** *tt***m*nts *s w*ll *s im***s *tt***** to * Lo**tion, **vi**, or R**k, *r* s*rv** to us*rs vi* * URL *n*point t**t w*s not *n*or*in* us*r *ut**nti**t

Reasoning

T** vuln*r**ility *llow** un*ut**nti**t** ****ss to m**i* *il*s ****us* t** *j*n*o *uilt-in `s*rv*` *un*tion (`*j*n*o.vi*ws.st*ti*.s*rv*`) w*s *ir**tly *xpos** in t** URL *on*i*ur*tion (`n*uto*ot/*or*/urls.py`) *or t** `/m**i*/` p*t*. T*is *un*tion,