Broken Authentication

Broken Authentication Guide for Echo (Go) [GHSA-c29w-qq4m-2gcv]

[Updated April 2026] Updated GHSA-c29w-qq4m-2gcv

Overview

Broken authentication can allow attackers to gain unauthorized access by stealing or guessing credentials, session IDs, or tokens, enabling data theft, account takeovers, and privilege escalation. In production, even brief access can lead to exfiltration, lateral movement, and unauthorized changes. In Echo-based apps, common manifestations include setting cookies without HttpOnly or Secure flags, using unsigned tokens, or failing to validate and rotate tokens on login. This vulnerability manifests in Echo when authentication state is stored client-side or tokens are not verified, trusted, or revoked on logout, allowing reuse of stale credentials. No CVEs were provided for this guide; this is a generic pattern of broken authentication and should be remediated with signed sessions, proper token validation, and secure cookie handling in Echo.

Code Fix Example

Echo API Security Remediation
package main

import (
  "net/http"
  "github.com/labstack/echo/v4"
  "github.com/labstack/echo-contrib/sessions"
  "github.com/gorilla/sessions"
)

func main() {
  e := echo.New()

  // Vulnerable login path
  e.POST("/login-vuln", loginVulnerable)

  // Secure login path using signed cookies
  store := sessions.NewCookieStore([]byte("very-secret-32-byte-key-1234567890"))
  store.Options = &sessions.Options{
    Path:     "/",
    HttpOnly: true,
    Secure:   true,
    SameSite: http.SameSiteStrictMode,
  }
  e.Use(sessions.Sessions("session", store))

  e.POST("/login-secure", loginSecure)
  e.GET("/protected", protected)
  e.Start(":8080")
}

func loginVulnerable(c echo.Context) error {
  username := c.FormValue("username")
  password := c.FormValue("password")
  if username == "admin" && password == "password" {
    http.SetCookie(c.Response(), &http.Cookie{
      Name:     "session",
      Value:    "admin",
      Path:     "/",
      HttpOnly: false, // insecure: cookie accessible to client-side scripts
      Secure:   false, // insecure: sent over HTTP in non-prod environments
    })
    return c.String(http.StatusOK, "vulnerable login success")
  }
  return c.String(http.StatusUnauthorized, "unauthorized")
}

func loginSecure(c echo.Context) error {
  sess := sessions.Default(c)
  username := c.FormValue("username")
  password := c.FormValue("password")
  if username == "admin" && password == "password" {
    sess.Set("user", "admin")
    sess.Save(c.Request(), c.Response())
    return c.String(http.StatusOK, "secure login with signed session")
  }
  return c.String(http.StatusUnauthorized, "unauthorized")
}

func protected(c echo.Context) error {
  sess := sessions.Default(c)
  user := sess.Get("user")
  if user == nil {
    return c.String(http.StatusUnauthorized, "no session")
  }
  return c.String(http.StatusOK, "Hello "+user.(string))
}

CVE References

Choose which optional cookies to allow. You can change this any time.