VYPR
High severityNVD Advisory· Published Sep 19, 2025· Updated Feb 26, 2026

Admin RCE via prepackaged plugins by way of misconfigured imports directory

CVE-2025-9079

Description

Mattermost versions 10.8.x <= 10.8.3, 10.5.x <= 10.5.8, 9.11.x <= 9.11.17, 10.10.x <= 10.10.1, 10.9.x <= 10.9.3 fail to validate import directory path configuration which allows admin users to execute arbitrary code via malicious plugin upload to prepackaged plugins directory

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
github.com/mattermost/mattermost-serverGo
>= 10.8.0, < 10.8.410.8.4
github.com/mattermost/mattermost-serverGo
>= 10.5.0, < 10.5.910.5.9
github.com/mattermost/mattermost-serverGo
>= 9.11.0, < 9.11.189.11.18
github.com/mattermost/mattermost-serverGo
>= 10.10.0, < 10.10.210.10.2
github.com/mattermost/mattermost-serverGo
>= 10.9.0, < 10.9.410.9.4
github.com/mattermost/mattermost/server/v8Go
< 8.0.0-20250707221302-a8fa77f107ef8.0.0-20250707221302-a8fa77f107ef

Affected products

1

Patches

6
4ff68eea0a3f

MM-64779: Upload type validation. (#33351) (#33358)

https://github.com/mattermost/mattermostMattermost BuildJul 8, 2025via ghsa
2 files changed · +10 0
  • server/i18n/en.json+4 0 modified
    @@ -3850,6 +3850,10 @@
         "id": "api.upload.get_upload.forbidden.app_error",
         "translation": "Failed to get upload."
       },
    +  {
    +    "id": "api.upload.invalid_type_for_shared_channel.app_error",
    +    "translation": "Failed to upload file. Upload channel is not shared with remote."
    +  },
       {
         "id": "api.upload.upload_data.invalid_content_length",
         "translation": "Invalid Content-Length."
    
  • server/platform/services/sharedchannel/attachment.go+6 0 modified
    @@ -191,6 +191,12 @@ func (scs *Service) onReceiveUploadCreate(msg model.RemoteClusterMsg, rc *model.
     			map[string]any{"channelId": us.ChannelId}, "", http.StatusRequestEntityTooLarge)
     	}
     
    +	// validate upload type for shared channels - only allow attachments
    +	if us.Type != model.UploadTypeAttachment {
    +		return model.NewAppError("onReceiveUploadCreate", "api.upload.invalid_type_for_shared_channel.app_error",
    +			nil, "", http.StatusBadRequest)
    +	}
    +
     	us.RemoteId = rc.RemoteId // don't let remotes try to impersonate each other
     
     	// create upload session.
    
047a2c640717

MM-64779: Upload type validation. (#33351) (#33356)

https://github.com/mattermost/mattermostMattermost BuildJul 8, 2025via ghsa
2 files changed · +10 0
  • server/i18n/en.json+4 0 modified
    @@ -3858,6 +3858,10 @@
         "id": "api.upload.get_upload.forbidden.app_error",
         "translation": "Failed to get upload."
       },
    +  {
    +    "id": "api.upload.invalid_type_for_shared_channel.app_error",
    +    "translation": "Failed to upload file. Upload channel is not shared with remote."
    +  },
       {
         "id": "api.upload.upload_data.invalid_content_length",
         "translation": "Invalid Content-Length."
    
  • server/platform/services/sharedchannel/attachment.go+6 0 modified
    @@ -191,6 +191,12 @@ func (scs *Service) onReceiveUploadCreate(msg model.RemoteClusterMsg, rc *model.
     			map[string]any{"channelId": us.ChannelId}, "", http.StatusRequestEntityTooLarge)
     	}
     
    +	// validate upload type for shared channels - only allow attachments
    +	if us.Type != model.UploadTypeAttachment {
    +		return model.NewAppError("onReceiveUploadCreate", "api.upload.invalid_type_for_shared_channel.app_error",
    +			nil, "", http.StatusBadRequest)
    +	}
    +
     	us.RemoteId = rc.RemoteId // don't let remotes try to impersonate each other
     
     	// create upload session.
    
b38e2eccda18

MM-64779: Upload type validation. (#33351) (#33355)

https://github.com/mattermost/mattermostMattermost BuildJul 8, 2025via ghsa
2 files changed · +10 0
  • server/i18n/en.json+4 0 modified
    @@ -3894,6 +3894,10 @@
         "id": "api.upload.get_upload.forbidden.app_error",
         "translation": "Failed to get upload."
       },
    +  {
    +    "id": "api.upload.invalid_type_for_shared_channel.app_error",
    +    "translation": "Failed to upload file. Upload channel is not shared with remote."
    +  },
       {
         "id": "api.upload.upload_data.invalid_content_length",
         "translation": "Invalid Content-Length."
    
  • server/platform/services/sharedchannel/attachment.go+6 0 modified
    @@ -191,6 +191,12 @@ func (scs *Service) onReceiveUploadCreate(msg model.RemoteClusterMsg, rc *model.
     			map[string]any{"channelId": us.ChannelId}, "", http.StatusRequestEntityTooLarge)
     	}
     
    +	// validate upload type for shared channels - only allow attachments
    +	if us.Type != model.UploadTypeAttachment {
    +		return model.NewAppError("onReceiveUploadCreate", "api.upload.invalid_type_for_shared_channel.app_error",
    +			nil, "", http.StatusBadRequest)
    +	}
    +
     	us.RemoteId = rc.RemoteId // don't let remotes try to impersonate each other
     
     	// create upload session.
    
