Injection

Injection in Go (Gin) Guide [May 2026] [CVE-2026-22599]

[Updated May 2026] Updated CVE-2026-22599

Overview

CVE-2026-22599 exposed a database query injection in Strapi's Content-Type Builder, where an authenticated administrator could pass a value for column.defaultTo that was treated as raw SQL. By sending a tuple like [value, { isRaw: true }], the migration code would feed un-sanitized strings into Knex.db.connection.raw(), enabling arbitrary statements at the database layer. Depending on the engine, this could read files, crash the server, or even execute remote commands. The patch in versions 4.26.1 and 5.33.2 restricted all Content-Type Builder write APIs to development mode, and production deployments returned 404 to remove the surface. In Go (Gin) contexts, this vulnerability manifests when untrusted input is directly stitched into SQL or commands, allowing attackers to alter queries, exfiltrate data, trigger DoS, or execute unintended operations if the app exposes raw SQL or shell interactions. This guide maps those risks to Go (Gin) patterns and provides concrete remediation steps.

Affected Versions

Strapi 4.x prior to 4.26.1; Strapi 5.x prior to 5.33.2

Code Fix Example

Go (Gin) API Security Remediation
package main

import (
  "database/sql"
  "fmt"
  "log"
  "net/http"

  "github.com/gin-gonic/gin"
  _ "github.com/lib/pq"
)

var db *sql.DB

func main() {
  var err error
  db, err = sql.Open("postgres", "host=localhost port=5432 user=testuser password=secret dbname=testdb sslmode=disable")
  if err != nil {
    log.Fatalf("db connect: %v", err)
  }
  defer db.Close()

  r := gin.Default()
  r.GET("/users/:id", vulnerableHandler)
  r.GET("/fixed/users/:id", fixedHandler)
  r.Run(":8080")
}

func vulnerableHandler(c *gin.Context) {
  id := c.Param("id")
  // Vulnerable: user input interpolated into SQL
  query := fmt.Sprintf("SELECT id, name FROM users WHERE id = %s", id)

  rows, err := db.Query(query)
  if err != nil {
    c.String(http.StatusInternalServerError, "query error")
    return
  }
  defer rows.Close()
  c.String(http.StatusOK, "vulnerable path executed")
}

func fixedHandler(c *gin.Context) {
  id := c.Param("id")
  // Fixed: parameterized query
  query := "SELECT id, name FROM users WHERE id = $1"

  rows, err := db.Query(query, id)
  if err != nil {
    c.String(http.StatusInternalServerError, "query error")
    return
  }
  defer rows.Close()
  c.String(http.StatusOK, "fixed path executed")
}

CVE References

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