Skip to content

Commit e1703ad

Browse files
authored
auparse - Check socket address size (#152)
In auparse.parseSockaddr(), check socket address size before indexing into the slice to prevent panics. Return an error detailing the failure. Add a Go fuzz test to exercise the parseSockaddr() function.
1 parent 5216c76 commit e1703ad

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
99

1010
### Changed
1111

12+
- Fix panic in `parseSockaddr` for malformed socket address. [#152](https://github.com/elastic/go-libaudit/pull/152)
13+
1214
### Removed
1315

1416
### Deprecated

auparse/sockaddr.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,28 @@
1818
package auparse
1919

2020
import (
21+
"fmt"
2122
"strconv"
2223
)
2324

25+
// invalidSockAddrError means socket address size for family is invalid.
26+
type invalidSockAddrError struct {
27+
family string
28+
size int
29+
}
30+
31+
func (e invalidSockAddrError) Error() string {
32+
if e.size < 4 {
33+
return fmt.Sprintf("invalid family: too short: %d", e.size)
34+
}
35+
return fmt.Sprintf("invalid socket address size family=%s: %d", e.family, e.size)
36+
}
37+
2438
func parseSockaddr(s string) (map[string]string, error) {
39+
if len(s) < 4 {
40+
return nil, invalidSockAddrError{size: len(s)}
41+
}
42+
2543
addressFamily, err := hexToDec(s[2:4] + s[0:2]) // host-order
2644
if err != nil {
2745
return nil, err
@@ -38,6 +56,13 @@ func parseSockaddr(s string) (map[string]string, error) {
3856
out["family"] = "unix"
3957
out["path"] = socket
4058
case 2: // AF_INET
59+
if len(s) < 16 {
60+
return nil, invalidSockAddrError{
61+
family: "ipv4",
62+
size: len(s),
63+
}
64+
}
65+
4166
port, err := hexToDec(s[4:8])
4267
if err != nil {
4368
return nil, err
@@ -52,6 +77,13 @@ func parseSockaddr(s string) (map[string]string, error) {
5277
out["addr"] = ip
5378
out["port"] = strconv.Itoa(int(port))
5479
case 10: // AF_INET6
80+
if len(s) < 48 {
81+
return nil, invalidSockAddrError{
82+
family: "ipv6",
83+
size: len(s),
84+
}
85+
}
86+
5587
port, err := hexToDec(s[4:8])
5688
if err != nil {
5789
return nil, err

auparse/sockaddr_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,20 @@ func TestParseSockaddr(t *testing.T) {
5656
assert.Equal(t, tc.data, data)
5757
}
5858
}
59+
60+
func FuzzParseSockaddr(f *testing.F) {
61+
corpus := []string{
62+
"02000050080808080000000000000000",
63+
"0A000050000000002607F8B0400C0C06000000000000006700000000",
64+
"01007075626C69632F7069636B75700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
65+
"0A00084300000000000000000000000000000000000000000000000000000000281E7423FD7F0000C05034088F7F000007000000000000001E2D440000000000000000000000000060D758078F7F00000300000000000000C00F020000000000000000000000000005202302000000000200000000000000FFFFFFFFFFFFFFFF",
66+
}
67+
68+
for _, seed := range corpus {
69+
f.Add(seed)
70+
}
71+
72+
f.Fuzz(func(t *testing.T, saddr string) {
73+
_, _ = parseSockaddr(saddr) // Fuzz for panics
74+
})
75+
}

0 commit comments

Comments
 (0)