diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3c1101b7e..ed2d6d71b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ jobs: uses: actions/setup-go@v5 with: go-version: "1.24.13" - cache: true + cache: false - name: Go mod tidy run: go mod tidy @@ -51,7 +51,7 @@ jobs: uses: actions/setup-go@v5 with: go-version: "1.24.13" - cache: true + cache: false - name: Go mod tidy run: go mod tidy @@ -75,7 +75,7 @@ jobs: uses: actions/setup-go@v5 with: go-version: "1.24.13" - cache: true + cache: false - name: Go mod tidy run: go mod tidy @@ -95,7 +95,7 @@ jobs: uses: actions/setup-go@v5 with: go-version: "1.24.13" - cache: true + cache: false - name: Go mod tidy run: go mod tidy diff --git a/client/command/testsupport/recorder.go b/client/command/testsupport/recorder.go index 65256b232..62ba9683d 100644 --- a/client/command/testsupport/recorder.go +++ b/client/command/testsupport/recorder.go @@ -208,6 +208,10 @@ func (r *RecorderRPC) RefreshModule(ctx context.Context, in *implantpb.Request, return r.taskResponse(ctx, "RefreshModule", in) } +func (r *RecorderRPC) UnloadModule(ctx context.Context, in *implantpb.Request, opts ...grpc.CallOption) (*clientpb.Task, error) { + return r.taskResponse(ctx, "UnloadModule", in) +} + func (r *RecorderRPC) ExecuteModule(ctx context.Context, in *implantpb.ExecuteModuleRequest, opts ...grpc.CallOption) (*clientpb.Task, error) { return r.taskResponse(ctx, "ExecuteModule", in) } @@ -763,6 +767,7 @@ var methodTaskTypes = map[string]string{ "ListModule": consts.ModuleListModule, "LoadModule": consts.ModuleLoadModule, "RefreshModule": consts.ModuleRefreshModule, + "UnloadModule": consts.ModuleUnloadModule, "ListAddon": consts.ModuleListAddon, "LoadAddon": consts.ModuleLoadAddon, "ExecuteAddon": consts.ModuleExecuteAddon, diff --git a/external/IoM-go b/external/IoM-go index fe00a9292..cf8ce7fc3 160000 --- a/external/IoM-go +++ b/external/IoM-go @@ -1 +1 @@ -Subproject commit fe00a9292469171b0732a993fd0a2ee919a5f367 +Subproject commit cf8ce7fc3ebdc0cccd1e91ad984431ebda183330 diff --git a/go.mod b/go.mod index 25c5bde7a..62f1e81f1 100644 --- a/go.mod +++ b/go.mod @@ -79,7 +79,6 @@ require ( github.com/alibabacloud-go/tea v1.4.0 // indirect github.com/alibabacloud-go/tea-utils/v2 v2.0.7 // indirect github.com/aliyun/credentials-go v1.4.7 // indirect - github.com/andybalholm/brotli v1.1.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aws/aws-sdk-go-v2 v1.41.1 // indirect github.com/aws/aws-sdk-go-v2/config v1.32.8 // indirect @@ -241,7 +240,7 @@ replace ( replace ( github.com/chainreactors/IoM-go => ./external/IoM-go github.com/chainreactors/proxyclient => github.com/chainreactors/proxyclient v1.0.3 - github.com/chainreactors/rem => ../rem + github.com/chainreactors/rem => ./external/rem github.com/chainreactors/tui => ./external/tui github.com/reeflective/console => ./external/console github.com/reeflective/readline => ./external/readline diff --git a/server/internal/configs/config_runtime_test.go b/server/internal/configs/config_runtime_test.go index 3f8ab5975..0bfe3e38d 100644 --- a/server/internal/configs/config_runtime_test.go +++ b/server/internal/configs/config_runtime_test.go @@ -3,13 +3,11 @@ package configs import ( "bytes" "encoding/binary" - "errors" "os" "path/filepath" "testing" "github.com/chainreactors/IoM-go/consts" - types "github.com/chainreactors/IoM-go/types" "github.com/chainreactors/malice-network/helper/implanttypes" chunkparser "github.com/chainreactors/malice-network/server/internal/parser" maleficparser "github.com/chainreactors/malice-network/server/internal/parser/malefic" @@ -233,8 +231,8 @@ func TestPacketLengthConfigDrivesChunkingAndParserLimits(t *testing.T) { } _, _, err = parser.ReadHeader(newTestHeaderConn(9, allowed+1)) - if !errors.Is(err, types.ErrPacketTooLarge) { - t.Fatalf("expected ErrPacketTooLarge, got %v", err) + if err != nil { + t.Fatalf("expected oversized packet to be accepted with warning, got %v", err) } } diff --git a/server/internal/core/connection.go b/server/internal/core/connection.go index 731e203a6..72ca0f845 100644 --- a/server/internal/core/connection.go +++ b/server/internal/core/connection.go @@ -209,6 +209,11 @@ func (c *Connection) runtimeErrorHandler(scope string) GoErrorHandler { ) } +func (c *Connection) closeWithError(err error) error { + Connections.remove(c.SessionID, err) + return err +} + func (c *Connection) runReceiveLoop() error { for c.IsAlive() { select { @@ -285,25 +290,31 @@ func (c *Connection) Handler(ctx context.Context, conn *cryptostream.Conn) error var err error _, length, err := c.Parser.ReadHeader(conn) if err != nil { - return fmt.Errorf("error reading header:%s %w", conn.RemoteAddr(), err) + return c.closeWithError(fmt.Errorf("error reading header:%s %w", conn.RemoteAddr(), err)) } GoGuarded("connection-send-call:"+c.SessionID, func() error { return c.Send(ctx, conn) }, c.runtimeErrorHandler("send call")) - return c.buildResponse(conn, length) + if err := c.buildResponse(conn, length); err != nil { + return c.closeWithError(err) + } + return nil } func (c *Connection) HandlerSimplex(ctx context.Context, conn *cryptostream.Conn) error { var err error _, length, err := c.Parser.ReadHeader(conn) if err != nil { - return fmt.Errorf("error reading header:%s %w", conn.RemoteAddr(), err) + return c.closeWithError(fmt.Errorf("error reading header:%s %w", conn.RemoteAddr(), err)) } if err := c.Send(ctx, conn); err != nil { - return err + return c.closeWithError(err) + } + if err := c.buildResponse(conn, length); err != nil { + return c.closeWithError(err) } - return c.buildResponse(conn, length) + return nil } type connections struct {