rudder-server vulnerable to SQL Injection
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.
| Package | Affected versions | Patched versions |
|---|---|---|
github.com/rudderlabs/rudder-serverGo | < 1.3.0-rc.1 | 1.3.0-rc.1 |
Affected products
1- Range: < 1.3.0-rc.1
Patches
30d061ff2d8c1fix: always use a sql safe table name in failed events manager (#2664)
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), `"`, `""`) + `"` +}
9c009d9775abfix: properly escape table name when querying for failed events (#2663)
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)
2f956b7eb3d5fix: changed query to accept user input in prepared sql statement (#2652)
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- github.com/advisories/GHSA-3jmm-f6jj-rcc3ghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2023-30625ghsaADVISORY
- securitylab.github.com/advisories/GHSL-2022-097_rudder-serverghsaADVISORY
- packetstormsecurity.com/files/173837/Rudder-Server-SQL-Injection-Remote-Code-Execution.htmlghsaWEB
- github.com/rudderlabs/rudder-server/commit/0d061ff2d8c16845179d215bf8012afceba12a30ghsax_refsource_MISCWEB
- github.com/rudderlabs/rudder-server/commit/2f956b7eb3d5eb2de3e79d7df2c87405af25071eghsax_refsource_MISCWEB
- github.com/rudderlabs/rudder-server/commit/9c009d9775abc99e72fc470f4c4c8e8f1775e82aghsax_refsource_MISCWEB
- github.com/rudderlabs/rudder-server/pull/2652ghsax_refsource_MISCWEB
- github.com/rudderlabs/rudder-server/pull/2663ghsax_refsource_MISCWEB
- github.com/rudderlabs/rudder-server/pull/2664ghsax_refsource_MISCWEB
- securitylab.github.com/advisoriesghsaWEB
- securitylab.github.com/advisories/GHSL-2022-097_rudder-server/mitrex_refsource_CONFIRM
News mentions
0No linked articles in our index yet.