96665b9b98a1

MM-64779: Upload type validation. (#33351) (#33354)

https://github.com/mattermost/mattermostMattermost BuildJul 8, 2025via ghsa
2 files changed · +10 0
  • server/i18n/en.json+4 0 modified
    @@ -3910,6 +3910,10 @@
         "id": "api.upload.get_upload.forbidden.app_error",
         "translation": "Failed to get upload."
       },
    +  {
    +    "id": "api.upload.invalid_type_for_shared_channel.app_error",
    +    "translation": "Failed to upload file. Upload channel is not shared with remote."
    +  },
       {
         "id": "api.upload.upload_data.invalid_content_length",
         "translation": "Invalid Content-Length."
    
  • server/platform/services/sharedchannel/attachment.go+6 0 modified
    @@ -191,6 +191,12 @@ func (scs *Service) onReceiveUploadCreate(msg model.RemoteClusterMsg, rc *model.
     			map[string]any{"channelId": us.ChannelId}, "", http.StatusRequestEntityTooLarge)
     	}
     
    +	// validate upload type for shared channels - only allow attachments
    +	if us.Type != model.UploadTypeAttachment {
    +		return model.NewAppError("onReceiveUploadCreate", "api.upload.invalid_type_for_shared_channel.app_error",
    +			nil, "", http.StatusBadRequest)
    +	}
    +
     	us.RemoteId = rc.RemoteId // don't let remotes try to impersonate each other
     
     	// create upload session.
    
439464883aa1

MM-64779: Upload type validation. (#33351) (#33359)

https://github.com/mattermost/mattermostMattermost BuildJul 8, 2025via ghsa
2 files changed · +10 0
  • server/i18n/en.json+4 0 modified
    @@ -3770,6 +3770,10 @@
         "id": "api.upload.get_upload.forbidden.app_error",
         "translation": "Failed to get upload."
       },
    +  {
    +    "id": "api.upload.invalid_type_for_shared_channel.app_error",
    +    "translation": "Failed to upload file. Upload channel is not shared with remote."
    +  },
       {
         "id": "api.upload.upload_data.invalid_content_length",
         "translation": "Invalid Content-Length."
    
  • server/platform/services/sharedchannel/attachment.go+6 0 modified
    @@ -187,6 +187,12 @@ func (scs *Service) onReceiveUploadCreate(msg model.RemoteClusterMsg, rc *model.
     			map[string]any{"channelId": us.ChannelId}, "", http.StatusRequestEntityTooLarge)
     	}
     
    +	// validate upload type for shared channels - only allow attachments
    +	if us.Type != model.UploadTypeAttachment {
    +		return model.NewAppError("onReceiveUploadCreate", "api.upload.invalid_type_for_shared_channel.app_error",
    +			nil, "", http.StatusBadRequest)
    +	}
    +
     	us.RemoteId = rc.RemoteId // don't let remotes try to impersonate each other
     
     	// create upload session.
    
a8fa77f107ef

MM-64779: Upload type validation. (#33351)

https://github.com/mattermost/mattermostcatalintomaiJul 7, 2025via ghsa
2 files changed · +10 0
  • server/i18n/en.json+4 0 modified
    @@ -3914,6 +3914,10 @@
         "id": "api.upload.get_upload.forbidden.app_error",
         "translation": "Failed to get upload."
       },
    +  {
    +    "id": "api.upload.invalid_type_for_shared_channel.app_error",
    +    "translation": "Failed to upload file. Upload channel is not shared with remote."
    +  },
       {
         "id": "api.upload.upload_data.invalid_content_length",
         "translation": "Invalid Content-Length."
    
  • server/platform/services/sharedchannel/attachment.go+6 0 modified
    @@ -191,6 +191,12 @@ func (scs *Service) onReceiveUploadCreate(msg model.RemoteClusterMsg, rc *model.
     			map[string]any{"channelId": us.ChannelId}, "", http.StatusRequestEntityTooLarge)
     	}
     
    +	// validate upload type for shared channels - only allow attachments
    +	if us.Type != model.UploadTypeAttachment {
    +		return model.NewAppError("onReceiveUploadCreate", "api.upload.invalid_type_for_shared_channel.app_error",
    +			nil, "", http.StatusBadRequest)
    +	}
    +
     	us.RemoteId = rc.RemoteId // don't let remotes try to impersonate each other
     
     	// create upload session.
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

10

News mentions

0

No linked articles in our index yet.