Skip to content

Commit bc5ffe6

Browse files
committed
appsec: grpc: remove MonitoringError and fix user blocking
Signed-off-by: Eliott Bouhana <[email protected]>
1 parent 7912a70 commit bc5ffe6

File tree

3 files changed

+12
-42
lines changed

3 files changed

+12
-42
lines changed

Diff for: contrib/google.golang.org/grpc/appsec.go

+11-9
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package grpc
77

88
import (
99
"context"
10-
1110
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace"
1211
"gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo"
1312
"gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/grpcsec"
@@ -62,11 +61,13 @@ func appsecUnaryHandlerMiddleware(method string, span ddtrace.Span, handler grpc
6261
return nil, err
6362
}
6463
defer grpcsec.StartReceiveOperation(types.ReceiveOperationArgs{}, op).Finish(types.ReceiveOperationRes{Message: req})
65-
rv, err := handler(ctx, req)
66-
if e, ok := err.(*types.MonitoringError); ok {
67-
err = status.Error(codes.Code(e.GRPCStatus()), e.Error())
64+
65+
rv, downstreamErr := handler(ctx, req)
66+
if blocked {
67+
return nil, err
6868
}
69-
return rv, err
69+
70+
return rv, downstreamErr
7071
}
7172
}
7273

@@ -113,11 +114,12 @@ func appsecStreamHandlerMiddleware(method string, span ddtrace.Span, handler grp
113114
return err
114115
}
115116

116-
err = handler(srv, stream)
117-
if e, ok := err.(*types.MonitoringError); ok {
118-
err = status.Error(codes.Code(e.GRPCStatus()), e.Error())
117+
downstreamErr := handler(srv, stream)
118+
if blocked {
119+
return err
119120
}
120-
return err
121+
122+
return downstreamErr
121123
}
122124
}
123125

Diff for: internal/appsec/emitter/grpcsec/types/types.go

-25
Original file line numberDiff line numberDiff line change
@@ -72,33 +72,8 @@ type (
7272
// Corresponds to the address `grpc.server.request.message`.
7373
Message interface{}
7474
}
75-
76-
// MonitoringError is used to vehicle a gRPC error that also embeds a request status code
77-
MonitoringError struct {
78-
msg string
79-
status uint32
80-
}
8175
)
8276

83-
// NewMonitoringError creates and returns a new gRPC monitoring error, wrapped under
84-
// sharedesec.MonitoringError
85-
func NewMonitoringError(msg string, code uint32) error {
86-
return &MonitoringError{
87-
msg: msg,
88-
status: code,
89-
}
90-
}
91-
92-
// GRPCStatus returns the gRPC status code embedded in the error
93-
func (e *MonitoringError) GRPCStatus() uint32 {
94-
return e.status
95-
}
96-
97-
// Error implements the error interface
98-
func (e *MonitoringError) Error() string {
99-
return e.msg
100-
}
101-
10277
// Finish the gRPC handler operation, along with the given results, and emit a
10378
// finish event up in the operation stack.
10479
func (op *HandlerOperation) Finish(res HandlerOperationRes) []any {

Diff for: internal/appsec/listener/grpcsec/grpc.go

+1-8
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,7 @@ func (l *wafEventListener) onEvent(op *types.HandlerOperation, handlerArgs types
120120
}
121121
wafResult := shared.RunWAF(wafCtx, waf.RunAddressData{Persistent: values})
122122
if wafResult.HasActions() || wafResult.HasEvents() {
123-
for aType, params := range wafResult.Actions {
124-
for _, action := range shared.ActionsFromEntry(aType, params) {
125-
if grpcAction, ok := action.(*sharedsec.GRPCAction); ok {
126-
code, err := grpcAction.GRPCWrapper(map[string][]string{})
127-
dyngo.EmitData(userIDOp, types.NewMonitoringError(err.Error(), code))
128-
}
129-
}
130-
}
123+
shared.ProcessActions(userIDOp, wafResult.Actions)
131124
shared.AddSecurityEvents(&op.SecurityEventsHolder, l.limiter, wafResult.Events)
132125
log.Debug("appsec: WAF detected an authenticated user attack: %s", args.UserID)
133126
}

0 commit comments

Comments
 (0)