VYPR
High severity8.8NVD Advisory· Published Apr 21, 2026· Updated Apr 23, 2026

CVE-2026-39386

CVE-2026-39386

Description

Neko is a a self-hosted virtual browser that runs in Docker and uses WebRTC In versions 3.0.0 through 3.0.10 and 3.1.0 through 3.1.1, any authenticated user can immediately obtain full administrative control of the entire Neko instance (member management, room settings, broadcast control, session termination, etc.). This results in a complete compromise of the instance. The vulnerability has been patched in v3.0.11 and v3.1.2. If upgrading is not immediately possible, the following mitigations can reduce risk: Restrict access to trusted users only (avoid granting accounts to untrusted parties); ensure all user passwords are strong and only shared with trusted individuals; run the instance only when needed; avoid leaving it continuously exposed; place the instance behind authentication layers such as a reverse proxy with additional access controls; disable or restrict access to the /api/profile endpoint if feasible; and/or monitor for suspicious privilege changes or unexpected administrative actions. Note that these are temporary mitigations and do not fully eliminate the vulnerability. Upgrading is strongly recommended.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
github.com/m1k1o/neko/serverGo
>= 3.0.0, < 3.0.113.0.11
github.com/m1k1o/neko/serverGo
>= 0.0.0-20250322225643-212bf8a60756, < 0.0.0-20260406184107-c54bcf1ee2110.0.0-20260406184107-c54bcf1ee211

Patches

2
6b561feb9016

fix(api): update profile handling to ensure only the name field is modified.

https://github.com/m1k1o/nekoMiroslav ŠedivýApr 6, 2026via ghsa
1 file changed · +14 4
  • server/internal/api/session.go+14 4 modified
    @@ -84,15 +84,25 @@ func (api *ApiManagerCtx) Whoami(w http.ResponseWriter, r *http.Request) error {
     	})
     }
     
    +// TODO: Remove when legacy mode is removed as all sessions must be synced with their providers.
     func (api *ApiManagerCtx) UpdateProfile(w http.ResponseWriter, r *http.Request) error {
     	session, _ := auth.GetSession(r)
     
    -	data := session.Profile()
    -	if err := utils.HttpJsonRequest(w, r, &data); err != nil {
    -		return err
    +	profile := session.Profile()
    +	if !profile.IsAdmin {
    +		// Name is the only updatable field in the profile for non-admins
    +		var payload types.MemberProfile
    +		if err := utils.HttpJsonRequest(w, r, &payload); err != nil {
    +			return err
    +		}
    +		profile.Name = payload.Name
    +	} else {
    +		if err := utils.HttpJsonRequest(w, r, &profile); err != nil {
    +			return err
    +		}
     	}
     
    -	err := api.sessions.Update(session.ID(), data)
    +	err := api.sessions.Update(session.ID(), profile)
     	if err != nil {
     		if errors.Is(err, types.ErrSessionNotFound) {
     			return utils.HttpBadRequest("session does not exist")
    
c54bcf1ee211

fix(api): update profile handling to ensure only the name field is modified.

https://github.com/m1k1o/nekoMiroslav ŠedivýApr 6, 2026via ghsa
1 file changed · +14 4
  • server/internal/api/session.go+14 4 modified
    @@ -84,15 +84,25 @@ func (api *ApiManagerCtx) Whoami(w http.ResponseWriter, r *http.Request) error {
     	})
     }
     
    +// TODO: Remove when legacy mode is removed as all sessions must be synced with their providers.
     func (api *ApiManagerCtx) UpdateProfile(w http.ResponseWriter, r *http.Request) error {
     	session, _ := auth.GetSession(r)
     
    -	data := session.Profile()
    -	if err := utils.HttpJsonRequest(w, r, &data); err != nil {
    -		return err
    +	profile := session.Profile()
    +	if !profile.IsAdmin {
    +		// Name is the only updatable field in the profile for non-admins
    +		var payload types.MemberProfile
    +		if err := utils.HttpJsonRequest(w, r, &payload); err != nil {
    +			return err
    +		}
    +		profile.Name = payload.Name
    +	} else {
    +		if err := utils.HttpJsonRequest(w, r, &profile); err != nil {
    +			return err
    +		}
     	}
     
    -	err := api.sessions.Update(session.ID(), data)
    +	err := api.sessions.Update(session.ID(), profile)
     	if err != nil {
     		if errors.Is(err, types.ErrSessionNotFound) {
     			return utils.HttpBadRequest("session does not exist")
    

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

7

News mentions

0

No linked articles in our index yet.