VYPR
Critical severityNVD Advisory· Published Jun 16, 2023· Updated Feb 13, 2025

rudder-server vulnerable to SQL Injection

CVE-2023-30625

Description

rudder-server is part of RudderStack, an open source Customer Data Platform (CDP). Versions of rudder-server prior to 1.3.0-rc.1 are vulnerable to SQL injection. This issue may lead to Remote Code Execution (RCE) due to the rudder role in PostgresSQL having superuser permissions by default. Version 1.3.0-rc.1 contains patches for this issue.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
github.com/rudderlabs/rudder-serverGo
< 1.3.0-rc.11.3.0-rc.1

Affected products

1

Patches

3
0d061ff2d8c1

fix: always use a sql safe table name in failed events manager (#2664)

https://github.com/rudderlabs/rudder-serverAris TzoumasNov 7, 2022via ghsa
1 file changed · +7 3
  • router/failed-events-manager.go+7 3 modified
    @@ -56,7 +56,7 @@ func (*FailedEventsManagerT) SaveFailedRecordIDs(taskRunIDFailedEventsMap map[st
     	}
     
     	for taskRunID, failedEvents := range taskRunIDFailedEventsMap {
    -		table := `"` + strings.ReplaceAll(fmt.Sprintf(`%s_%s`, failedKeysTablePrefix, taskRunID), `"`, `""`) + `"`
    +		table := getSqlSafeTablename(taskRunID)
     		sqlStatement := fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s (
     		destination_id TEXT NOT NULL,
     		record_id JSONB NOT NULL,
    @@ -94,7 +94,7 @@ func (fem *FailedEventsManagerT) DropFailedRecordIDs(taskRunID string) {
     	}
     
     	// Drop table
    -	table := fmt.Sprintf(`%s_%s`, failedKeysTablePrefix, taskRunID)
    +	table := getSqlSafeTablename(taskRunID)
     	sqlStatement := fmt.Sprintf(`DROP TABLE IF EXISTS %s`, table)
     	_, err := fem.dbHandle.Exec(sqlStatement)
     	if err != nil {
    @@ -111,7 +111,7 @@ func (fem *FailedEventsManagerT) FetchFailedRecordIDs(taskRunID string) []*Faile
     
     	var rows *sql.Rows
     	var err error
    -	table := `"` + strings.ReplaceAll(fmt.Sprintf(`%s_%s`, failedKeysTablePrefix, taskRunID), `"`, `""`) + `"`
    +	table := getSqlSafeTablename(taskRunID)
     	sqlStatement := fmt.Sprintf(`SELECT %[1]s.destination_id, %[1]s.record_id
                                                  FROM %[1]s `, table)
     	rows, err = fem.dbHandle.Query(sqlStatement)
    @@ -188,3 +188,7 @@ func CleanFailedRecordsTableProcess(ctx context.Context) {
     func (fem *FailedEventsManagerT) GetDBHandle() *sql.DB {
     	return fem.dbHandle
     }
    +
    +func getSqlSafeTablename(taskRunID string) string {
    +	return `"` + strings.ReplaceAll(fmt.Sprintf(`%s_%s`, failedKeysTablePrefix, taskRunID), `"`, `""`) + `"`
    +}
    
9c009d9775ab

fix: properly escape table name when querying for failed events (#2663)

https://github.com/rudderlabs/rudder-serverAris TzoumasNov 7, 2022via ghsa
1 file changed · +3 2
  • router/failed-events-manager.go+3 2 modified
    @@ -5,6 +5,7 @@ import (
     	"database/sql"
     	"encoding/json"
     	"fmt"
    +	"strings"
     	"time"
     
     	"github.com/rudderlabs/rudder-server/utils/misc"
    @@ -55,7 +56,7 @@ func (*FailedEventsManagerT) SaveFailedRecordIDs(taskRunIDFailedEventsMap map[st
     	}
     
     	for taskRunID, failedEvents := range taskRunIDFailedEventsMap {
    -		table := fmt.Sprintf(`%s_%s`, failedKeysTablePrefix, taskRunID)
    +		table := `"` + strings.ReplaceAll(fmt.Sprintf(`%s_%s`, failedKeysTablePrefix, taskRunID), `"`, `""`) + `"`
     		sqlStatement := fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s (
     		destination_id TEXT NOT NULL,
     		record_id JSONB NOT NULL,
    @@ -110,7 +111,7 @@ func (fem *FailedEventsManagerT) FetchFailedRecordIDs(taskRunID string) []*Faile
     
     	var rows *sql.Rows
     	var err error
    -	table := fmt.Sprintf(`%s_%s`, failedKeysTablePrefix, taskRunID)
    +	table := `"` + strings.ReplaceAll(fmt.Sprintf(`%s_%s`, failedKeysTablePrefix, taskRunID), `"`, `""`) + `"`
     	sqlStatement := fmt.Sprintf(`SELECT %[1]s.destination_id, %[1]s.record_id
                                                  FROM %[1]s `, table)
     	rows, err = fem.dbHandle.Query(sqlStatement)
    
2f956b7eb3d5

fix: changed query to accept user input in prepared sql statement (#2652)

https://github.com/rudderlabs/rudder-serverDeepak RaiNov 4, 2022via ghsa
1 file changed · +8 11
  • warehouse/warehouse.go+8 11 modified
    @@ -1794,6 +1794,7 @@ func pendingEventsHandler(w http.ResponseWriter, r *http.Request) {
     }
     
     func getPendingStagingFileCount(sourceOrDestId string, isSourceId bool) (fileCount int64, err error) {
    +	sourceOrDestId = pq.QuoteIdentifier(sourceOrDestId)
     	sourceOrDestColumn := ""
     	if isSourceId {
     		sourceOrDestColumn = "source_id"
    @@ -1807,16 +1808,14 @@ func getPendingStagingFileCount(sourceOrDestId string, isSourceId bool) (fileCou
     		FROM
     		  %[1]s
     		WHERE
    -		  %[1]s.%[3]s = '%[2]s';
    +		  %[2]s = $1;
     `,
     		warehouseutils.WarehouseUploadsTable,
    -		sourceOrDestId,
     		sourceOrDestColumn,
     	)
    -
    -	err = dbHandle.QueryRow(sqlStatement).Scan(&lastStagingFileIDRes)
    +	err = dbHandle.QueryRow(sqlStatement, sourceOrDestId).Scan(&lastStagingFileIDRes)
     	if err != nil && err != sql.ErrNoRows {
    -		err = fmt.Errorf("query: %s failed with Error : %w", sqlStatement, err)
    +		err = fmt.Errorf("query: %s run failed with Error : %w", sqlStatement, err)
     		return
     	}
     	lastStagingFileID := int64(0)
    @@ -1830,18 +1829,16 @@ func getPendingStagingFileCount(sourceOrDestId string, isSourceId bool) (fileCou
     		FROM
     		  %[1]s
     		WHERE
    -		  %[1]s.id > %[2]v
    -		  AND %[1]s.%[4]s = '%[3]s';
    +		  id > %[2]v
    +		  AND %[3]s = $1;
     `,
     		warehouseutils.WarehouseStagingFilesTable,
     		lastStagingFileID,
    -		sourceOrDestId,
     		sourceOrDestColumn,
     	)
    -
    -	err = dbHandle.QueryRow(sqlStatement).Scan(&fileCount)
    +	err = dbHandle.QueryRow(sqlStatement, sourceOrDestId).Scan(&fileCount)
     	if err != nil && err != sql.ErrNoRows {
    -		err = fmt.Errorf("query: %s failed with Error : %w", sqlStatement, err)
    +		err = fmt.Errorf("query: %s run failed with Error : %w", sqlStatement, err)
     		return
     	}
     
    

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

12

News mentions

0

No linked articles in our index yet.