mirror of
https://github.com/its-a-feature/Mythic
synced 2026-06-08 14:55:38 +00:00
fixed an issue with database connection exhaustion on errors
This commit is contained in:
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [3.4.33] - 2026-04-10
|
||||
|
||||
### Changed
|
||||
|
||||
- Fixed an issue where payload/command syncing would error out and leave dangling database connections
|
||||
- Updated the postgres docker image to use customized database info for health checks
|
||||
|
||||
## [3.4.32] - 2026-04-06
|
||||
|
||||
### Changed
|
||||
|
||||
@@ -251,6 +251,7 @@ func updateC2Parameters(in C2SyncMessage, c2Profile databaseStructs.C2profile) e
|
||||
logging.LogError(err, "Failed to fetch c2 parameters for c2 profile when syncing")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
found := false
|
||||
if err = rows.StructScan(&databaseParameter); err != nil {
|
||||
|
||||
@@ -78,6 +78,7 @@ func MythicRPCArtifactSearch(input MythicRPCArtifactSearchMessage) MythicRPCArti
|
||||
response.Error = err.Error()
|
||||
return response
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
result := MythicRPCArtifactSearchArtifactData{}
|
||||
searchResult := databaseStructs.Taskartifact{}
|
||||
|
||||
@@ -66,6 +66,7 @@ func MythicRPCCallbackEdgeSearch(input MythicRPCCallbackEdgeSearchMessage) Mythi
|
||||
return response
|
||||
}
|
||||
searchResults := databaseStructs.Callbackgraphedge{}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
result := MythicRPCCallbackEdgeSearchMessageResult{}
|
||||
err = rows.StructScan(&searchResults)
|
||||
|
||||
@@ -181,6 +181,7 @@ func MythicRPCCallbackSearch(input MythicRPCCallbackSearchMessage) MythicRPCCall
|
||||
response.Error = err.Error()
|
||||
return response
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
result := MythicRPCCallbackSearchMessageResult{}
|
||||
err = rows.StructScan(&searchResults)
|
||||
|
||||
@@ -137,6 +137,7 @@ func MythicRPCCustomBrowserSearch(input MythicRPCCustomBrowserSearchMessage) Myt
|
||||
response.Error = err.Error()
|
||||
return response
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
searchResult := databaseStructs.MythicTree{}
|
||||
err = rows.StructScan(&searchResult)
|
||||
|
||||
@@ -151,6 +151,7 @@ func associateBuildParametersWithPayload(databasePayload databaseStructs.Payload
|
||||
logging.LogError(err, "Failed to get build parameters from database when trying to build payload")
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
err = rows.StructScan(&databaseBuildParameter)
|
||||
if err != nil {
|
||||
@@ -298,6 +299,7 @@ func associateC2ProfilesWithPayload(databasePayload databaseStructs.Payload, c2P
|
||||
logging.LogError(err, "Failed to get c2 parameters from database when trying to build payload")
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
err = rows.StructScan(&databaseC2ProfileParameter)
|
||||
if err != nil {
|
||||
|
||||
@@ -110,6 +110,7 @@ func MythicRPCProcessSearch(input MythicRPCProcessSearchMessage) MythicRPCProces
|
||||
response.Error = err.Error()
|
||||
return response
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
searchResult := databaseStructs.MythicTree{}
|
||||
if err = rows.StructScan(&searchResult); err != nil {
|
||||
|
||||
@@ -157,6 +157,7 @@ func updateLoadedCommandsFromPayloadBuild(databasePayload databaseStructs.Payloa
|
||||
logging.LogError(err, "Failed to get payload commands when trying to update loaded commands for payload build response")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&databasePayloadCommand); err != nil {
|
||||
logging.LogError(err, "Failed to get row from payloadcommand when trying to process payload build response")
|
||||
|
||||
@@ -479,6 +479,7 @@ func updatePayloadTypeBuildParameters(in PayloadTypeSyncMessage, payloadtype dat
|
||||
logging.LogError(err, "Failed to fetch build parameters for payloadtype when syncing")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
found := false
|
||||
if err = rows.StructScan(&databaseParameter); err != nil {
|
||||
@@ -624,6 +625,7 @@ func updatePayloadTypeC2Profiles(in PayloadTypeSyncMessage, payloadtype database
|
||||
logging.LogError(err, "Failed to get payloadtypec2profile from database")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&databaseC2Profile); err != nil {
|
||||
logging.LogError(err, "Failed to get row from payloadtypec2profile")
|
||||
@@ -684,6 +686,7 @@ func updatePayloadTypeWrappers(in PayloadTypeSyncMessage, payloadtype databaseSt
|
||||
logging.LogError(err, "Failed to get wrappedpayloadtypes from database")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&databaseWrapper); err != nil {
|
||||
logging.LogError(err, "Failed to get row from wrappedpayloadtypes for importing new payloadtype")
|
||||
@@ -715,6 +718,7 @@ func updatePayloadTypeWrappers(in PayloadTypeSyncMessage, payloadtype databaseSt
|
||||
logging.LogError(err, "Failed to get wrappedpayloadtypes from database")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&databaseWrapper); err != nil {
|
||||
logging.LogError(err, "Failed to get row from wrappedpayloadtypes for importing new payloadtype")
|
||||
@@ -815,6 +819,7 @@ func updatePayloadTypeCommands(in PayloadTypeSyncMessage, payloadtype databaseSt
|
||||
logging.LogError(err, "Failed to fetch commands for payloadtype when syncing")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&databaseCommand); err != nil {
|
||||
logging.LogError(err, "Failed to parse command into structure when syncing payloadtype")
|
||||
@@ -981,6 +986,7 @@ func updatePayloadTypeCommandParameters(in PayloadTypeSyncMessage, payloadtype d
|
||||
logging.LogError(err, "Failed to fetch command parameters for command when syning")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&databaseParameter); err != nil {
|
||||
logging.LogError(err, "Failed to parse commandparameter into structure when syncing command")
|
||||
@@ -1142,6 +1148,7 @@ func updatePayloadTypeCommandBrowserScripts(in PayloadTypeSyncMessage, syncComma
|
||||
return err
|
||||
} else {
|
||||
found := false
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&databaseBrowserScript); err != nil {
|
||||
logging.LogError(err, "Failed to parse browserscript into structure when syncing command")
|
||||
@@ -1212,6 +1219,7 @@ func addBrowserScriptToAllOperators(browserscript databaseStructs.Browserscript)
|
||||
logging.LogError(err, "Failed to get operators")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&operator); err != nil {
|
||||
logging.LogError(err, "Failed to parse operator into structure")
|
||||
@@ -1241,6 +1249,7 @@ func updateBrowserScriptForAllOperators(browserscript databaseStructs.Browserscr
|
||||
logging.LogError(err, "Failed to get operators")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&operatorScript); err != nil {
|
||||
logging.LogError(err, "Failed to parse browserscript into structure for updating scripts")
|
||||
@@ -1278,6 +1287,7 @@ func removeBrowserScriptFromAllOperators(browserscript databaseStructs.Browsersc
|
||||
logging.LogError(err, "Failed to get browserscripts for command", "command", browserscript.CommandID)
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&operatorScript); err != nil {
|
||||
logging.LogError(err, "Failed to parse operator into structure")
|
||||
@@ -1307,6 +1317,7 @@ func updatePayloadTypeCommandMitreAttack(in PayloadTypeSyncMessage, syncCommand
|
||||
logging.LogError(err, "Failed to get attackcommand from database")
|
||||
return err
|
||||
} else {
|
||||
defer rows.Close()
|
||||
for rows.Next() {
|
||||
if err = rows.StructScan(&databaseMitreAttack); err != nil {
|
||||
logging.LogError(err, "Failed to parse mitre att&ck into structure")
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
const mythicServerVersion = "3.4.32"
|
||||
const mythicServerVersion = "3.4.33"
|
||||
|
||||
type Config struct {
|
||||
// server configuration
|
||||
|
||||
Reference in New Issue
Block a user