Skip to content

Commit

Permalink
Add tests for sock and skb with arg matchers
Browse files Browse the repository at this point in the history
Add a sock test that matches on a TCP connection to 127.0.0.1:2112 and
a skb test that matches on a UDP connection to 127.0.0.1:53.

Signed-off-by: Kevin Sheldrake <kevin.sheldrake@isovalent.com>
  • Loading branch information
kevsecurity committed May 23, 2023
1 parent 4fc4a2e commit 98ff038
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 0 deletions.
1 change: 1 addition & 0 deletions docs/content/en/docs/reference/grpc-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ https://github.com/opencontainers/runtime-spec/blob/main/config.md#createcontain
| proto | [uint32](#uint32) | | |
| sec_path_len | [uint32](#uint32) | | |
| sec_path_olen | [uint32](#uint32) | | |
| protocol | [string](#string) | | |

<a name="tetragon-KprobeSock"></a>

Expand Down
134 changes: 134 additions & 0 deletions pkg/sensors/tracing/kprobe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"context"
"errors"
"fmt"
"net"
"os"
"os/exec"
"os/signal"
Expand Down Expand Up @@ -3396,3 +3397,136 @@ spec:
checker := ec.NewUnorderedEventChecker(kpChecker)
testMaxData(t, data, checker, writeHook, fd2)
}

func TestKprobeSock(t *testing.T) {
var doneWG, readyWG sync.WaitGroup
defer doneWG.Wait()

ctx, cancel := context.WithTimeout(context.Background(), tus.Conf().CmdWaitTime)
defer cancel()

hook := `apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: "tcp-connect"
spec:
kprobes:
- call: "tcp_connect"
syscall: false
args:
- index: 0
type: "sock"
selectors:
- matchArgs:
- index: 0
operator: "DAddr"
values:
- "127.0.0.1"
- index: 0
operator: "DPort"
values:
- "2112"
- index: 0
operator: "Protocol"
values:
- "IPPROTO_TCP"
`
createCrdFile(t, hook)

obs, err := observer.GetDefaultObserverWithFile(t, ctx, testConfigFile, tus.Conf().TetragonLib)
if err != nil {
t.Fatalf("GetDefaultObserverWithFile error: %s", err)
}
observer.LoopEvents(ctx, t, &doneWG, &readyWG, obs)
readyWG.Wait()

addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:2112")
assert.NoError(t, err)
conn, err := net.DialTCP("tcp", nil, addr)
assert.NoError(t, err)
conn.Close()

kpChecker := ec.NewProcessKprobeChecker("tcp-connect-checker").
WithFunctionName(sm.Full("tcp_connect")).
WithArgs(ec.NewKprobeArgumentListMatcher().
WithValues(
ec.NewKprobeArgumentChecker().WithSockArg(ec.NewKprobeSockChecker().
WithDaddr(sm.Full("127.0.0.1")).
WithDport(2112).
WithProtocol(sm.Full("IPPROTO_TCP")),
),
))

checker := ec.NewUnorderedEventChecker(kpChecker)

err = jsonchecker.JsonTestCheck(t, checker)
assert.NoError(t, err)
}

func TestKprobeSkb(t *testing.T) {
var doneWG, readyWG sync.WaitGroup
defer doneWG.Wait()

ctx, cancel := context.WithTimeout(context.Background(), tus.Conf().CmdWaitTime)
defer cancel()

hook := `apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
name: "datagram"
spec:
kprobes:
- call: "__cgroup_bpf_run_filter_skb"
syscall: false
args:
- index: 1
type: "skb"
selectors:
- matchArgs:
- index: 1
operator: "DAddr"
values:
- "127.0.0.1"
- index: 1
operator: "DPort"
values:
- "53"
- index: 1
operator: "Protocol"
values:
- "IPPROTO_UDP"
`
createCrdFile(t, hook)

obs, err := observer.GetDefaultObserverWithFile(t, ctx, testConfigFile, tus.Conf().TetragonLib)
if err != nil {
t.Fatalf("GetDefaultObserverWithFile error: %s", err)
}
observer.LoopEvents(ctx, t, &doneWG, &readyWG, obs)
readyWG.Wait()

res := &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
dial := net.Dialer{}
return dial.Dial("udp", "127.0.0.1:53")
},
}
res.LookupIP(context.Background(), "ip4", "ebpf.io")

kpChecker := ec.NewProcessKprobeChecker("datagram-checker").
WithFunctionName(sm.Full("__cgroup_bpf_run_filter_skb")).
WithArgs(ec.NewKprobeArgumentListMatcher().
WithValues(
ec.NewKprobeArgumentChecker().WithSkbArg(ec.NewKprobeSkbChecker().
WithDaddr(sm.Full("127.0.0.1")).
WithDport(53).
WithProtocol(sm.Full("IPPROTO_UDP")),
),
))

checker := ec.NewUnorderedEventChecker(kpChecker)

err = jsonchecker.JsonTestCheck(t, checker)
assert.NoError(t, err)
}

0 comments on commit 98ff038

Please sign in to comment.