File tree Expand file tree Collapse file tree 3 files changed +51
-0
lines changed
Expand file tree Collapse file tree 3 files changed +51
-0
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change 1818package auparse
1919
2020import (
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+
2438func 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
Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments